Hello Mat

 找回密码
 立即注册
查看: 7236|回复: 1

DPM(Deformable Parts Model)可变部件模型

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2017-9-24 14:08:52 | 显示全部楼层 |阅读模式
DPM(Deformable Parts Model):DPM是一个非常成功的目标检测算法,连续获得VOC(Visual Object Class)07,08,09年的检测冠军。目前已成为众多分类器、分割、人体姿态和行为分类的重要部分。

DPM源码版本:voc-release4.01
VOC开发包版本:VOC2007_devkit_08-Jun
Matlab版本:MatlabR2014a
c++编译器:VS2013
系统:Win7 32位
learn.exe迭代次数:5万次
数据集:INRIA 人体数据集

使用时应注意:
【1】当重新修改了数据集后,例如改为train_ysw.txt和trainval_ysw.txt,此时应该清空临时文件夹dmp_tmp的.mat、.log等文件
【2】在pascal_train.m中,索引超过矩阵维度,修改:
  1. globals;
  2. [pos, neg] = pascal_data(cls, true, VOCyear);
  3. % split data by aspect ratio into n groups
  4. spos = split(cls, pos, n);

  5. cachesize = 24000;
  6. maxneg = 20; % 不能超过neg的长度
复制代码
【3】提示:错误使用 movefile 另一个程序正在使用此文件,进程无法访问。在MATLAB2011b和VS2012、WIN64bit环境下,是没有这个错误提示的。目前我遇到的MATLAB2014a、VS2013、WIN32bit和MATLAB2016b、VS2012、WIN64bit,均会出现这个错误提示。
产生原因:在global.m文件中,我修改的是相对路径:
  1. % directory for LARGE temporary files created during training
  2. tmpdir = ['./dpm_tmp/dat/' VOCyear '/'];
复制代码
在使用movefile(datfile, oldfile)时,输出相应的datfile和oldfile:
  1. datfile =./dpm_tmp/dat/2007/person.dat
  2. oldfile =./dpm_tmp/dat/2007/person.dat_tmp
复制代码
为什么会报错呢?查看matlab帮助文档,doc movefile,我们可以知道,movefile('source','destination') moves the file or folder named source to the location destination, where source and destination are the absolute or relative paths for the folder or file.
因此,在此处需要用绝对路径。
解决方法:在global.m文件中,修改为绝对路径:
  1. % directory for LARGE temporary files created during training
  2. tmpdir = ['C:/Users/ysw/Desktop/VOC/dpm-master/dpm-master/dpm_tmp/dat/' VOCyear '/'];
复制代码
关闭MATLAB后,再打开运行即可。
刚开始时,我还以为是并行计算造成的,把train.m文件中所有的parfor全部改为for,没想到是global.m的路径设置问题。
如果中途还有这个问题存在,就需要你把你的临时文件夹(C:/Users/ysw/Desktop/VOC/dpm-master/dpm-master/dpm_tmp/)的生成内容全部清理掉,将train.m文件中所有的parfor全部改为for,关闭MATLAB,删除,再启动MATLAB。
【4】在运行pascal('person', 1);代码时,记得还要把测试的.txt拷贝到相对应的文件夹C:\Users\ysw\Desktop\VOC\VOCtest_06-Nov-2007\VOCdevkit\VOC2007\ImageSets\Main --->C:\Users\ysw\Desktop\VOC\dpm-master\dpm-master\VOCdevkit\VOC2007\ImageSets\Main

DPM代码解释:
我调试的DPM代码分享:http://pan.baidu.com/s/1nuBCOYX
DPM代码调试视频分享:
DPM数据集、程序包分享:http://pan.baidu.com/s/1qYmK1C4

代码分析:
1、pascal('person', 1);进行人模型训练测试;
2、model = pascal_train(cls, n, note);模型的训练
    1)[pos, neg] = pascal_data(cls, true, VOCyear);提取正负样本,一张图像上存在多个正样本和多个负样本,crop_part
    2)spos = split(cls, pos, n);根据长宽比进行正负样本分类;
    3)模型的训练:models{i} = train(cls, models{i}, spos{i}(inds), neg, i, 1, 1, 1, cachesize, true, 0.7, false, ['lrsplit1_' num2str(i)]);模型的训练过程中,
hdrfile = [tmpdir name '.hdr'];
datfile = [tmpdir name '.dat'];      % 样本的分类过程中间数据,内容最为丰富
modfile = [tmpdir name '.mod'];
inffile = [tmpdir name '.inf'];
lobfile = [tmpdir name '.lob'];
cmpfile = [tmpdir name '.cmp'];
objfile = [tmpdir name '.obj'];
通过这些文件的缓存,进行learn.exe学习,得到model。得到model后,我们就可以像SVM工具箱一样,直接对model结果进行调用即可,可重点关注模型的测试。
3、boxes1 = pascal_test(cls, model, 'test_ysw', testyear, testyear);模型的测试(重点关注)
1)[dets, boxes] = imgdetect(im, model, model.thresh);图像上目标part检测;
2)


参考:
【1】http://blog.csdn.net/masibuaa/article/details/25221103
【2】http://blog.csdn.net/carson2005/article/details/22499565
【3】http://blog.csdn.net/qq_14845119/article/details/52625426
【4】http://blog.csdn.net/ttransposition/article/details/12966521
【5】PASCAL VOC数据集:http://host.robots.ox.ac.uk/pascal/VOC/index.html
【6】镜像文件:Pascal VOC Dataset Mirror
【7】源码下载:http://www.rossgirshick.info/latent/
【8】SVM-light:http://sourceforge.net/projects/mex-svm/
【9】VOC数据集及dpm代码分享
























算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

41

帖子

1

金钱

新手上路

Rank: 1

积分
42
发表于 2017-12-1 14:26:22 | 显示全部楼层
学习了,谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-23 03:57 , Processed in 0.230930 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表