【数据转换】对mask图像数据转为xml标签数据

关键词: python 、mask 、 xml 、opencv 、IRSTD-1K、NUDT-SIRST

背景

Mask图像数据通常是通过某种分割算法或工具生成的,其中每个像素都被赋予了一个标签,表示其所属的目标或区域。最近我图省事情,在网上找了一些红外小目标的开源数据集,但是自己的任务是做目标检测,所以需要对mask图像数据转为xml格式数据。

xml与mask分析

XML格式的标注数据内容在深度学习、计算机视觉等领域中扮演着重要的角色。在图像标注领域,XML文件通常用于存储图像中各个目标或区域的标签信息。 XML格式的标注数据内容通常包含以下几个关键部分:

  1. 文件头部
  2. 图像信息
  3. 目标或区域列表
    • 目标或区域属性
  4. 其他辅助信息

样例:

shell 复制代码
<annotation>
    <folder>aa</folder>
    <filename>XDU1.png</filename>
    <path>C:/Users/kiven/Desktop/aa/XDU1.png</path>
    <source>
       <database>Unknown</database>
    </source>
    <size>
       <width>512</width>
       <height>512</height>
       <depth>1</depth>
    <segmented>0</segmented>
    <object>
       <name>1</name>
       <pose>Unspecified</pose>
       <truncated>0</truncated>
       <difficult>0</difficult>
       <bndbox>
          <xmin>113</xmin>
          <ymin>251</ymin>
          <xmax>125</xmax>
          <ymax>265</ymax>
       </bndbox>
    </object>
    <object>
       <name>1</name>
       <pose>Unspecified</pose>
       <truncated>0</truncated>
       <difficult>0</difficult>
       <bndbox>
          <xmin>107</xmin>
          <ymin>290</ymin>
          <xmax>110</xmax>
          <ymax>296</ymax>
       </bndbox>
    </object>
</annotation>

对于IRSTD-1K和NUDT-SIRST数据集在这里查看后得到:mask图像为二值图,黑底白色表示目标区域。

转换

通过分析mask图像我们可以很清晰得到目标区域为白色区域(二值图),因此我们可以利用opencv中的 cv2.findContours函数得到白色目标,然后计算外接最小矩形即可得到目标区域坐标。然后根据xml信息进行逐步填充信息进行调试即可:

shell 复制代码
import os
import cv2

def put_xml(xml_name, img_name, img_dir, width, height, lab_objects):
    # write in xml file
    xml_file = open("C:/Users/kiven/Desktop/VOC2007/" + xml_name, 'w')
    xml_file.write('<annotation>\n')
    xml_file.write('    <folder>VOC2007</folder>\n')
    xml_file.write('    <filename>' + img_name + '</filename>\n')
    xml_file.write('    <path>' + img_dir + '</path>\n')
    xml_file.write('    <size>\n')
    xml_file.write('        <width>' + str(width) + '</width>\n')
    xml_file.write('        <height>' + str(height) + '</height>\n')
    xml_file.write('        <depth>3</depth>\n')
    xml_file.write('    </size>\n')

    for lab_object in lab_objects:

        xml_file.write('    <object>\n')
        xml_file.write('        <name>' + "0" + '</name>\n')
        xml_file.write('        <pose>Unspecified</pose>\n')
        xml_file.write('        <truncated>0</truncated>\n')
        xml_file.write('        <difficult>0</difficult>\n')
        xml_file.write('        <bndbox>\n')
        xml_file.write('            <xmin>' + str(lab_object[0]) + '</xmin>\n')
        xml_file.write('            <ymin>' + str(lab_object[1]) + '</ymin>\n')
        xml_file.write('            <xmax>' + str(lab_object[2]) + '</xmax>\n')
        xml_file.write('            <ymax>' + str(lab_object[3]) + '</ymax>\n')
        xml_file.write('        </bndbox>\n')
        xml_file.write('    </object>\n')

    xml_file.write('</annotation>')
    xml_file.close()


def make_xml(img_path, img_name):
    img_dir = img_path + "/" + img_name
    # 读取图像
    image = cv2.imread(img_dir, cv2.IMREAD_GRAYSCALE)
    height, width = image.shape[:2]
    # 查找所有的连通区域
    contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 遍历所有的连通区域
    boxx = []
    for contour in contours:
        # 计算每个连通区域的最小外接矩形
        x, y, w, h = cv2.boundingRect(contour)
        # 打印最小外接矩形的坐标和大小
        print(f"白色区域的最小外接矩形坐标: ({x}, {y}),宽度: {w},高度: {h}")
        boxx.append([x, y, x + w, y + h])
    return img_dir, boxx, height, width


if __name__ == '__main__':
    img_path = "C:/Users/kiven/Desktop/VOC2007"
    for img_name in os.listdir(img_path):
        img_dir, boxx, height, width = make_xml(img_path, img_name)
        xml_name = img_name[:-4] + ".xml"
        put_xml(xml_name, img_name, img_dir, width, height, boxx)

结语

行!有了这个代码生成是xml标注信息,后续的实验数据又新增了不少

相关推荐
诗句藏于尽头13 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
通街市密人有13 小时前
IDF: Iterative Dynamic Filtering Networks for Generalizable Image Denoising
人工智能·深度学习·计算机视觉
智数研析社13 小时前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人13 小时前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python
moxiaoran575314 小时前
Flask学习笔记(一)
后端·python·flask
秋氘渔14 小时前
迭代器和生成器的区别与联系
python·迭代器·生成器·可迭代对象
Gu_shiwww14 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
qingyunliushuiyu15 小时前
BI数据可视化:驱动数据价值释放的关键引擎
数据挖掘·数据分析·数据分析系统·数据分析平台·bi数据可视化
七元权15 小时前
论文阅读-Correlate and Excite
论文阅读·深度学习·注意力机制·双目深度估计
ViperL115 小时前
[智能算法]可微的神经网络搜索算法-FBNet
人工智能·深度学习·神经网络