目标检测--LatentSVM和(Deformable Part Model,DPM)

一、综述

Deformable Part Model和LatentSVM结合用于目标检测由大牛P.Felzenszwalb提出,代表作是以下3篇paper:

[1] P. Felzenszwalb, D. McAllester, D.Ramaman. A Discriminatively Trained, Multiscale, Deformable Part Model. Proceedingsof the IEEE CVPR 2008.pdf 中文译文

[2] P. Felzenszwalb, R. Girshick, D.McAllester, D. Ramanan. Object Detection with Discriminatively Trained PartBased Models. IEEE Transactions on Pattern Analysis and Machine Intelligence,Vol. 32, No. 9, September 2010.pdf 中文译文

[3] P. Felzenszwalb, R. Girshick, D.McAllester. Cascade Object Detection with Deformable Part Models. Proceedingsof the IEEE CVPR 2010. pdf


其中[2]阐述了如何利用DPM来做检测(特征处理+分类阶段),[3]阐述了如何利用cascade思想来加速检测。综合来说,作者的思想是Hog Features+Deformable Part Model+Latent SVM的结合:

1、通过Hog特征模板来刻画每一部分,然后进行匹配。并且采用了金字塔,即在不同的分辨率上提取Hog特征。

2、利用提出的Deformable PartModel,在进行object detection时,detect window的得分等于part的匹配得分减去模型变化的花费。

3、在训练模型时,需要训练得到每一个part的Hog模板,以及衡量part位置分布cost的参数。文章中提出了LatentSVM方法,将deformable part model的学习问题转换为一个分类问题:利用SVM学习,将part的位置分布作为latent values,模型的参数转化为SVM的分割超平面。具体实现中,作者采用了迭代计算的方法,不断地更新模型。

具体内容参考以下文章:

1、目标检测(Object Detection)原理与实现(六) - 基于形变部件模型(DeformablePart Models)的目标检测

2、有关可变形部件模型(Deformable Part Model)的一些说明 - Why So Serious? - 博客频道 - CSDN.NET


二、实现代码

1、作者提供了旧版本代码:voc-release4.01,以及基于cascade思想的优化版本:star-cascade,在几乎不损失精度的情况下效率大大提高(14倍),在损失一点recall的情况下效率提升40倍。

2、新版本的代码:voc-release5,包含了star-cascade,但是对于硬件要求较高。

3、以上代码均为linux或者Mac OS X版本,DanielRodríguez Molina依此实现了C++版本的代码:LibPaBOD:a LIBrary for PArt-Based Object Detection in C++。

更多参考:http://blog.csdn.net/holybin/article/details/28292991

LatentSVM官网: http://docs.opencv.org/2.4/modules/objdetect/doc/latent_svm.html


三、DPM程序在windows下调试步骤:运行demo

由于该程序是在linux或者Apple系统的,所以需要改一些地方使demo.m能够在windows下运行
需要改动的地方:

1、把用到的文件dt.cc resize.cc fconv.cc features.cc、getdetection.cc的后缀都修改为cpp

2、dt.cpp中加:#define int32_t int

3、features.cpp、resize.cpp、fconv.cpp中加入
[html] view plaincopy
#define bzero(a, b) memset(a, 0, b)   
int round(float a) 
float tmp = a - (int)a;
 if( tmp >= 0.5 )
 return (int)a + 1; 
else  return 
(int)a;
 }  

4、resize.cpp中的alphainfo ofs[len] 换成:alphainfo *ofs = new alphainfo[len] 
当然要记得释放这个内存,但要注意放得位置。

5、注释掉compile 中mex -O fconvsse.cc -o fconv这句,因为该程序用到其他平台的多线程,在windows之下无法使用,然后在comopile最后一行加入 mex -O fconv.cc;之后就可以在matlab中运行compile进行编译了,这时会出现一些重定义的错误,应该是vc6.0对c++的一些不兼容,修改下就可以了。x重定义的-->z,o重定义的-->oo;

6、输入demo()。查看结果。

附:windows下DPM经验2


你可能感兴趣的:(目标检测--LatentSVM和(Deformable Part Model,DPM))