物体检测标注格式转换-coco2xml

import os
import json
import cv2
from lxml import etree
import xml.etree.cElementTree as ET
import time

id_list = [1,2,3,18,19,62,73,74,76,84]
names_list = ['person', 'bicycle','car','dog','horse','chair','laptop','mouse','keyboard','book']
im_ext = 'jpg'
COCO_images = '/home/zxzhao/dataset/public/COCO2017/coco/val2017'
Json_addr = '/home/zxzhao/dataset/public/COCO2017/coco/annotations/instances_val2017.json'
im_num = 1000
ob_count = 0
im_pairs = dict()


main_dir = time.strftime("%Y-%m-%d-%H:%M:%S")

xml_dir = os.path.join(main_dir, 'annotations_xml')  
# print(xml_dir)
# exit() 
if not os.path.isdir(xml_dir):
    os.makedirs(xml_dir)

im_dir = os.path.join(main_dir, 'images')   
if not os.path.isdir(im_dir):
    os.makedirs(im_dir)


print('Reading JSON ...')

with open(Json_addr) as json_data:
    annotation_list = json.load(json_data)

start_time = time.time()
print('--- Start Operation ---', start_time)

for i in range(0, len(annotation_list["annotations"])):
    category_id = annotation_list["annotations"][i]["category_id"]

    if category_id in id_list:
        # print('HIT -->', im_num)
        cat_name = names_list[id_list.index(category_id)]
        im_id = (str(annotation_list["annotations"][i]["image_id"]))
        xmin = int(annotation_list["annotations"][i]["bbox"][0])
        ymin = int(annotation_list["annotations"][i]["bbox"][1])
        xmax = int(xmin+annotation_list["annotations"][i]["bbox"][2])
        ymax = int(ymin+annotation_list["annotations"][i]["bbox"][3])

        z = '0'
        for sf in range((len(im_id)), 11):   # imname 12 basamaklı olması için
            z = z + "0"
        im_name = z + im_id
        print(im_name)

        if os.path.exists(os.path.join(im_dir, str(im_pairs.get(im_name, 'None')) + '.' + im_ext)):
            # ---add object to imnum.xml---

            # read the xml root
            tree = ET.parse(os.path.join(xml_dir, str(im_pairs[im_name]) + '.xml'))
            root = tree.getroot()

            # Convert root to etree

            xml_str = ET.tostring(root)
            troot = etree.fromstring(xml_str)  # etree object

            # create new object element
            ob = etree.Element('object')
            etree.SubElement(ob, 'name').text = cat_name
            etree.SubElement(ob, 'pose').text = 'Unspecified'
            etree.SubElement(ob, 'truncated').text = '0'
            etree.SubElement(ob, 'difficult').text = '0'

            bbox = etree.SubElement(ob, 'bndbox')
            etree.SubElement(bbox, 'xmin').text = str(xmin)
            etree.SubElement(bbox, 'ymin').text = str(ymin)
            etree.SubElement(bbox, 'xmax').text = str(xmax)
            etree.SubElement(bbox, 'ymax').text = str(ymax)

            # prettify the object
            xml_str = etree.tostring(ob, pretty_print=True)
            ob_pretty = etree.fromstring(xml_str)

            # append etree object to etree root(troot)
            troot.append(ob_pretty)

            # overwrite the old xml
            xml_str = etree.tostring(troot, pretty_print=True)

            with open(os.path.join(xml_dir, str(im_pairs[im_name]) + '.xml'), 'wb') as output:
                output.write(xml_str)

            print('--- Added {} to '.format(cat_name), str(im_pairs[im_name]) + '.xml' ' ---')

        else:

            # Copy image as im_num.jpg
            with open(os.path.join(COCO_images, im_name + '.' + im_ext), 'rb') as rf:
                with open(os.path.join(im_dir, str(im_num) + '.' + im_ext), 'wb') as wf:
                    for line in rf:
                        wf.write(line)
            # make imnum.xml

            # -get imsize(widht, height, depth)

            # Resimlerin olduğu klasör
            im_cv2 = cv2.imread(os.path.join(COCO_images, im_name + '.' + im_ext))
            height, width, depth = im_cv2.shape

            # Form the file

            annotation = ET.Element('annotation')
            ET.SubElement(annotation, 'folder').text = im_dir
            ET.SubElement(annotation, 'filename').text = str(im_num) + '.' + im_ext
            ET.SubElement(annotation, 'segmented').text = '0'
            size = ET.SubElement(annotation, 'size')
            ET.SubElement(size, 'width').text = str(width)
            ET.SubElement(size, 'height').text = str(height)
            ET.SubElement(size, 'depth').text = str(depth)

            ob = ET.SubElement(annotation, 'object')
            ET.SubElement(ob, 'name').text = cat_name
            ET.SubElement(ob, 'pose').text = 'Unspecified'
            ET.SubElement(ob, 'truncated').text = '0'
            ET.SubElement(ob, 'difficult').text = '0'

            bbox = ET.SubElement(ob, 'bndbox')
            ET.SubElement(bbox, 'xmin').text = str(xmin)
            ET.SubElement(bbox, 'ymin').text = str(ymin)
            ET.SubElement(bbox, 'xmax').text = str(xmax)
            ET.SubElement(bbox, 'ymax').text = str(ymax)

            # Save the file

            xml_str = ET.tostring(annotation)
            root = etree.fromstring(xml_str)
            xml_str = etree.tostring(root, pretty_print=True)  # Entire content of the xml

            save_path = os.path.join(xml_dir, str(im_num) + '.' + 'xml')  # Create save path with imnum.xml

            with open(save_path, 'wb') as temp_xml:
                temp_xml.write(xml_str)
            # keep record of which xml is paired with which image from coco_Set
            im_pairs[im_name] = im_num

            print('Copied imfile--> {} --- Object count--> {}'.format(str(im_num) + '.' + im_ext, ob_count))

            im_num += 1
        ob_count += 1
