mar*_*ita 9 label object-detection computer-vision yolo
我已经构建了一个数据集来训练 YOLOv4,并且我拥有 YOLO 格式的所有标签(我使用了 LabelImg)。现在我想使用相同的数据集训练 SSD,因此我需要 PASCAL VOC 格式的标签。我已经看到了一些进行相反转换(voc 到 yolo)的方法,但不是我正在寻找的方法。由于我有数千张图像,我想找到一种方法来自动化整个过程,而不必逐一检查每个图像/标签。
有谁对如何解决这个问题有任何想法?
提前致谢!
小智 8
我曾经也有过一样的问题。我编写了一个脚本来为您完成此转换。您可以在此处找到代码链接: 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。希望这对您有帮助,就像对我有帮助一样。
小智 6
我和我的同学创建了一个名为 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)
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到幕后使用的源代码https://github.com/pylabel-project/pylabel/tree/main/pylabel
小智 1
这是用于创建 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)
Run Code Online (Sandbox Code Playgroud)
在 Yolo 格式中,您有x y width height,而在 PASCAL VOC 中,您有xmin ymin xmax ymax. 所以你必须在将它们加载到All_bboxes. 此函数将 .xml 格式转换为 .txt,因此它可以帮助您进行坐标转换。
PS 您可以循环上述代码以使其适用于多个文件。