DPM检测模型 VoC-release 5 linux 下编译运行
(转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途)
DPM目前使非神经网络方法里面较好的目标检测程序,作者呢也是Fast RCNN的作者 Ross Girshick,真的是牛人,这个模型是在2010年被提出的DPM的全称也就是Deformable Part Model,可变形部件模型。其主要思想是根据弹簧形变模型提出的,也就是一个目标物时分为主部分和子部件,分别叫做root和part,很多时候我们需要检测的物体并不是单个模板下的,比如之前我用的opencv 下的svm来做检测,还有adaboost下用haar来做检测,他们的模型非常单一,是不能很好的适应复杂场景的检测需求。
DPM模型在训练的时候是分为主部件和子部件,在检测的时候就有了root filter 和 part filter,两者结合做检测,part filter在root filter,类比的话,比如人的手和脚是可以明显活动的,四肢非常灵活,显然单一的模板来检测人是不严密的,而其检测过程可以归纳为一个主部件的得分以及他子部件的得分的和,并且需要减去子部件偏离的cost,作为其最终得分。他的一个概念模型可以看一下下图
看一下我训练的车脸模型,模型里用的是Hog特征,梯度方向直方图,下面是特征模型的可视化结果:这里用的6个部件
网络上说voc-release5的资料比较少,大部分还是用的DPM代码的3.1或者4.1版本,最新的是voc-release5八本,ross在里面加入了star-cascade还有新的模型语法car-grammar,检测的速度比直接的块了不少。首先我说明一下如何编译voc-release5的matlab工程
首先下载DPM的工程源码,给出链接:
http://www.cs.berkeley.edu/~rbg/latent/
这里我觉得最好还是在linux下或者 os x下进行训练,不要在windows下进行训练,你最后得到的也是个mat的模型文件,不要徒增工作量,毕竟是matlab的源代码也不能直接应用于工程,怎么方便怎么配置。
由于我的ubuntu上安装的是matlab 2014a,根据readme的提示,需要先编译,再运行demo。一般来说现在的ubuntu比较主流的是14.04 LTS,其自带的gcc 版本比较高,我这里是4.8,但是Matlab最高支持到gcc4.7因此需要apt-get 安装一下4.7的gcc,再调整一下编译器的优先级选项,最后gcc -v 输出一下当前默认的gcc版本好是多少
sudo apt-get install gcc-4.7 g++-4.7 g++-4.7-multilib gcc-4.7-multilib
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.7 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.7 100
sudo update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.8 50
gcc -v
接下来gcc的报错应该是没有了,但是编译还是会出错
看到报错,在compile.m中
mex error using
Unknown MEX argument '-o'.
在compile.m中有几处-o,列了两处
eval([mexcmd ' gdetect/fconvsse.cc -o fconv']);
eval([mexcmd ' gdetect/fconv_var_dim_MT.cc -o fconv_var_dim']);
-o的参数可能是因为mex的版本导致的参数指令不兼容,因此将-o 改成-output就可以了
再次运行demo.m文件,即可看到DPM模型的检测演示如下:
下面整个可视化模型是基于VOC2007训练的,可以看到有3个方向的模型,第一个是车辆的左斜视图,第二个是车辆的右斜视图,第三个是正视图,可以大致展现车的轮廓:
待检测的图像:
检测的示意图,其中红框是最后的检测位置,蓝框是局部的部件: