基于TK1 & Manifold的实时目标检测(HOG-SVM方法)
本文提出了一个基于 TK1 微型处理器的目标检测与识别系统,使用 HOG(histogram of oriented gradient)进行特征提取,SVM(support vector machine) 进行分类。针对不同的目标检测识别的情景下,给出了方案的最优化调整方式。 算法结合 TK1 性能强大的 GPU 模块,准确度与速度在实时条件下都具有良好的 表现,可广泛应用于各类微型机器人以及要求整体体积小、功耗低、实时反应好的情景。
系统总览
本系统包含两大模块,硬件模块与软件模块。硬件模块采用 TK1 嵌入式设备 与摄像头模组;软件模块采用 HOG(histogram of oriented gradient)特征提取算 法,SVM(support vector machine)机器学习分类算法,该算法对于光照变化及对比 度变化有良好的鲁棒性,配合 TK1 中的 CUDA 核心识别速度性能良好。我们提 出的方法将在下文中以识别装甲块的案例中详细介绍。
SVM训练分类器
分类器的训练是为了从一副输入的区域图像中判断其中是否包含目标物体。从训练集样本中提取每张图片的HOG特征,它代表了图像中的梯度水平。Sobel算子用来计算每个像素点的水平和垂直梯度值。我们发现 HOG 特征对于识别有特定纹理的目标有着良好的表现,包括本例中的装甲块,数字,字母,各类标志在现实情景中都是直立面对摄像头,这消除了由于目标旋转及几何失真带来的误差。
1>训练集样本图片预处理
将所有样本图片裁剪为统一尺寸,本例中统一为 80px*80px.
2>计算像素点梯度
使用 Sobel 算子计算处理后的图像梯度。
通过以下公式得出梯度强度值 g 及角度θ。
3>在8*8cell内计算梯度直方图
将图像分成88的cell,将每一个小块作为一个统计单位。每一个cell内包含64个像素,每个像素有强度及角度两个值。角度的取值范围为0至180,将每一个88小块进行统计,最终会得到一个能描述每个小块纹理特征的梯度直方图.
4>Block区域整合
将4个cell整合成一个1616的Block,每个cell根据直方图可得到一个91的向量,一个窗口将包含一个361的向量。取步长为1,将窗口在整个8080的图像上滑动,将得到3699=2916维的特征向量,Block尺寸K及N维的特征向量计算用以下公式:
R为输入图像的尺寸,M为cell尺寸,B为每个Block内的cell数量,R为直方图内的统计分量数量。本例中,R=8080,M=88,B=4,R=9。
5>训练SVM分类器
SVM是一种通过构建一个超平面完成对数据的分类。SVM分类快速,高度准确,相比其他分类方法不容易出现过拟合。也可以很快地训练,SVM分类器对于要求速度与准确度的实时目标检测与识别表现极为出色。我们这里使用linear kernel的SVM模型,通过大量正样本与负样本的训练,我们可以得到一个SVM分类器,为了最优化该分类器的准确度,我们需要对一个控制损失函数的C值进行设置,C值过大将造成过拟合,C值过小将造成欠拟合,因此,我们将用交叉验证集测评,使交叉验证集准确度最高的C值将被选择。
目标实时检测
通过前面的步骤,我们已经完成了分类器的训练,现在我们可以将其运用于TK1上完成目标识别任务。实时条件下利用SVM分类器对目标进行识别的原理(如图2)
首先从摄像头读取一帧图像进行Gamma校正或者直方图均衡化后,利用图像金字塔以一定倍数ɑ进行缩放,接着在每一幅图像用尺寸为K的窗口进行滑动,步长为S,计算每个被窗口截取的图像的梯度直方图,得到向量N并将其输入SVM分类器可得到结果,在所有数据处理完后,可得到该副图像中是否有目标物体,若有,则可进行其他操作,操作完成后,读取下一帧画面。
在上述过程中,我们需要讨论2个极为重要的参数,缩放倍数ɑ,步长S。这两个参数设置将将决定我们整个系统的速度与准确度。下面我们将详细讨论这两个参数。
#缩放倍数ɑ
为了对多尺寸目标的识别,我们必须对输入图像进行一定倍数的缩放,直到缩放后的图像尺寸达到我们预先设置好的阈值,而每次的缩放倍数就是ɑ。我们可以想象当ɑ越小时,我们的检测准确率将会越高,然而我们需要处理更多的图片数据,这使我们系统的速度降低;当ɑ越大时,我们的准确率会下降,系统的速度会上升。
#步长S
步长S的数值代表了窗口每次水平或者竖直移动的距离。同样,如果S值较小,窗口移动得越慢,程序将计算每一块区域,需要处理的图像就越多,准确度越高,速度越低;反之,程序可能漏掉一些区域,准确度越低,速度越高。
如何选择缩放倍数ɑ,与步长S要根据系统具体的应用情境去设置,对于要求准确度极高,但是对实时性要求不高的情境,可以选择较小ɑ与S;在对要求实时很高的情境下,可以适当增加ɑ与S的值。
在TK1中测试
我们使用OpenCV将上述算法应用在TK1中,结合CUDA我们使用TK1的GPU完成大部分运算操作。我们的测试数据为3个640*480的MP4视频文件,调整了缩放比率ɑ与步长S得到了以下的实验结果。从中我们可以得出缩放比率ɑ、步长S、FPS、精度之间的大致关系。过大的步长S将严重影响精度,在步长S=8时,缩放比率控制在1.3至1.5之间将得到一个较高的精度与FPS。所以在本试验中,我们设置ɑ=1.4,S=8将使我们的系统达到最优性能。