关于coco128的txt转voc格式

数据集在如下地址下载,yolov5的github下载的有个别数据对不上:

链接: https://pan.baidu.com/s/1taUkSaWoEh_26uwb8m7Ebg 提取码: 4h6p 
--来自百度网盘超级会员v5的分享

处理脚本如下:

import os
import xml.etree.ElementTree as ET
from PIL import Image
import xml.dom.minidom

# 检测结果中的类别列表
classes = ["person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
           "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
           "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
           "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
           "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
           "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
           "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
           "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
           "hair drier", "toothbrush"]


def convert_txt_to_xml(txt_file_, xml_dir_):
    # 读取txt文件中每个检测结果,并创建XML标签
    root = ET.Element("annotation")
    img_folder = "./coco128/images/train2017"
    # 获取图像文件路径和宽度、高度、深度
    img_path = os.path.join(img_folder, os.path.splitext(os.path.basename(txt_file_))[0] + ".jpg")
    img = Image.open(img_path)
    width, height = img.size
    depth = 3
    path = os.path.abspath(img_path)

    # 添加各种标签信息
    ET.SubElement(root, "folder").text = img_folder
    ET.SubElement(root, "filename").text = os.path.basename(img_path)
    ET.SubElement(root, "path").text = path
    source_tag = ET.SubElement(root, "source")
    ET.SubElement(source_tag, "database").text = "Unknown"
    size_tag = ET.SubElement(root, "size")
    ET.SubElement(size_tag, "width").text = str(width)
    ET.SubElement(size_tag, "height").text = str(height)
    ET.SubElement(size_tag, "depth").text = str(depth)
    ET.SubElement(root, "segmented").text = "0"

    with open(txt_file_) as f:
        for line in f:
            parts = line.strip().split()
            class_id = int(parts[0])
            x_center = float(parts[1])
            y_center = float(parts[2])
            w = float(parts[3])
            h = float(parts[4])

            x_min = (x_center - (w / 2)) * width
            y_min = (y_center - (h / 2)) * height
            x_max = (x_center + (w / 2)) * width
            y_max = (y_center + (h / 2)) * height

            object_tag = ET.SubElement(root, "object")
            ET.SubElement(object_tag, "name").text = classes[class_id]
            ET.SubElement(object_tag, "pose").text = "Unspecified"
            ET.SubElement(object_tag, "truncated").text = "1"
            ET.SubElement(object_tag, "difficult").text = "0"
            bndbox_tag = ET.SubElement(object_tag, "bndbox")

            ET.SubElement(bndbox_tag, "xmin").text = str(int(x_min))
            ET.SubElement(bndbox_tag, "ymin").text = str(int(y_min))
            ET.SubElement(bndbox_tag, "xmax").text = str(int(x_max))
            ET.SubElement(bndbox_tag, "ymax").text = str(int(y_max))

    # 创建XML文件

    if not os.path.exists(xml_dir_):
        os.makedirs(xml_dir_)
    xml_file_ = os.path.join(xml_dir_, os.path.splitext(os.path.basename(txt_file_))[0] + ".xml")
    tree = ET.ElementTree(root)
    tree.write(xml_file_)


if __name__ == "__main__":
    # 设置目录路径和文件扩展名
    dir_path = "./coco128/labels/train2017"
    ext = ".txt"
    xml_dir = "./datasets/annotations"

    # 遍历目录中的文件,并对扩展名为.txt的文件进行转换
    for file_name in os.listdir(dir_path):
        if file_name.endswith(ext):
            txt_file = os.path.join(dir_path, file_name)
            convert_txt_to_xml(txt_file, xml_dir)

    # 格式化
    # 遍历文件夹中的所有文件
    for filename in os.listdir(xml_dir):
        if filename.endswith('.xml'):
            # 打开XML文件并解析
            xml_file = os.path.join(xml_dir, filename)
            print(xml_file)
            dom = xml.dom.minidom.parse(xml_file)

            # 格式化XML并保存
            formatted_xml = dom.toprettyxml(indent='  ')
            with open(xml_file, 'w') as f:
                f.write(formatted_xml)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
