HOG + Linear SVM detector实现目标物体检测
HOG + Linear SVM detector给我们的第一印象是用于行人检测,但事实上它们可用于任意目标物体的检测。今天我要跟大家分享的是用HOG + Linear SVM detector来检测传送带中的轮胎,并用LBP+SVM对轮胎进行分类。
1.概述
如下图所示,在黑色的传送带上会随机出现不同尺寸和不同颜色的轮胎。我们要完成的第一个任务是利用HOG + Linear SVM detector来检测在传送带上出现的每一个轮胎,并且用矩形将其标示;第二个任务是用LBP+SVM对轮胎进行分类,我们将传送带中的轮胎简单的分为大轮胎和小轮胎,同时对视频中的大轮胎和小轮胎进行计数。 因为样本数量不足,目前程序中会出现大小轮胎误判的状况,个人认为增大训练样本的数量可以极大的降低误计率。若有高手有其他见解,还请指点一二,博主不甚感激。
本文提及的完整代码地址:https://github.com/livezingy/Object_Detection_Sample
代码演示视频: http://v.youku.com/v_show/id_XMjcwNjk5MjMxNg==.html?spm=a2h3j.8428770.3416059.1
2. HOG + Linear SVM detector检测轮胎
2.1 准备轮胎正负样本
我处理的视频时间不长,包含的正样本数较少。所以我想到了借助于机器学习的图库,不过找到的有效样本非常少。因此在这个程序中使用的正负样本均来源于源视频。我将视频中的每一帧都存储为图片,然后手工从每一张图像中截取正负样本,虽然正样本有限,但可以获取大量的负样本。
获取样本时,样本尺寸有两种方案。方案1,截取的所有样本通过某些工具(美图秀秀等)修正为统一尺寸,程序中不需要再针对尺寸特殊处理;方案2,截取的样本尺寸随意,训练之前通过resize来处理。经过验证,这两种方案都可行,但实际检测效果会有差异,建议选取方案1。
2.2 HOG+ Linear SVM detector对样本进行训练
注意“cv::ml::SVM::KernelTypes::LINEAR”这里的kernelTypes一定是LINEAR,不能是其他类型。
3. SVM+LBP对不同尺寸的轮胎进行计数
3.1 将第2步中准备的正样本进行分类,分为大轮胎,小轮胎两类,加上负样本,一共三类。
3.2 SVM+LBP训练分类器
训练分类器时可选取的特征类型其实非常多,例如LBP, HOG, SURF,SIFT等等,但是因为我这里样本数量及其有限,所以我仅验证了LBP和HOG,LBP特征表现明显优于HOG。因此上传到Github中的代码选取LBP特征。
3.3 用HOG.txt对视频中的轮胎进行检测,截取其检测区域作为分类器的输入,用分类器进行分类并计数。
4. 实施难点与对策
第二,三步的描述有点像纸上谈兵,看起来很简单的样子,实施起来还是有难度的:
4.1 HOG + Linear SVM detector的目标检测函数detectMultiScale检测比较耗时,如果每一帧都执行完整的检测的话可能无法满足实时性。
为了提高视频目标物体侦测的实时性,我尝试过帧差法和背景提取法(BackgroundSubtractorMOG、BackgroundSubtractorMOG2, BackgroundSubtractorGMG)。 综合准确率和实时性,detectMultiScale针对我所处理的视频表现还是最优异的。如果视频中只有检测目标是运动的,那用帧差法和背景提取法应该是可行的。根据此视频的特征,我实现的程序中只检测每一帧的左半侧,这样检测速度比检测全帧可以提高一半。另外,通过调整detectMultiScale的参数也可以提高其检测速度,我会在下一篇文章中来讲解detectMultiScale的参数。
4.2 传送带会停止或者像相反的方向运动(相对于正常方向而言),而且当传送带上的轮胎大小不一时,传送带的运动速度也不同。当出现上述情况时,怎样才能确保不出现误计数呢?
为了消除误计数,我尝试过Camshift算法,但结果并不理想。后查阅相关资料,貌似该算法对于纯色物体在黑白背景下的跟踪效果是很好的,但是如果背景的颜色与目标相近,或者目标附近有与目标的色调相近的算法比较物体,则Camshift会自动将其包括在内,导致跟踪窗口扩大,甚至有时会将跟踪窗口扩大到整个视频框架。我处理的视频正好不在Camshift擅长的范围。
最终我选用的方案是用灰度图帧差法来判断传送带是否静止,且当前次有效计数与下一次有效计数之间间隔一定帧数。不过这两项措施仍然无法处理传送带向相反方向运行的状况。