介绍
对于Udacity(优达学城)自动驾驶汽车纳米学位的汽车检测和跟踪项目,如果使用传统的计算机可视化技术将是一个挑战,就像方向梯度直方图(Histogram of Oriented Gradients,HOG)和其它特征组合在一起在视频里跟踪汽车一样,理想的解决方案应该是实时运行的,如>30FPS,我曾经使用线性SVM来处理视频,在一台i7 CPU计算机上得到的结果只有可怜的3FPS。最后我使用YOLO来处理视频终于通过了Udacity的项目,YOLO是一个超快的用于对象检测的卷积神经网络,如果你的GPU够快(我当时使用的是GTX 1080),视频处理的速度可以达到65FPS,比我用SVM+HOG的方法足足快20倍。
数据集
我使用了KITTI和GTI数据集,以及来自项目训练仓库的一些其它数据,只有两类数据:有车的和没有车的,GTI数据从视频流获得,因此所有图像都完全是随机的,然后被分为训练和测试数据集,在训练和测试数据集之间建立相关关系,我将每个数据源30%的数据集作为验证和测试数据集,所有图像都被重置为64x64像素的大小,以便于特征的提取。
特征提取
我使用的特征向量如下:
空间特征:除了用于自检的像斑(16x16像素)外啥都没有。
颜色直方图特征:捕获每个像斑的统计颜色信息,通过这种特征向量捕获的汽车颜色通常是非常饱和的。
方向梯度直方图(HOG)特征:捕获每个图像通道的梯度结构,在不同的光线条件下,这种方法表现得还不错。
在这篇博客里有关于HOG特征的详细描述,其思想始终是,在一个直方图里,在一个图像上聚集梯度,让特征向量在不同视角和光线条件下变得更加稳定。下面是HOG特征应用于有车的和没车的图像上时的可视化呈现。
最后一个特征向量包含前面3个不同方法提取的特征,因此有必要对每一个特征进行计量,防止因取值范围不同导致某一特征占主导地位,我使用了scikit学习包中的Standard.Scaler函数,通过移动平均值和按比例缩放到单位方差来标准化特征。
训练一个线性支持向量机
和其它分类和检测问题不同,检测汽车需要强实时,因此,要在高准确性和速度之间取得平衡,影响性能最主要的两个参数是特征向量的长度和汽车检测算法,线性SVM在速度和准确性之间提供了最好的折中方案,比随机森林(快但准确性不够)和非线性SVM(rbf内核,非常慢)的表现要好得多。最后测试时使用了一个包含6156个特征的特征向量,准确性超过了98.5%,但仍然有将近1.5%的像斑时不时的晃眼,特别是车道线、事故故障和栏杆。
滑动窗口
通常情况下,汽车检测和摄像机使用滑动窗口扫描图像一帧一帧记录类似,对每个窗口而言,通过计算特征向量并输入到分类器中,汽车在不同距离出现时,有必要搜索多个尺度,通常会有100多个特征向量需要提取,然后输入到分类器中,对每一帧图像进行处理。下面是正面检测大约150个窗口的例子,不出意外,仍然会有一些失误。
为了过滤掉误判结果,我一直跟着检测窗口直到最后30帧,只考虑被准确识别的图像,最后有超过15次检测被记录下来,我用热图来呈现最终结果,可以看到噪点大大减少,
通过热图的阈值,包含所有非零值的热图最小矩形边界框就可以确定下来。