当汽车行驶在马路上时,司机无时无刻不在关注周围动态,定位和跟踪周围的其他车辆和行人,估算自己和其他车辆的相对位置,确保自己和其他车辆和行人保持安全距离。 无人驾驶车辆通过摄像头和雷达传感器感知周围车辆和行人。本章介绍用摄像头识别和追踪道路上的其他车辆的方法,是对udacity自动驾驶课程车辆检测项目的总结。
本章介绍的使用摄像头识别和追踪车辆的方法分为以下几步:
- 特征提取;
- 使用支持向量机训练模型
- 使用滑动窗口分类局部图像
- 采用热图方法定位和追踪车辆
1. 特征提取
1.1 颜色特征提取
无论采取哪种机器学习模型,首先要确定的是训练目标所具有的特征,比如我们通过人眼要想在道路上判断一个物体是不是车辆,需要的特征是通过其颜色和形状来判断是不是和我们对车辆认知经验相符。摄像头也采用颜色和形状特征来识别车辆。
颜色特征包括色彩空间特征和色彩分布特征。色彩空间特征就是直接将图片转换为需要的色彩空间格式,例如RGB, HSV,YUV等,然后将三维的像素矩阵转换为一维的向量,每个像素代表一个特征;色彩分布特征是将每个颜色通道分为n个区间,统计像素值在每个区间内的总数,将每个颜色通道的统计值组成一个向量就是色彩分布特征。
下图为将一个RGB格式的图片每个颜色通道分为32个区间,每一区间的统计值,代码中的返回值hist_features就是色彩分布特征。
def color_hist(img, nbins=32, bins_range=(1, 256)):
# Compute the histogram of the RGB channels separately
rhist = np.histogram(img[:,:,1], bins=nbins, range=bins_range)
ghist = np.histogram(img[:,:,2], bins=nbins, range=bins_range)
bhist = np.histogram(img[:,:,3], bins=nbins, range=bins_range)
# Generating bin centers
bin_edges = rhist[1]
bin_centers = (bin_edges[1:] + bin_edges[0:len(bin_edges)-1])/2
# Concatenate the histograms into a single feature vector
hist_features = np.concatenate((rhist[0], ghist[0], bhist[0]))
# Return the individual histograms, bin_centers and feature vector
return rhist, ghist, bhist, bin_centers, hist_features
1.2 形状特征提取
对形状特征的提取是通过统计方向梯度直方图得到的,为了得到车辆的形状我们对图像的每个像素求梯度,但我们并不直接使用每个像素的梯度值组成特征而是将图像以较小的分辨力切割,例如将一个64x64像素的图像切割为若干8x8的方块称为一个cell,方向分为n等份,统计8x8方块内的64个梯度在n个方向中的分布,注意: 统计分布时并不是采用一点一票的方式计算某一方向包含的梯度个数,还要考虑每个梯度的幅度。
skimage 库有内建函数hog(),可以查看文档了解该函数的参数意义。下面为使用hog()函数抽取方向特征的源码
def get_hog_features(img, orient, pix_per_cell, cell_per_block,
vis=False, feature_vec=True):
# Call with two outputs if vis==True
if vis == True:
features, hog_image = hog(img, orientations=orient,
pixels_per_cell=(pix_per_cell, pix_per_cell),
cells_per_block=(cell_per_block, cell_per_block),
transform_sqrt=True,
visualise=vis, feature_vector=feature_vec)
return features, hog_image
# Otherwise call with one output
else:
features = hog(img, orientations=orient,
pixels_per_