dpm模型转换,*.mat转*.xml,利用opencv做dpm检测
发布时间:2020-12-15 23:03:12 所属栏目:百科 来源:网络整理
导读:非常感谢P. Felzenszwalb开源了dpm的代码,也同样感谢opencv实现了C++版本的dpm检测部分。但这里需要将matllab训练出来的*.mat模型转换成opencv下可以使用的.xml模型,转换代码如下: function MAT2XMLmodel_401(matmodel,xmlfile)matmodel = 'sofa_final';x
非常感谢P. Felzenszwalb开源了dpm的代码,也同样感谢opencv实现了C++版本的dpm检测部分。但这里需要将matllab训练出来的*.mat模型转换成opencv下可以使用的.xml模型,转换代码如下:
function MAT2XMLmodel_401(matmodel,xmlfile) matmodel = 'sofa_final'; xmlfile = 'sofa_final.xml'; 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); nfeature = 31; fprintf(fid,'t<!-- Number of features -->n'); fprintf(fid,'t<P>%d</P>n',nfeature); fprintf(fid,'t<!-- Score threshold -->n'); fprintf(fid,'t<ScoreThreshold>%.16f</ScoreThreshold>n',model.thresh); layer = 1; 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'); npart = length(model.rules{model.start}(icom).rhs) -1 ; fprintf(fid,'ttt<NumPartFilters>%d</NumPartFilters>n',npart); 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,'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,dy,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |