首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将YOLO注解(.txt)转换为PASCAL VOC (.xml)?

如何将YOLO注解(.txt)转换为PASCAL VOC (.xml)?
EN

Stack Overflow用户
提问于 2021-07-04 22:36:08
回答 3查看 2.5K关注 0票数 4

我已经构建了一个数据集来训练YOLOv4,并且我拥有YOLO格式的所有标签(我使用的是LabelImg)。现在我想用相同的数据集训练SSD,因此我需要PASCAL VOC格式的标签。我已经看到了一些方法来做相反的转换(voc到yolo),但不是我要找的那个。由于我有数以千计的图像,我想找到一种方法来自动化整个过程,而不必逐个查看每个图像/标签。

有没有人对如何处理这个问题有什么想法?

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2021-07-12 03:38:14

我也遇到过同样的问题。我写了一个脚本,它将为您完成此转换。您可以在此处找到代码的链接:https://github.com/JPM-Tech/Object-Detection/tree/main/Scripts/converters/convert-yolo-to-xml.py。这是一些文档的链接,这些文档是关于如何使用它的:https://github.com/JPM-Tech/Object-Detection/tree/main/Scripts/converters#convert-yolo-to-xml。希望这对你的帮助不亚于对我的帮助。

票数 5
EN

Stack Overflow用户

发布于 2021-10-27 01:36:06

我和我的同学已经创建了一个名为PyLabel的python包来帮助其他人完成这项任务和其他标记任务。您可以在此笔记本https://github.com/pylabel-project/samples/blob/main/yolo2coco.ipynb中看到一个示例。

一般的解决方案与上面提到的相同,但代码封装在这个包中,因此您只需正确编写最少的代码。例如:

代码语言:javascript
复制
!pip install pylabel
from pylabel import importer
dataset = importer.ImportYoloV5(path=path_to_annotations)
dataset.export.ExportToVoc(dataset)

您可以在https://github.com/pylabel-project/pylabel/tree/main/pylabel中找到幕后使用的源代码

票数 1
EN

Stack Overflow用户

发布于 2021-07-06 18:49:19

这里是创建XML的脚本,当提供了相关信息时,即脚本开头的变量。

代码语言:javascript
复制
import numpy as np
from pathlib import Path
import xml.etree.cElementTree as ET
from PIL import Image
import os

image_path = "" # provide image path
anno_folder = "" # provide .XML folder path
filename = "" # provide image name
#Read each bounding box as a list of dictionary and append it in the list for each file
All_bboxes = "[{"xmin":1433,"xmax":1503,"ymin":1570,"ymax":1700,"skuLabel":"bus"}]" 


img = np.array(Image.open(image_path).convert('RGB'))

annotation = ET.Element('annotation')
ET.SubElement(annotation, 'folder').text = str(anno_folder)
ET.SubElement(annotation, 'filename').text = str(filename)
ET.SubElement(annotation, 'path').text = str(filename)

source = ET.SubElement(annotation, 'source')
ET.SubElement(source, 'database').text = 'Unknown'

size = ET.SubElement(annotation, 'size')
ET.SubElement(size, 'width').text = str (img.shape[1])
ET.SubElement(size, 'height').text = str(img.shape[0])
ET.SubElement(size, 'depth').text = str(img.shape[2])

ET.SubElement(annotation, 'segmented').text = '0'

for item in All_bboxes:
    label = item['Label']
    xmax = item['xmax']
    xmin = item['xmin']
    ymin = item['ymin']
    ymax = item['ymax']

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

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

tree = ET.ElementTree(annotation)
xml_file_name = os.path.join(anno_folder, f'{filename.split('.')[0]}.xml')
tree.write(xml_file_name)

在Yolo格式中,你有x y width height,而在PASCAL VOC中,你有xmin ymin xmax ymax。因此,您必须在将它们加载到All_bboxes中时对其进行转换。This函数将.xml格式转换为.txt,因此它可以帮助您转换坐标。

附注:你可以循环上面的代码,使其适用于多个文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68245781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档