将数据集Voc .xml转为Matlab 的GroundTruth

文章讲述了如何处理从PyTorch的Yolo模型得到的检测框输出,在MATLAB中因数据格式问题需要重新训练。主要内容涉及XML(VOC)格式的数据,特别是XML到MATLAB的标签转换,以及读取XML文件并将其内容存储到表格中的过程。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个码农都是奢望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值