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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在VS Code中将XML格式转换为VOC格式,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Python和所需的库。您可以使用以下命令安装所需的库: ``` pip install xmltodict ``` 2. 创建一个Python脚本文件(例如convert_xml_to_voc.py),并在VS Code中打开它。 3. 在脚本文件中,导入所需的库和模块: ```python import os import xml.etree.ElementTree as ET import xmltodict ``` 4. 定义一个函数来解析XML文件并生成VOC格式的标注数据: ```python def convert_xml_to_voc(xml_file): with open(xml_file, 'r') as f: xml_data = f.read() data_dict = xmltodict.parse(xml_data) # 提取图像尺寸信息 image_width = int(data_dict['annotation']['size']['width']) image_height = int(data_dict['annotation']['size']['height']) image_depth = int(data_dict['annotation']['size']['depth']) # 创建VOC格式的标注数据字符串 voc_data = f"{image_width}\n{image_height}\n{image_depth}\n" # 提取目标对象信息并生成VOC格式的标注数据字符串 for obj in data_dict['annotation']['object']: xmin = int(obj['bndbox']['xmin']) ymin = int(obj['bndbox']['ymin']) xmax = int(obj['bndbox']['xmax']) ymax = int(obj['bndbox']['ymax']) label = obj['name'] voc_data += f"{label} {xmin} {ymin} {xmax} {ymax}\n" return voc_data ``` 5. 定义一个函数来遍历指定目录下的所有XML文件,并调用上面的函数进行转换: ```python def batch_convert_xml_to_voc(xml_dir, output_dir): for xml_file in os.listdir(xml_dir): if xml_file.endswith('.xml'): xml_path = os.path.join(xml_dir, xml_file) voc_data = convert_xml_to_voc(xml_path) # 生成VOC格式的标注数据文件 output_file = os.path.splitext(xml_file)[0] + '.txt' output_path = os.path.join(output_dir, output_file) with open(output_path, 'w') as f: f.write(voc_data) ``` 6. 在脚本文件中,调用上面的函数并传入您的XML文件目录和输出目录: ```python xml_dir = 'path/to/xml/files' output_dir = 'path/to/output/directory' batch_convert_xml_to_voc(xml_dir, output_dir) ``` 7. 保存并运行脚本文件,它将遍历指定目录下的所有XML文件,并将转换后的VOC格式标注数据保存到指定的输出目录中。 请注意,上述代码仅提供了一个简单的示例,并假设XML文件的结构符合您的需求。您可能需要根据自己的数据集结构进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

做一个码农都是奢望

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

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

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

打赏作者

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

抵扣说明:

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

余额充值