print('Finished with {} objects in {} images in {} seconds'.format(ob_count, im_num, time.time() - start_time))

https://github.com/huipengzhang/COCO2XML

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 将 VOC 格式转换为 COCO 格式的步骤如下: 1. 首先需要安装 COCO API,可以参考官方文档进行安装。 2. 创建 COCO 数据集的目录结构,其中包括 `annotations` 和 `images` 两个文件夹。`annotations` 文件夹下存放的是 COCO 数据集的标注文件,`images` 文件夹下存放的是 COCO 数据集的图片文件。 3. 将 VOC 格式标注文件转换为 COCO 格式标注文件,可以使用以下 Python 代码: ```python import xml.etree.ElementTree as ET import json def voc2coco(xml_path, save_path): tree = ET.parse(xml_path) root = tree.getroot() images = [] annotations = [] categories = [{'id': 1, 'name': 'class_name'}] # 将 class_name 替换为实际的类别名称 for i, child in enumerate(root): if child.tag == 'filename': filename = child.text image = {'id': i, 'file_name': filename} images.append(image) elif child.tag == 'object': bbox = [] class_id = 1 # 将 1 替换为实际的类别 ID for subchild in child: if subchild.tag == 'name': class_name = subchild.text elif subchild.tag == 'bndbox': for subsubchild in subchild: bbox.append(float(subsubchild.text)) annotation = { 'id': i, 'image_id': i, 'category_id': class_id, 'bbox': bbox, 'area': bbox[2] * bbox[3], 'iscrowd': 0 } annotations.append(annotation) data = { 'images': images, 'annotations': annotations, 'categories': categories } with open(save_path, 'w') as f: json.dump(data, f) ``` 其中,`xml_path` 是 VOC 格式标注文件路径,`save_path` 是 COCO 格式标注文件保存路径。 4. 将 VOC 格式的图片文件复制到 COCO 数据集的 `images` 文件夹下。 5. 运行以下 Python 代码,生成 COCO 数据集的 `instances_train.json`: ```python from pycococreatortools import create_coco_dataset image_dir = 'path/to/images' annotation_dir = 'path/to/annotations' output_dir = 'path/to/output' create_coco_dataset(image_dir, annotation_dir, output_dir) ``` 其中,`image_dir` 是 COCO 数据集的 `images` 文件夹路径,`annotation_dir` 是 COCO 数据集的 `annotations` 文件夹路径,`output_dir` 是 COCO 数据集的输出路径。 6. 最后,将生成的 COCO 数据集的 `instances_train.json` 与 COCO API 中的其他文件一起使用,可以进行训练和评估。 ### 回答2: 将VOC格式转换为COCO格式可以通过以下步骤实现: 1. 首先,需要将VOC格式标注文件.xml转换为相应的COCO格式标注文件.json。可以使用Python的xml.etree.ElementTree模块来解析.xml文件,并提取出包含目标类别、边界框坐标等信息。 2. 在转换过程中,需要为每个目标类别分配一个唯一的整数ID,并将其映射为COCO格式中的类别名。可以在转换过程中创建一个类别映射字典,将VOC格式的类别名映射为COCO格式。 3. 在提取目标边界框信息时,需要将VOC格式中的坐标值转换为相对于图像宽度和高度的比例值,并计算每个边界框的面积。 4. 在生成COCO格式标注文件时,需要依照COCO格式的要求,构建相应的数据结构,包括images、annotations和categories等字段。其中,images字段包含图像的文件名、宽度、高度等信息,annotations字段包含目标边界框的ID、坐标、类别ID等信息,categories字段包含类别ID和类别名。 5. 最后,将生成的COCO格式标注文件.json保存下来,以便后续使用。 值得注意的是,在处理VOC格式转换为COCO格式的过程中,需要注意数据的一致性和准确性,以确保目标类别、边界框等信息的正确性,并根据具体需求进行相应的适配和调整。 ### 回答3: 将voc格式转换为coco格式是一种常见的数据格式转换过程,可以用于目标检测任务的数据准备。下面是一个简要的步骤来实现这个转换过程。 首先,我们需要了解voc格式和coco格式的基本概念。 VOC格式是一种用于图像识别和目标检测的数据集格式,其中包含图像文件和对应的标签文件。标签文件中通常包含目标的位置、类别、边界框等信息。 COCO格式是一种用于图像识别、目标检测和语义分割的数据集格式,它将图像和标签信息合并在一个JSON文件中。JSON文件中包含了图像的ID、文件名、图片大小,以及目标的类别、边界框等信息。 下面是将voc格式转换为coco格式的步骤: 1. 首先,我们需要读取voc格式的标签文件,提取其中的目标类别、边界框等信息,并记录对应的图像文件路径。 2. 然后,创建一个空的coco格式的JSON文件,并定义coco格式的基本结构,包括图像信息和目标信息。 3. 遍历每张图像,将图像信息添加到JSON文件中的“images”字段中,并生成该图像的唯一ID。 4. 对于每个目标,提取其类别、边界框等信息,并将其添加到JSON文件的“annotations”字段中。同样地,为每个目标生成唯一ID,并将其与图像ID关联。 5. 最后,将生成的JSON文件保存下来,即可完成voc格式到coco格式转换。 综上所述,将voc格式转换为coco格式需要将voc格式的标签信息读取并整理,然后按照coco格式的结构重新组织数据,并生成一个新的JSON文件。这样就完成了voc格式到coco格式转换
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值