实战|车辆追踪:YOLO对比SVM+HOG 耗时更短 处理更精确(附github资源)
介绍
Udacity的自动驾驶汽车纳米级的车辆检测和跟踪项目是应用传统的计算机视觉技术,诸如有向梯度(HOG)和其它联合滑动窗口的特征来跟踪视频中的车辆。 理想的解决方案是可以实时跟踪,即速度> 30FPS。 我使用的解决方案是Dalal和Triggs在2005年提出的使用线性SVM 的方法,在i7处理器上处理视频时速度仅仅只有3FPS。
应用YOLO到Udacity车辆跟踪项目视频中时取得了很好的检测效果。
为了有趣,我还用YOLO 来通过该项目的视频 ,一种在目标检测时速度极快的卷积神经网络。 如果你正在使用一个快速的GPU(在我的情况下是GTX 1080),视频处理在大约65FPS。是! 这是超过20倍更快,这就是为什么我没有尝试矢量化我的SVM + HOG解决方案。虽然肯定有机会,特别是滑动窗口部分。 我将在下面进一步讨论YOLO的结果。
数据集
我用 KITTI 和 GTI 的数据集,以及与项目仓库额外的数据来进行训练 。 这里只有两个类:“汽车”和“非汽车”。 GTI数据取自视频流。 因此,盲目随机化所有图像并随后分裂成训练和测试集可以提升训练集和测试集之间的相关性。 所以,我简单地拆分每个数据源的最后30%作为验证和测试集。 所有图像(包括具有非正方形高宽比的图像)缩放到64x64像素以进行特征提取。
特征提取
我使用了一个组合来作为特征向量:
• 空间特征,这只是检查的图像块的下采样副本(16×16像素)
• 颜色直方图特征,其捕获每个图像补丁的统计颜色信息。 汽车通常在特征向量的这部分中捕获到非常饱和的颜色。
• 定向梯度直方图(HOG)特征,其捕获每个图像通道的梯度结构并且在不同的照明条件下效果良好。
你可以在这个博客帖子阅读更多有关HOG特征的知识,但这个想法是通过聚集在直方图的图像上的梯度,使特征向量更加对视角和光照的变化具有鲁棒性。这里是“汽车”和“非汽车”图像HOG特征的可视化。
HOG 特征:左边第一列:训练数据的典型例子和她们在HLS颜色空间上的通道。最右边三列:每一个通道的HOG向量的可视化。
最终特征向量包含以上面引用的三种不同方式提取到的特征。 因此,有必要缩放每个特征以避免特征差异仅仅是由于其值范围处于不同的尺度中。 所以我用 scikit-learn包的 Standard.Scaler 函数来通过去除均值和扩展到单位方差标准化来标准化特征。
训练线性支持向量机
与许多其他分类或检测问题不同是,检测汽车有很强的实时需求。 所以在高精度和速度之间的权衡是不可避免的。 影响性能的两个主要参数是特征向量的长度和用于检测车辆的算法。 线性SVM提供了速度和精度之间的最佳折衷,优于随机森林(快速,但不太准确)和非线性SVM(rbf内核,非常慢)。 最终使用包含6156维的特征向量时的测试精度 高于98.5%,结果听起来不错,但是当你发现剩余1.5%的部分经常出现图像块,特别是在车道线,碰撞障碍和护栏部分。
假阳性:频繁地出现图像库误分类,即使是在98.5%的测试精度的前提下。
滑动窗口
在标准车辆检测方法中,由摄像机记录的帧是通过使用滑动窗口来扫描。 对于每个窗口,计算特征向量并将其馈送到分类器中。 由于汽车出现在不同的距离,还有必要在不同的尺度进行搜索。 通常需要提取超过一百个特征向量,并将其馈送到每个单帧的分类器中。 幸运的是这部分可以向量化(没有被实现)。 下面显示的是正检测的典型示例,以及用于检测汽车的所有大约150个窗口。正如预期的那样,有一些假阳性。
为了滤除误报,我总是跟踪最后30帧的检测到得窗口,并且仅将图像的那些记录了超过15个检测的部分记为阳性。结果是热力图中显著降低了噪声,如下所示:
左:一帧的所有检测到得windows.右:在过去30帧的热力图。
从阈值热力图中,最终的边界框被确定为包含热力图的所有非零值得最小矩形框。
左:一帧图像所有被检测出的窗口。右:最后30帧的热力图。
在阈值热力图中,最终的包围盒是热力图中包含所有非零值的最小包围矩。
左:在有15个检测结果时的二值化热力图。右:绘制边框时的最终的结果。
将整个流程应用于视频,然后在汽车周围绘制边界框,如下所示。
与YOLO比较和结论
自2005年来,上述使用HOG特征和线性SVM的流程是众所周知的。最近出现了非常快的基于神经网络的目标检测器,其效果甚至比实时更快。 我只是复制原来的 darknet 资源库然后应用YOLO到项目的视频中。 我只需要做一个小的代码修改,就可以直接保存视频,结果是相当惊人的。由于没有使用滑动窗口,检测的速度极快。一张图片传递到神经网络中之后,只被精确地处理了一次,因此名称YOLO - “你只看一次”。
整个图像通过网络的前向传播比提取图像块的特征向量和将其传递到SVM更耗时。但是,对于整个图像,这个操作需要完成一次,而在SVM+HOG方法中大约需要150次。为了生成上面的视频,我没有做性能优化,如减少图像或定义感兴趣的区域,甚至专门为汽车训练优化。然而,YOLO比SVM+HOG快20多倍,并且更加准确。检测阈值可以设置为任何置信水平。在这里,我让它取默认的50%,在任何时间没有除了汽车没有任何目标被检测到(好,某次一辆车被认为为一辆卡车)。注意,还有更多的类,如“人”,“手机”,“狗”等。
因此,不仅假阳性率,而且假阴性率非常好,我觉得这非常令人兴奋,并将在单独的项目中进一步检查车辆检测的可能性。这将是非常有趣的。
github:
https://github.com/upul/CarND-Vehicle-Detection
YOLO论文推荐:
https://arxiv.org/abs/1612.08242