python通过HOG+SVM实现行人检测思路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/s564200489/article/details/83986542

一、思路

1、选取窗口宽高为 64*128 ,block大小为 16*16像素,block步长为8像素,cell为8*8像素,每个cell分9个bin,其他参数都默认

        这样的话,一个block有4个cell,一个cell有9维,那一个block有 4*9=36维特征描述子,宽为64,x方向能有(64/8)-1 = 7 个block,高为128,y方向能有(128/8)-1=15 个, 那么一个窗口的的特征描述子维度为 7*15*36 = 3780

2、提取正例,每个正例有3780个特征,label 为 1 ,提取负例也是3780个,label为-1

      那么问题来了,在这里我使用的是INRIADATA数据源,正例中它提供了 行人 位置(一个矩形的左上点和右下点)和一个 center点(标记的是头部),而这个矩形的宽高,都不满足 64*128,这里,网络上大部分人都是直接resize或者做一些边沿填充,将矩形调整为64*128,直接resize我觉得还好,只要原图比例差不多,生成的特征不会差太远,而边沿填充就很不好了,如图1,填充的话就直接添加了很多非人体的特征,在SVM学习中则相当于增加了正例中的错误分类。而我的做法是在原矩形的基础上以矩形的中心为基准稍微调整其宽高,使之宽高比=64/128,然后再直接reszie为64*128,效果如图2。我认为这样是比较合适的。

     而负例怎么提取呢?负例图基本都是一张宽的风景图,完全不包含行人。网上的做法是直接resize为64*128,这样做,并没有什么问题,因为现实生活中是背景是千奇百怪的,负例的信息是远高于正例的,但我在这里稍微讲究点,用64*128的窗口提取负例,就这样,我提取了500000多个的负例,由于numpy维度最高为100000左右,因此我尝试分批训练,但在执行第二次svm.train的时候报错了“sv_count != 0 in function 'cv::ml::SVMImpl::do_train'” 这个问题是因为svm判断了每次训练不能没有正例,因为正例只有2000多个,第二次分批的时候已经没有正例了。这里我做简单点,生成负例的时候只随机取了50000多个与2000多个正例一起训练。

3、进行SVM训练,参数都是默认用的是EPS_SVR。

     这里值得一提的是svm.train 中响应值 _responses 应为 CV_VAR_ORDERED(回归)

4、进行难例训练。

      使用第3步训练得到的模型对负例原图进行识别,将识别到的图片作为难例,添加到特征数据里,再训练。事实上按照步骤2的方式提取负例,已经没有难例了。

5、得到最终模型。如图3

    最终框出来的区域还得做非极大值抑制。

图1
图1
图2
图3

猜你喜欢

转载自blog.csdn.net/s564200489/article/details/83986542