COCO 格式换为 VOC 格式可以使用以下步骤: 1. 安装 Python COCO API ``` pip install pycocotools ``` 2. 创建 voc 格式目标文件夹 ``` mkdir VOCdevkit/VOC2007 mkdir VOCdevkit/VOC2007/Annotations mkdir VOCdevkit/VOC2007/ImageSets mkdir VOCdevkit/VOC2007/JPEGImages ``` 3. 将 COCO 图片复制到 JPEGImages 文件夹中 ``` cp path/to/coco/images/* VOCdevkit/VOC2007/JPEGImages/ ``` 4. 使用以下代码将 COCO 标注文件换为 VOC 格式的 XML 文件 ```python import json import xml.etree.ElementTree as ET import os # COCO 类别名称到 VOC 类别名称的映射 coco_to_voc = { "person": "person", "bicycle": "bicycle", "car": "car", "motorcycle": "motorbike", "airplane": "aeroplane", "bus": "bus", "train": "train", "truck": "truck", "boat": "boat", "traffic light": "traffic_light", "fire hydrant": "fire_hydrant", "stop sign": "stop_sign", "parking meter": "parking_meter", "bench": "bench", "bird": "bird", "cat": "cat", "dog": "dog", "horse": "horse", "sheep": "sheep", "cow": "cow", "elephant": "elephant", "bear": "bear", "zebra": "zebra", "giraffe": "giraffe", "backpack": "backpack", "umbrella": "umbrella", "handbag": "handbag", "tie": "tie", "suitcase": "suitcase", "frisbee": "frisbee", "skis": "skis", "snowboard": "snowboard", "sports ball": "sports_ball", "kite": "kite", "baseball bat": "baseball_bat", "baseball glove": "baseball_glove", "skateboard": "skateboard", "surfboard": "surfboard", "tennis racket": "tennis_racket", "bottle": "bottle", "wine glass": "wine_glass", "cup": "cup", "fork": "fork", "knife": "knife", "spoon": "spoon", "bowl": "bowl", "banana": "banana", "apple": "apple", "sandwich": "sandwich", "orange": "orange", "broccoli": "broccoli", "carrot": "carrot", "hot dog": "hot_dog", "pizza": "pizza", "donut": "donut", "cake": "cake", "chair": "chair", "couch": "sofa", "potted plant": "potted_plant", "bed": "bed", "dining table": "dining_table", "toilet": "toilet", "tv": "tv_monitor", "laptop": "laptop", "mouse": "mouse", "remote": "remote", "keyboard": "keyboard", "cell phone": "cell_phone", "microwave": "microwave", "oven": "oven", "toaster": "toaster", "sink": "sink", "refrigerator": "fridge", "book": "book", "clock": "clock", "vase": "vase", "scissors": "scissors", "teddy bear": "teddy_bear", "hair drier": "hair_drier", "toothbrush": "toothbrush" } # COCO 标注文件路径 ann_file = 'path/to/coco/annotations.json' # VOC 目标文件夹路径 voc_dir = 'VOCdevkit/VOC2007/' # 加载 COCO 标注文件 with open(ann_file, 'r') as f: coco_data = json.load(f) # 对每个图像处理 for img_data in coco_data['images']: # 创建 VOC XML 文件 xml_file = ET.Element('annotation') ET.SubElement(xml_file, 'folder').text = 'VOC2007' ET.SubElement(xml_file, 'filename').text = img_data['file_name'] source = ET.SubElement(xml_file, 'source') ET.SubElement(source, 'database').text = 'COCO 2017' ET.SubElement(source, 'annotation').text = 'COCO 2017' ET.SubElement(source, 'image').text = 'Flickr' size = ET.SubElement(xml_file, 'size') ET.SubElement(size, 'width').text = str(img_data['width']) ET.SubElement(size, 'height').text = str(img_data['height']) ET.SubElement(size, 'depth').text = '3' ET.SubElement(xml_file, 'segmented').text = '0' # 查找该图像的所有标注框 bbox_list = [] for ann_data in coco_data['annotations']: if ann_data['image_id'] == img_data['id']: bbox = ann_data['bbox'] bbox_list.append(bbox) # 对每个标注框处理 for bbox in bbox_list: # COCO 格式VOC 格式 x_min = bbox[0] y_min = bbox[1] x_max = bbox[0] + bbox[2] y_max = bbox[1] + bbox[3] class_name = coco_to_voc[coco_data['categories'][ann_data['category_id']-1]['name']] # 创建 VOC XML 标注 obj = ET.SubElement(xml_file, 'object') ET.SubElement(obj, 'name').text = class_name ET.SubElement(obj, 'pose').text = 'Unspecified' ET.SubElement(obj, 'truncated').text = '0' ET.SubElement(obj, 'difficult').text = '0' bndbox = ET.SubElement(obj, 'bndbox') ET.SubElement(bndbox, 'xmin').text = str(int(x_min)) ET.SubElement(bndbox, 'ymin').text = str(int(y_min)) ET.SubElement(bndbox, 'xmax').text = str(int(x_max)) ET.SubElement(bndbox, 'ymax').text = str(int(y_max)) # 将 XML 文件保存到 VOC 目标文件夹中 xml_str = ET.tostring(xml_file) with open(os.path.join(voc_dir, 'Annotations', img_data['file_name'].replace('.jpg', '.xml')), 'wb') as f: f.write(xml_str) ``` 5. 创建 VOC 格式的图像列表文件 ```python import os # VOC 目标文件夹路径 voc_dir = 'VOCdevkit/VOC2007/' # 获取所有 VOC 图像文件名 img_files = os.listdir(os.path.join(voc_dir, 'JPEGImages')) # 创建 VOC 图像列表文件 with open(os.path.join(voc_dir, 'ImageSets', 'Main', 'trainval.txt'), 'w') as f: for img_file in img_files: img_name = img_file.replace('.jpg', '') f.write(img_name + '\n') ``` 完成以上步骤,您就可以将 COCO 数据集换为 VOC 格式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lindsayshuo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值