(转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang loves baiyan/ 未经允许请勿用于商业用途)

由于目前DPM模型训练的代码没有C++版本,至少我没看见opencv ccv conrib等一些库中都没有看到相关训练的部分倒都是有detector的部分),大部分人都是基于Matlab来做训练的,放到wnidows下用一些别的DPM的库或者自己C++实现,那么这些模型的文件类型大多都是XML的,网上现成的都比较混乱,看到opencv contrib库中的作者在他的另一个Git库中放了这个转换文件,没有公开说明。这个转换的文件可以达到目的,亲测可用。

function mat2opencvxml(fname_in, fname_out)
% Convert DPM (2007) model to cascade model and
% save in OpenCV file storage format (.xml)
% mat2opencvxml(fname_in, fname_out)
%
% e.g., mat2opencvxml('./INRIA/inriaperson_final.mat', 'inriaperson_cascade_cv.xml'
%
% Arguments
% fname_in File name of the DPM VOC 2007 model
% fname_out File name of the OpenCV file storage model (.xml) % load VOC2007 DPM model
load(fname_in); thresh = model.thresh;
pca = 5;
csc_model = cascade_model(model, '2007', pca, thresh); num_feat = 32;
rootfilters = [];
for i = 1:length(csc_model.rootfilters)
rootfilters{i} = csc_model.rootfilters{i}.w;
end
partfilters = [];
for i = 1:length(csc_model.partfilters)
partfilters{i} = csc_model.partfilters{i}.w;
end
for c = 1:csc_model.numcomponents
ridx{c} = csc_model.components{c}.rootindex;
oidx{c} = csc_model.components{c}.offsetindex;
root{c} = csc_model.rootfilters{ridx{c}}.w;
root_pca{c} = csc_model.rootfilters{ridx{c}}.wpca;
offset{c} = csc_model.offsets{oidx{c}}.w;
loc{c} = csc_model.loc{c}.w;
rsize{c} = [size(root{c},1) size(root{c},2)];
numparts{c} = length(csc_model.components{c}.parts);
for j = 1:numparts{c}
pidx{c,j} = csc_model.components{c}.parts{j}.partindex;
didx{c,j} = csc_model.components{c}.parts{j}.defindex;
part{c,j} = csc_model.partfilters{pidx{c,j}}.w;
part_pca{c,j} = csc_model.partfilters{pidx{c,j}}.wpca;
psize{c,j} = [size(part{c,j},1) size(part{c,j},2)];
end
end maxsizex = ceil(csc_model.maxsize(2));
maxsizey = ceil(csc_model.maxsize(1)); pca_rows = size(csc_model.pca_coeff, 1);
pca_cols = size(csc_model.pca_coeff, 2); f = fopen(fname_out, 'wb');
fprintf(f, '<?xml version="1.0"?>\n');
fprintf(f, '<opencv_storage>\n');
fprintf(f, '<SBin>%d</SBin>\n', csc_model.sbin);
fprintf(f, '<NumComponents>%d</NumComponents>\n', csc_model.numcomponents);
fprintf(f, '<NumFeatures>%d</NumFeatures>\n', num_feat);
fprintf(f, '<Interval>%d</Interval>\n', csc_model.interval);
fprintf(f, '<MaxSizeX>%d</MaxSizeX>\n', maxsizex);
fprintf(f, '<MaxSizeY>%d</MaxSizeY>\n', maxsizey);
%the pca coeff
fprintf(f, '<PCAcoeff type_id="opencv-matrix">\n');
fprintf(f, '\t<rows>%d</rows>\n', pca_rows);
fprintf(f, '\t<cols>%d</cols>\n', pca_cols);
fprintf(f, '\t<dt>d</dt>\n');
fprintf(f, '\t<data>\n');
for i=1:pca_rows
fprintf(f, '\t');
for j=1:pca_cols
fprintf(f, '%f ', csc_model.pca_coeff(i, j));
end
fprintf(f, '\n');
end
fprintf(f, '\t</data>\n');
fprintf(f, '</PCAcoeff>\n');
fprintf(f, '<PCADim>%d</PCADim>\n', pca_cols);
fprintf(f, '<ScoreThreshold>%.16f</ScoreThreshold>\n', csc_model.thresh); fprintf(f, '<Bias>\n');
for c = 1:csc_model.numcomponents
fprintf(f, '%f ', offset{c});
end
fprintf(f, '\n</Bias>\n'); fprintf(f, '<RootFilters>\n');
for c = 1:csc_model.numcomponents
rootfilter = root{c};
rows = size(rootfilter,1);
cols = size(rootfilter,2);
depth = size(rootfilter,3);
fprintf(f, '\t<_ type_id="opencv-matrix">\n');
fprintf(f, '\t<rows>%d</rows>\n', rows);
fprintf(f, '\t<cols>%d</cols>\n', cols*depth);
fprintf(f, '\t<dt>d</dt>\n');
fprintf(f, '\t<data>\n');
for i=1:rows
fprintf(f, '\t');
for j=1:cols
for k=1:depth
fprintf(f, '%f ', rootfilter(i, j, k));
end
end
fprintf(f, '\n');
end
fprintf(f, '\t</data>\n');
fprintf(f, '\t</_>\n');
end
fprintf(f, '</RootFilters>\n'); fprintf(f, '<RootPCAFilters>\n');
for c = 1:csc_model.numcomponents
rootfilter_pca = root_pca{c};
rows = size(rootfilter_pca,1);
cols = size(rootfilter_pca,2);
depth = size(rootfilter_pca,3);
fprintf(f, '\t<_ type_id="opencv-matrix">\n');
fprintf(f, '\t<rows>%d</rows>\n', rows);
fprintf(f, '\t<cols>%d</cols>\n', cols*depth);
fprintf(f, '\t<dt>d</dt>\n');
fprintf(f, '\t<data>\n');
for i=1:rows
fprintf(f, '\t');
for j=1:cols
for k=1:depth
fprintf(f, '%f ', rootfilter_pca(i, j, k));
end
end
fprintf(f, '\n');
end
fprintf(f, '\t</data>\n');
fprintf(f, '\t</_>\n');
end
fprintf(f, '</RootPCAFilters>\n'); fprintf(f, '<PartFilters>\n');
for c = 1:csc_model.numcomponents
for p=1:numparts{c}
partfilter = part{c,p};
rows = size(partfilter,1);
cols = size(partfilter,2);
depth = size(partfilter,3);
fprintf(f, '\t<_ type_id="opencv-matrix">\n');
fprintf(f, '\t<rows>%d</rows>\n', rows);
fprintf(f, '\t<cols>%d</cols>\n', cols*depth);
fprintf(f, '\t<dt>d</dt>\n');
fprintf(f, '\t<data>\n');
for i=1:rows
fprintf(f, '\t');
for j=1:cols
for k=1:depth
fprintf(f, '%f ', partfilter(i, j, k));
end
end
fprintf(f, '\n');
end
fprintf(f, '\t</data>\n');
fprintf(f, '\t</_>\n');
end
end
fprintf(f, '</PartFilters>\n'); fprintf(f, '<PartPCAFilters>\n');
for c = 1:csc_model.numcomponents
for p=1:numparts{c}
partfilter = part_pca{c,p};
rows = size(partfilter,1);
cols = size(partfilter,2);
depth = size(partfilter,3);
fprintf(f, '\t<_ type_id="opencv-matrix">\n');
fprintf(f, '\t<rows>%d</rows>\n', rows);
fprintf(f, '\t<cols>%d</cols>\n', cols*depth);
fprintf(f, '\t<dt>d</dt>\n');
fprintf(f, '\t<data>\n');
for i=1:rows
fprintf(f, '\t');
for j=1:cols
for k=1:depth
fprintf(f, '%f ', partfilter(i, j, k));
end
end
fprintf(f, '\n');
end
fprintf(f, '\t</data>\n');
fprintf(f, '\t</_>\n');
end
end
fprintf(f, '</PartPCAFilters>\n'); fprintf(f, '<PrunThreshold>\n');
for c = 1:csc_model.numcomponents
fprintf(f, '\t<_>\n');
fprintf(f, '\t');
t = csc_model.cascade.t{ridx{c}};
for j=1:length(t)
fprintf(f, '%f ', t(j));
end
fprintf(f, '\n\t</_>\n');
end
fprintf(f, '</PrunThreshold>\n'); fprintf(f, '<Anchor>\n');
for c = 1:csc_model.numcomponents
for p=1:numparts{c}
fprintf(f, '\t<_>\n');
fprintf(f, '\t');
anchor = csc_model.defs{didx{c,p}}.anchor;
for j=1:length(anchor)
fprintf(f, '%f ', anchor(j));
end
fprintf(f, '\n\t</_>\n');
end
end
fprintf(f, '</Anchor>\n'); fprintf(f, '<Deformation>\n');
for c = 1:csc_model.numcomponents
for p=1:numparts{c}
fprintf(f, '\t<_>\n');
fprintf(f, '\t');
def = csc_model.defs{didx{c,p}}.w;
for j=1:length(def)
fprintf(f, '%f ', def(j));
end
fprintf(f, '\n\t</_>\n');
end
end
fprintf(f, '</Deformation>\n'); fprintf(f, '<NumParts>\n');
for c = 1:csc_model.numcomponents
fprintf(f, '%f ', numparts{c});
end
fprintf(f, '</NumParts>\n'); fprintf(f, '<PartOrder>\n');
for c = 1:csc_model.numcomponents
fprintf(f, '\t<_>\n');
fprintf(f, '\t');
order = csc_model.cascade.order{c};
for i=1:length(order)
fprintf(f, '%f ', order(i));
end
fprintf(f, '\n\t</_>\n');
end
fprintf(f, '</PartOrder>\n'); fprintf(f, '<LocationWeight>\n');
for c = 1:csc_model.numcomponents
fprintf(f, '\t<_>\n');
fprintf(f, '\t');
loc_w = loc{c};
for i=1:length(loc_w)
fprintf(f, '%f ', loc_w(i));
end
fprintf(f, '\n\t</_>\n');
end
fprintf(f, '</LocationWeight>\n');
fprintf(f, '</opencv_storage>');
fclose(f);

DPM(voc-release5) Matlab模型文件 Mat转XML的更多相关文章

  1. python——读取MATLAB数据文件 *.mat

    鉴于以后的目标主要是利用现有的Matlab数据(.mat或者.txt),主要考虑python导入Matlab数据的问题.以下代码可以解决python读取.mat文件的问题.主要使用sicpy.io即可 ...

  2. Matlab之文件读写

    读文件:  (0)自己添加 你可以将txt的一些文本数据直接拷贝到matlab窗口,然后保存为mat文件,下次就可以直接采用load函数了. (1)Load load 从Matlab的数据文件.mat ...

  3. Matlab立体标定mat转换成Opencv的CvMat

    最近在做基于双目视觉的三维重建.比较opencv和matlab工具箱的立体标定结果精度时,发现貌似如果手工选取角点不那么离谱的话,matlab标定结果精度更高也更鲁棒.就想先用matlab标定好相机, ...

  4. MATLAB中文件的读写和数据的导入导出

    http://blog.163.com/tawney_daylily/blog/static/13614643620111117853933/ 在编写一个程序时,经常需要从外部读入数据,或者将程序运行 ...

  5. tensorflow c++ API加载.pb模型文件并预测图片

    tensorflow  python创建模型,训练模型,得到.pb模型文件后,用c++ api进行预测 #include <iostream> #include <map> # ...

  6. Matlab 读取文件夹中所有的bmp文件

    将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...

  7. matlab提速技巧(自matlab帮助文件)

    matlab提速技巧(自matlab帮助文件) 1.首先要学会用profiler.1.1. 打开profiler.To open the Profiler, select View -> Pro ...

  8. TF的模型文件

    TF的模型文件 标签(空格分隔): TensorFlow Saver tensorflow模型保存函数为: tf.train.Saver() 当然,除了上面最简单的保存方式,也可以指定保存的步数,多长 ...

  9. Away3D 学习笔记(一): 加载3DS格式的模型文件

    加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...

随机推荐

  1. [读码]HTML5像素文字爆炸重组

    [边读码,边学习,技术也好,思路也罢] [一款基于HTML5技术的文字像素爆炸重组动画特效,我们可以在输入框中指定任意文字,点击确定按钮后,就会将原先的文字爆炸散去,新的文字以像素点的形式组合起来,看 ...

  2. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  3. MyEclipse 2015免费在线公开课,2月5日开讲

    MyEclipse 2015免费在线公开课,2月5日开讲,由MyEclipse官方高级PM Brian Fernandes 主讲. 主讲内容: 更好地支持javascript和技术模块 全新的REST ...

  4. nginx反向代理配置及优化

    nginx反向代理配置及优化前言: 由于服务器apache抗不住目前的并发.加上前端squid配置后,问题依然无法解决.而页面程序大部分是动态.无法使用fastcgi来处理.因此想使用nginx做为反 ...

  5. AFNetwork2.0在报错1016,3840的解决方法及一些感悟

    最近在学习AFNetwork,非常好的网络框架,能节省很多时间.不过请求网络数据时报错1016,3840. 这两个错误网上解决方法很多,http://blog.csdn.net/huifeidexin ...

  6. Mac终端常见命令

    Mac的使用 1.Finder资源管理器 Mac的硬盘不分区,只有一个根目录 2.系统偏好设置-控制面板 快捷键: 1.win下面的快捷键由ctrl换成common开头: commond+space ...

  7. UIPickerView简单应用

    下面是一些效果图 下面是代码.有些枯燥 , 其实并不难 . #import <UIKit/UIKit.h> @interface ViewController : UIViewContro ...

  8. Scrum敏捷项目管理精要

    1. 简介: 敏捷项目管理在我们国家起步比较晚,成功运用的项目不多 百分之六十五的敏捷项目用户为scrum 2.互联网时代的特征,雷军的话: 专注,极致,口碑,快(敏捷项目开发就是要快速) 3.敏捷开 ...

  9. ASP.NET处理301重定向方法 带示例 (demo)

    System.Web.HttpContext.Current.Response.Status = "301 Moved Permanently"; System.Web.HttpC ...

  10. linux 学习随笔-group和user管理

    1:/etc/passwd 打开该文件,可以看到每一行内容被分割成了7个字段比如:root:x:0:0:root:/root:/bin/bash 第一个字段表示用户名为root用户 第二个字段存放了该 ...