学生在pytorch做的模型,尝试在matlab导入,存在问题。
主要是yolo检测框输出一个1*25200*(cls+6),这个25200展平数据无法处理,所以需要在maltab中进行重新训练。
遇到问题就是.voc xml格式转matlab的 labelling数据问题。多年前解决过,但忘了!!
1 .xml voc格式
关键是.xml格式,也没有matlab的代码的代码。
2 .xml 读取
2.1 为什么没有通用的模块?
我对xml读取不熟悉,读取后是一个结构体,需要根据标注对象来提取标注数据。
读取,xml的结果
看到上面了吧,所有结构都镶嵌在cell数据里,需要解析。
xmlfilepath=' 你的xml目录
txtsavepath=' 计划存储的目录
trainval_percent=0.7;
train_percent=0.7;
xmlfile=dir(xmlfilepath); %%我只用了这个。。。
numOfxml=length(xmlfile)-2;
trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
test=sort(setdiff(1:numOfxml,trainval));
trainvalsize=length(trainval);
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
val=sort(setdiff(trainval,train));
ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');
for i=1:numOfxml
if ismember(i,trainval)
fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
if ismember(i,train)
fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
else
fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
end
else
fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);
xmlfile包含了所有xml的文件。
2.2 数据转存到表格
将数据存到表格里,先产生一个GPRDATA的表格变量
读取数据存入表格,先生成表格
num1=length(xmlfile)
GPRData = table('Size', [num1 6],'VariableTypes',{'cell','cell','cell','cell','cell','cell'},'VariableNames',{'imagefilename','A','B','cavity', 'crack' ,'Dimension'}); %% table
读取数据存到表格中
tempmax=0
iCount=0;
for i=1:length(xmlfile)
filename=[xmlfile(1).folder '\' xmlfile(i).name];
DOMnode = parseXML(filename);
if length(DOMnode.Children)>=14 % 才有标记的图
A=[];B=[];C=[];D=[];Temp=zeros(1,4);StrClss='';
% DOMnode.Children(14).Children(10).Children;
iCount=iCount+1;
% GPRData.imagefilename{iCount}=[xmlfile(i).folder '\' xmlfile(i).name];%存入名字
%更改文图片地址 zhangjun,将.xml存为图片,如.png
Tempname=xmlfile(i).name;
strpath='J:\Experiment\2023\DDD\datasetGPRimage\images';
GPRData.imagefilename{iCount}=[strpath '\' Tempname(1:end-3) 'png'];%存入名字
%进一步读取 检测框的值
for j=12:length(DOMnode.Children) %一般从14开始
if strcmp(DOMnode.Children(j).Name,'object')%含有目标
xmin=str2double(DOMnode.Children(j).Children(10).Children(2).Children.Data);
ymin=str2double(DOMnode.Children(j).Children(10).Children(4).Children.Data);
xmax=str2double(DOMnode.Children(j).Children(10).Children(6).Children.Data);
ymax=str2double(DOMnode.Children(j).Children(10).Children(8).Children.Data);
%转换为x,y,w,h格式
Temp(1)=xmin;Temp(2)=ymin;Temp(3)=xmax-xmin;Temp(4)=ymax-ymin;
%图片尺寸
height1=str2double(DOMnode.Children(10).Children(4).Children.Data);
width1=str2double(DOMnode.Children(10).Children(2).Children.Data);
%% 判断是哪一类的进行矩阵合并
StrClss=DOMnode.Children(j).Children( ...
2).Children.Data;
switch StrClss
case 'A'
A=vertcat(A,Temp);
case 'B'
B=vertcat(B,Temp);
case 'cavity'
C=vertcat(C,Temp);
case 'crack'
D=vertcat(D,Temp);
end
end
%% 结果输出
%分配数据到表格。。。
end
GPRData.Dimension{iCount}=[height1, width1];
GPRData.A{iCount,1}=A;GPRData.B{iCount,1}=B;
GPRData.cavity{iCount,1}=C;GPRData.crack{iCount,1}=D;
end
end
3 转到GroundTruth
看我前期的帖子,这样可以用imagelabeler工具修正,或者直接trainnetwork了。。
1min可以把voc格式转换成功。
成功了!!
这样,voc格式到matlab的转换处理完成!!