HRSID舰船检测数据集标签格式转换,json转为xml

HRSID数据集介绍参考原文:https://ieeexplore.ieee.org/document/9127939

数据集下载链接:https://github.com/chaozhong2010/hrsid

雷达目标检测学习交流群私信加v

原数据集为COCO格式,标签信息全部存在train_test2017.json中,本代码将其转为VOC格式的标签,每个jpg对应一个xml,转换代码如下,仅供参考:

import xml.dom
import xml.dom.minidom
import os
# from PIL import Image
import cv2
import json

_IMAGE_PATH = r'F:\SAR_Ship\HRSID\JPEGImages'

_INDENT = ' ' * 8
_NEW_LINE = '\n'
_FOLDER_NODE = 'HRSID'
_ROOT_NODE = 'annotation'
_DATABASE_NAME = 'Unknown'
_ANNOTATION = 'VOC'
_AUTHOR = 'zc'
_SEGMENTED = '0'
_DIFFICULT = '0'
_TRUNCATED = '0'
_POSE = 'Unspecified'

# _IMAGE_COPY_PATH= 'JPEGImages'



# 封装创建节点的过程
def createElementNode(doc, tag, attr):  # 创建一个元素节点
    element_node = doc.createElement(tag)

    # 创建一个文本节点
    text_node = doc.createTextNode(attr)

    # 将文本节点作为元素节点的子节点
    element_node.appendChild(text_node)

    return element_node


def createChildNode(doc, tag, attr, parent_node):
    child_node = createElementNode(doc, tag, attr)

    parent_node.appendChild(child_node)


# object节点比较特殊
def createObjectNode(doc, attrs):
    object_node = doc.createElement('object')
    print("创建object中")
    midname = "ship"

    createChildNode(doc, 'name', midname,
                    object_node)
    createChildNode(doc, 'pose',
                    _POSE, object_node)
    createChildNode(doc, 'truncated',
                    _TRUNCATED, object_node)
    createChildNode(doc, 'difficult',
                    _DIFFICULT, object_node)
    bndbox_node = doc.createElement('bndbox')
    # print("midname1[points]:",midname1["points"])
    createChildNode(doc, 'xmin', str(int(attrs[0])),
                    bndbox_node)
    createChildNode(doc, 'ymin', str(int(attrs[1])),
                    bndbox_node)
    createChildNode(doc, 'xmax', str(int(attrs[2]) + int(attrs[0])),
                    bndbox_node)
    createChildNode(doc, 'ymax', str(int(attrs[3]) + int(attrs[1])),
                    bndbox_node)
    object_node.appendChild(bndbox_node)

    return object_node


# 将documentElement写入XML文件
def writeXMLFile(doc, filename):
    tmpfile = open('tmp.xml', 'w')
    doc.writexml(tmpfile, addindent=' ' * 8, newl='\n', encoding='utf-8')
    tmpfile.close()
    # # 删除第一行默认添加的标记
    fin = open('tmp.xml')
    fout = open(filename, 'w')
    lines = fin.readlines()
    for line in lines[1:]:
        if line.split():
            fout.writelines(line)
    fin.close()
    fout.close()


