【问题标题】:How to convert YOLO annotations (.txt) to PASCAL VOC (.xml)?如何将 YOLO 注释 (.txt) 转换为 PASCAL VOC (.xml)?
【发布时间】:2021-09-15 14:58:11
【问题描述】:

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

有人对如何解决这个问题有任何想法吗?

提前致谢!

【问题讨论】:

    标签: computer-vision label object-detection yolo


    【解决方案1】:

    我也遇到了同样的问题。我写了一个脚本来为你做这个转换。您可以在此处找到代码的链接: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。希望这对您的帮助和对我的帮助一样多。

    【讨论】:

      【解决方案2】:

      我和我的同学创建了一个名为 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

      【讨论】:

        【解决方案3】:

        这是用于创建 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 以便帮助您进行坐标转换。

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

        【讨论】:

          猜你喜欢
          • 2021-02-11
          • 2015-11-19
          • 1970-01-01
          • 2020-02-11
          • 1970-01-01
          • 2022-07-14
          • 2022-12-25
          • 2023-02-25
          • 2011-08-28
          相关资源
          最近更新 更多