我已经构建了一个数据集来训练YOLOv4,并且我拥有YOLO格式的所有标签(我使用的是LabelImg)。现在我想用相同的数据集训练SSD,因此我需要PASCAL VOC格式的标签。我已经看到了一些方法来做相反的转换(voc到yolo),但不是我要找的那个。由于我有数以千计的图像,我想找到一种方法来自动化整个过程,而不必逐个查看每个图像/标签。
有没有人对如何处理这个问题有什么想法?
提前感谢!
发布于 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。希望这对你的帮助不亚于对我的帮助。
发布于 2021-10-27 01:36:06
我和我的同学已经创建了一个名为PyLabel的python包来帮助其他人完成这项任务和其他标记任务。您可以在此笔记本https://github.com/pylabel-project/samples/blob/main/yolo2coco.ipynb中看到一个示例。
一般的解决方案与上面提到的相同,但代码封装在这个包中,因此您只需正确编写最少的代码。例如:
!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中找到幕后使用的源代码
发布于 2021-07-06 18:49:19
这里是创建XML的脚本,当提供了相关信息时,即脚本开头的变量。
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,因此它可以帮助您转换坐标。
附注:你可以循环上面的代码,使其适用于多个文件。
https://stackoverflow.com/questions/68245781
复制相似问题