HOG+SVM总结

纠结了快20天的东西,今天终于有了一个好的结果,利用hog+svm进行行人检测。

纠结过很多地方,不过现在终于理通了,写下总结实为发泄!

言归正传,实验所用行人库:INRIAPerson。训练过程如下:

1、选定正负样本:正样本、行人库中正样本大小为96x160,比我们需要的64x128窗口要大,是因为每一个边有一个padding,16像素,因此保持中心不动,选取64x128窗口大小的图片作为训练的正样本。负样本、负样本大小不统一,在每一个负样本图像中随机选取10个64x128大小的patch作为训练的负样本(即用来训练的负样本个数是行人库中个数的10倍,每一个负样本产生10个patch);

2、提取hog特征(opencv完成);

3、将提取出来的hog特征投入到svm中训练,得到初始分类器;

4、利用初始分类器(其实就是支持向量以及对应的权值,还有一个偏移)的支持向量和对应的权值加权得到检测行人的检测子,再加上一维的偏移,整个检测子是3781维。但是,重点来了,这个初始检测子,效果很差很差,不信你可以试试,有很多错检的(有点hard example的味道,什么是hard example?别急),错检太多,是因为训练还没有完成;

5、利用这个初始的检测子去检测前面用来训练的负样本原图(不是随机提取出来的图,而是原图),检测方法是利用cvhog的多尺度检测detectMultiScale方法,检测出来一打一打的行人(但实际上是负样本,所以肯定是错的),这些检测出来的区域,就是hard example;

6、提取第5步中hard example的hog特征(如果训练样本数量太多的话,可以在选出来的hard example里二次抽样,即选取部分hard example提取hog特征);

7、将hard example的hog特征和第2步中正负样本的hog特征综合起来,再训练svm分类器,这样就得到了最终的分类器。

之前纠结过的地方:

1、负样本为何会大小不统一?因为整个负样本中是没有人的,随便在图像中选择64x128窗口大小的图像都可作为负样本进行训练,因此负样本原始图像的大小并不重要。

2、resize不能乱用。这里就迁出了为何要使用多尺度检测的问题。因为我们规定的窗口大小是64x128,太大或者太小的人都检测不到,因此我们利用尺度对图像进行缩放,在每一层中进行检测,最后在原图画矩形框,他的结果是把每一层的检测结果综合起来,可能有一层就检测不到了,resize的话没准就恰恰resize成了找不到行人或者把不是行人的判断为行人了。resize不能乱用,我最开始用resize的时候,支持向量和投入训练的数量一样多,这不坑爹么?所以不到万不得已,别用resize。

3、hard example是个什么东西?我一度以为hard example是最初训练分类的随机选出来的那些样本,可是我用分类器一检测,100%的通过率(即全部都不是行人),这不坑爹么?然后该怎么办呢?于是慢慢试啊试,试到最后,就是第5步中的结果,不得不说,耽误时间最多的是重训练这块,尤其是在找hard example这块。

你可能感兴趣的:(OPENCV,C++,VS2015,HOG,SVM)