if __name__ == "__main__":
    ##json文件路径和图片路径,
    json_path = r"F:\SAR_Ship\HRSID\json/train_test2017.json"
    img_path = r"F:\SAR_Ship\HRSID\JPEGImages"
    Annotations_save_path = r'F:\SAR_Ship\HRSID\Annotations'

    fileList = os.listdir(img_path)
    # print(".....::")
    # print("fileList:", fileList)
    if fileList == 0:
        os._exit(-1)
        # 对于每一张图都生成对应的json文件
    for imageName in fileList:
        saveName = imageName.strip(".jpg")
        print(imageName)
        # 得到xml文件的名字
        xml_file_name = os.path.join(Annotations_save_path, (saveName + '.xml'))
        img = cv2.imread(os.path.join(img_path, imageName))
        height, width, channel = img.shape
        my_dom = xml.dom.getDOMImplementation()
        doc = my_dom.createDocument(None, _ROOT_NODE, None)
        # 获得根节点
        root_node = doc.documentElement
        # folder节点
        createChildNode(doc, 'folder', _FOLDER_NODE, root_node)
        # filename节点
        createChildNode(doc, 'filename', saveName + '.jpg', root_node)

        # source节点
        source_node = doc.createElement('source')
        # source的子节点
        createChildNode(doc, 'database', _DATABASE_NAME, source_node)
        # createChildNode(doc, 'annotation', _ANNOTATION, source_node)
        # createChildNode(doc, 'image', 'flickr', source_node)
        root_node.appendChild(source_node)
        size_node = doc.createElement('size')
        createChildNode(doc, 'width', str(width), size_node)
        createChildNode(doc, 'height', str(height), size_node)
        createChildNode(doc, 'depth', str(channel), size_node)
        root_node.appendChild(size_node)
        # 创建segmented节点
        createChildNode(doc, 'segmented', _SEGMENTED, root_node)
        # print("创建object节点")
        ann_data = []
        # print(json_path1)
        with open(json_path, "r") as f:
            ann = json.load(f)
            # print(ann)
        for i in range(5603):        # 0 ~ 5603  寻找与jpg_image同名的列表
            # 从第一个filename 第一个id开始循环
            # i就是图片image_id
            filename = ann["images"][i]   # 字典
            file_name = filename["file_name"]
            if imageName == file_name:
                id = filename["id"]
                annotations = ann["annotations"]     # len(annotations) = 16951
                for j in range(len(annotations)):    # 0 - 16951
                    image_id = annotations[j]["image_id"]
                    if image_id == id:                      # 说明annotations中的该行信息属于该图片
                        annotations2 = annotations[j]              # 将image_id等于id的取出来
                        object_node = createObjectNode(doc, annotations2["bbox"])
                        root_node.appendChild(object_node)
                    else:
                        continue
                continue
        # 构建XML文件名称
        # 写入文件
        writeXMLFile(doc, xml_file_name)

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
### 回答1: 水面目标检测数据集.zip 是一个包含不同水面目标的数据集压缩文件。该数据集涵盖了水面帆船、水面游艇、水面舰船、水面鸟类、水面鱼类等多种水上目标。 水面帆船指的是在水面上行驶的帆船,通常通过悬挂帆装来驱动船只。 水面游艇是一种用于娱乐和休闲的奢华船只,常被人们使用于游艇度假、水上娱乐等活动。 水面舰船是指各种类型的水上交通工具,包括商船、军舰、渔船等。它们通常用于货物运输、军事作战、渔业捕捞等领域。 水面鸟类是指在水面上栖息和活动的鸟类,它们通常依赖于水域为食、繁殖和栖息的场所。 水面鱼类是指在水面下活动或在水面上出现的鱼类。它们通常以水中的浮游生物、其他鱼类等为食物。 这个数据集的目的是为了帮助研究人员、工程师或机器学习专家等进行水面目标检测相关的科研、开发或应用。通过使用这个数据集,人们可以训练、优化和评估各种水面目标检测算法和模型,实现自动化识别和检测水面目标的能力。 这个数据集可能包含水面目标的图像、视频或其他类型的数据,可以用于训练机器学习模型、测试算法性能以及应用于实际项目中。通过对这些数据进行分析和处理,人们可以提取出各种水面目标的特征以及它们与周围环境的关系,进而实现准确、高效的水面目标检测。 这个数据集的发布对于水面目标检测技术的发展和应用具有重要意义,将为相关领域的研究和应用提供宝贵的资源和支持。 ### 回答2: 水面目标检测数据集.zip 是一个包含了各种不同水面目标的数据集。其中包括了水面帆船、水面游艇、水面舰船、水面鸟类、水面鱼类以及水等对象的图像数据。 该数据集的目的是为了提供一个用于训练和测试水面目标检测算法的资源。通过使用这个数据集,可以帮助算法模型更好地识别和定位水面上不同类型的目标物体。 水面帆船、水面游艇、水面舰船是作为水上交通工具的代表,它们在形状和大小上有所差异。水面鸟类是指那些飞行在水面上的鸟类,它们有不同的种类和姿态。水面鱼类是指水中游动的鱼类,它们的形态和大小也有所不同。 此外,数据集还包含了一些仅仅表示'水'的图像数据。这些图像主要用于提供水面背景的参考,以便帮助算法模型更好地识别目标物体。 通过使用水面目标检测数据集.zip,研究人员和开发者可以利用其中的图像数据进行算法的训练和验证。这将有助于提高水面目标检测算法的准确性和性能,从而使其在实际应用中能够更好地应对各种情况和环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值