VOC-release4.01 DPM训练的model(mat)转为OpenCV latentsvm可
发布时间:2020-12-16 08:43:12 所属栏目:百科 来源:网络整理
导读:摘自:http://www.xuebuyuan.com/601093.html 转换后的single component person model检测效果不错,而VOC2007 2009中的three-component person model的检测效果则非常差,可能是OpenCV对混合模型的加载不太支持。(我只关心person的检测,所以只测试了perso
摘自:http://www.xuebuyuan.com/601093.html
转换后的single component person model检测效果不错,而VOC2007 2009中的three-component person model的检测效果则非常差,可能是OpenCV对混合模型的加载不太支持。(我只关心person的检测,所以只测试了person的model转换后的效果)
function MAT2XMLmodel_401(matmodel,xmlfile) % jelly 2013-08-12 % Convert *.mat format model in the source example in % Discriminatively Trained Deformable Part Models "voc-release4.01" % to opencv's latentSVM detect input format *.xml if(nargin < 2) matmodel = 'INRIA/inriaperson_final'; xmlfile = 'INRIA/inriaperson_final.xml'; end load(matmodel); fid = fopen(xmlfile,'w'); fprintf(fid,'<Model>n'); %% %获取组件数 ncom = length(model.rules{model.start}); fprintf(fid,'t<!-- Number of components -->n'); fprintf(fid,'t<NumComponents>%d</NumComponents>n',ncom); %获取特征维数,固定值31维。model中没有记录 nfeature = 31; fprintf(fid,'t<!-- Number of features -->n'); fprintf(fid,'t<P>%d</P>n',nfeature); %Score threshold=model.thresh fprintf(fid,'t<!-- Score threshold -->n'); fprintf(fid,'t<ScoreThreshold>%.16f</ScoreThreshold>n',model.thresh); layer = 1; %对于每一个组件分别获取它的root filter、part filter、deformation filter for icom = 1:ncom fprintf(fid,'t<Component>n'); fprintf(fid,'tt<!-- Root filter description -->n'); fprintf(fid,'tt<RootFilter>n'); % attention: X,Y swap rhs = model.rules{model.start}(icom).rhs; % assume the root filter is first on the rhs of the start rules if model.symbols(rhs(1)).type == 'T' % handle case where there's no deformation model for the root root = model.symbols(rhs(1)).filter; else % handle case where there is a deformation model for the root root = model.symbols(model.rules{rhs(1)}(layer).rhs).filter; end filternum = root; sizeX = model.filters(filternum).size(2); sizeY = model.filters(filternum).size(1); fprintf(fid,'ttt<!-- Dimensions -->n'); fprintf(fid,'ttt<sizeX>%d</sizeX>n',sizeX); fprintf(fid,'ttt<sizeY>%d</sizeY>n',sizeY); fprintf(fid,'ttt<!-- Weights (binary representation) -->n'); fprintf(fid,'ttt<Weights>'); for iY = 1:sizeY for iX = 1:sizeX % original mat has 32 which is larger than nfeature=31 by 1 fwrite(fid,model.filters(filternum).w(iY,iX,1:nfeature),'double'); % need verify end end fprintf(fid,'ttt</Weights>n'); fprintf(fid,'ttt<!-- Linear term in score function -->n'); fprintf(fid,'ttt<LinearTerm>%.16f</LinearTerm>n',... % need verify model.rules{model.start}(icom).offset.w); fprintf(fid,'tt</RootFilter>n'); fprintf(fid,'tt<!-- Part filters description -->n'); fprintf(fid,'tt<PartFilters>n'); %在每个component内,获取part filter的个数,并获取每个part的参数 npart = length(model.rules{model.start}(icom).rhs) -1 ; fprintf(fid,'ttt<NumPartFilters>%d</NumPartFilters>n',npart); %%获取每个part的相关参数[dx,dy,ds]和penalty[dx dy dxx dyy] for ipart = 2: npart+1 fprintf(fid,'ttt<!-- Part filter ? description -->n'); fprintf(fid,'ttt<PartFilter>n'); irule = model.rules{model.start}(icom).rhs(ipart); filternum = model.symbols(model.rules{irule}.rhs).filter; sizeX = model.filters(filternum).size(2); sizeY = model.filters(filternum).size(1); fprintf(fid,'tttt<sizeX>%d</sizeX>n',sizeX); fprintf(fid,'tttt<sizeY>%d</sizeY>n',sizeY); fprintf(fid,'tttt<!-- Weights (binary representation) -->n'); fprintf(fid,'tttt<Weights>'); for iY = 1:sizeY for iX = 1:sizeX % original mat has 32 which is larger than nfeature=31 by 1 fwrite(fid,'double'); % need verify end end fprintf(fid,'tttt</Weights>n'); fprintf(fid,'tttt<!-- Part filter offset -->n'); fprintf(fid,'tttt<V>n'); fprintf(fid,'ttttt<Vx>%d</Vx>n',model.rules{model.start}(icom).anchor{ipart}(1)+1); %[dx,ds] fprintf(fid,'ttttt<Vy>%d</Vy>n',model.rules{model.start}(icom).anchor{ipart}(2)+1); fprintf(fid,'tttt</V>n'); fprintf(fid,'tttt<!-- Quadratic penalty function coefficients -->n'); fprintf(fid,'tttt<Penalty>n'); fprintf(fid,'ttttt<dx>%.16f</dx>n',model.rules{irule}.def.w(2)); fprintf(fid,'ttttt<dy>%.16f</dy>n',model.rules{irule}.def.w(4)); fprintf(fid,'ttttt<dxx>%.16f</dxx>n',model.rules{irule}.def.w(1)); fprintf(fid,'ttttt<dyy>%.16f</dyy>n',model.rules{irule}.def.w(3)); fprintf(fid,'tttt</Penalty>n'); fprintf(fid,'ttt</PartFilter>n'); end fprintf(fid,'tt</PartFilters>n'); fprintf(fid,'t</Component>n'); end fprintf(fid,'</Model>n'); fclose(fid); end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读