学生在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的转换处理完成!!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