研究dpm快一个月了,终于可以用自己的数据训练模型了,检测效果还不错,在此分享一些我的经验,我也是计算机视觉方面的一只小菜鸟,如果各位觉得有什么不对的地方请指出。欢迎和大家一起讨论计算机视觉和图像处理方面的问题。这里借鉴了几篇其他同路中人的博客:
http://blog.csdn.net/pozen/article/details/7023742
http://blog.csdn.net/dreamd1987/article/details/7396620
可以从http://www.cs.berkeley.edu/~rbg/latent/index.html获得的源码,采用Matlab和C++编写,我下载的是voc-release4.01版本,大概是因为版权的问题源码是在 Linux and Mac OS上运行的,考虑许多人在Linux平台上运行该源码不方便,这里将源码转化到Windows平台上运行。
检测demo部分:
1.dt.cc中加入#define int32_t int
2.features.cc和resize.cc中加入
#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; }
resize.cc中
alphainfo ofs[len]; 改成 alphainfo *ofs = new alphainfo[len];
同时,同一个域中加入delete []ofs;
3. compile.m中
源程序用的是0)用多线程,但是在Windows上跑不起来,这里用4)
经过以上步骤,就可以编译了,运行compile,但是事先要设置好matlab的编译器,我的环境是Windows操作系统、VS2010+Matlab2012b,在matlab设置编译器的命令为mex -setup,然后按照提示操作,选择vs2010编译器就行;编译完成后可以运行demo看检测效果。
训练pascal部分:
1. 准备正、负样本,可以使用VOC提供的样本集和工具集,下载地址为:http://pascallin.ecs.soton.ac.uk/challenges/VOC/voc2012/index.html#devkit 。
下载完成后,解压缩文件后,将VOCtrainval文件夹下的VOC2012文件夹拷贝到VOCdevkit文件夹下(我这里用的是2011年的数据)
若要自己准备正、负样本,这个就比较麻烦了,为了减少对源码的修改,我写了生成VOC数据的工具,将生成的数据放入相应的文件夹下就好。如有需要给向我要。
2. 数据准备好了,若在Window下运行训练的代码,还是要修改源码
① 在pascal_data.m中,最好加上一段代码来防止图片不存在的情况
② pascal.m中
unix(['rm ' tmpdir cls '.dat']);变成system(['del ' tmpdir cls '.dat']);
③ rewritedat.m中
unix(['mv ' datfile ' ' oldfile]);变成movefile(datfile, oldfile);
unix(['rm ' oldfile]);变成delete(oldfile);
unix(['cp ' inffile ' ' oldfile]);变成system(['copy ' inffile ' ' oldfile]);
④ train.m中
./learn 变成 learn
⑤ procid.m中
’/’ 变成 ’\’
⑥ 关于learn.cc的修改和编译执行后的结果在compileLearn文件夹下,编译方法将修改后的learn.cc添加到vs2010项目中,运行一下就行,最后就要生成的learn.exe
⑦ 修改global.m配置路径
3. VOCdevkit\VOC2012\ImageSets\Main这个文件夹下放置trainval.txt train.txt test.txt分别放了正样本图片名、负样本图片名、测试图片名(只有名,没有后缀)
4. 最后一步就可以训练了,pascal(‘obj’,n) obj就是你要训练的目标名, n就是目标大概有几类(如人有正面、侧面、背面,n就为3) 运行pascal(‘person’,3)就训练起来了
我用dpm做沙发检测,dpm中自带了很多训练好的模型例如person_final.mat,但沙发模型效果比较差,我又重新训练了一下,下面是结果