天天看点

C++完成DPM

此前我已经将Cascade DPM的C++代码以及Original DPM的C++编译库发布出来,很多人给我发邮件,希望能得到Original DPM的C++代码,现在我就把这个源代码发布出来。

发布内容:Original DPM,我也称之为完整版DPM,是Pedro. Felzenswalb发明的”deformable part based models for object detection”的程序实现,原始程序和参考文献已经在我另一篇文章cascade DPM – C++ implementation – open source里列出了,这里不再赘述。我的工作是将原始的Matlab代码voc-release5中检测部分用C++实现。检测部分有完整版DPM的,也有star-cascade版的,后者的c++程序之前已发布,这里发布的则是完整版DPM的C++代码。

为什么Original DPM?首先,原始的DPM算法充分体现了基于部件模型的目标检测思想,与P.Felzenswalb关于在语法框架下进行目标表示和检测的思想相应,学习该程序能较好地理解作者的目标检测思想,而级联是更早就有的一项技术,其主要思路是将任务分解成一步步去做,在每一步做完都检查一下有没有继续做的必要,这是一个相当工程的东西,在boost分类器里面就有级联思想,并非P.F教授的首创。第二,与级联算法相比,原始DPM的检测效果更好,一般训练一个级联分类器首先要训练原始DPM模型,然后继续在数据集上挖掘信息(PCA、级联训练)来得到级联模型。级联模型对训练数据集更加依赖,相比之下,原始DPM的推广能力要强得多。

本文发布的C++代码有什么特色?网上应该可以找到多个不同的关于原始DPM的C/C++实现,其中我觉得最好的一个版本便是集成在openCV库中的”latentSVM”算法(其实就是DPM的检测部分),与该代码相比,本文公布的代码更快、效果更好!原因在于:一、我写代码严格参照voc-release5的matlab代码,其计算结果和matlab代码完全一致!(matlab代码中的图像缩放用的resize函数是作者自己编写的,而我的代码是用openCV自带的图像缩放函数——速度更快,这造成了计算结果的些许差异。但是我在调试代码的时候,写过一个函数直接将matlab代码算出来的特征金字塔加载到c++程序里,使用同样的特征金字塔以后,我的代码给出和matlab代码完全一致的结果。)二、我用了近一年时间写这个代码,写代码的同时还在研究原始算法并写自己的硕士论文,通过不断摸索,对算法中很多地方做了优化处理,比如并行化、跳过中间环节的计算等等,直到我认为再也找不到可以减少的计算。

关于代码本身:代码用C++编写,依赖两个公开库——openCV和pthreah线程库。openCV是著名的计算机视觉公开库,不需多说。pthread也是公开的线程库,提供线程管理和互斥锁功能,是linux内置的库,在windows下使用需要下载安装,我在另一篇文章里有说。发布的代码是windows下的visual studio的solution,但程序中没有使用与系统相关的函数,可以很容易移植到linux下使用(实际上我已经在几乎不修改源代码的情况下在Ubuntu下编译并使用过了)。

其它:说一点愿景,关于我为什么公开此代码。说实话,很长一段时间内我都舍不得把该代码给别人,因为它凝聚了我很多心血,不想轻易送人。但是我现在研究方向已经与当初发生了较大变化,与其把这些代码放在我硬盘上最终被遗忘,不如让它们发挥应有的价值。人家P.F教授公开自己的算法代码并获得了VOC官方颁发的终身成就奖,我没人家万分之一牛,但是也希望能为后来者学习提供一些帮助。愿祖国更好!

代码下载:http://yunpan.cn/cseKxumj62Hcv  提取码 d6fb

代码是dpm的检测部分,我已将voc-release5中包含的所有模型文件转化成相应txt文件并上传到网上,需要的话到我的另一篇文章THE FASTEST C++ IMPLEMENTATION OF DPM/LATENTSVM中下载.

代码只包含检测部分,如果你们使用voc-release5的matlab代码训练了自己的模型,可以用如下的m函数将模型保存为txt文件以使用:http://download.csdn.net/detail/j56754gefge/8354899

上一篇: dpm_list链表

继续阅读