精灵标注助手无法导入pascal文件

问题:

今天想导入一个数据集的标注情况时出现了如下错误:

原因以及解决方法:

点击打开原xml文件发现与精灵助手导出的xml文件格式是有一定差别的,就想将原格式文件做一个批量转换。其中要修改的地方一个是classes列表,改为自己分类的名称就好了;另外要修改的是你原xml文件和转换格式后的xml文件保存的文件夹。

代码如下:

# _*_encoding:utf-8_*_

import os
import glob
from PIL import Image
import xml.etree.ElementTree as ET
import numpy as np

classes = ['0pig','1pig','2pig','3pig','4pig','5pig','6pig','8pig','9pig','12pig','13pig','16pig','19pig','21pig']  # 类别

def convert_annotation(voc_path, image_id):
    print(f"已转换:{image_id}")
    xml_path = os.path.join(voc_path, f"{image_id}.xml")
    
    try:
        # 解析xml文件
        tree = ET.parse(xml_path)
         # 获得对应的键值对
        root = tree.getroot()
        
        bbox = []
        cls_id = []
        for obj in root.iter('object'):
            # 获得类别 =string 类型
            cls = obj.find('name').text
             # 通过类别名称找到id
            cls_id.append(classes.index(cls))
            # 找到bndbox 对象   
            xmlbox = obj.find('bndbox')
            bbox.append(
                [xmlbox.find('xmin').text, xmlbox.find('ymin').text, xmlbox.find('xmax').text, xmlbox.find('ymax').text])
        
        return bbox, cls_id
    except Exception as e:
        print(f"Error processing {xml_path}: {e}")
        return [], []

src_img_dir = r"7"  #图片所在文件夹
src_txt_dir = r"xml" # 源文件夹
src_xml_dir = r"annotation"  # 保存文件夹

img_Lists = glob.glob(os.path.join(src_img_dir, '*.jpg'))

for img_path in img_Lists:
    img_name = os.path.splitext(os.path.basename(img_path))[0]
    im = Image.open(img_path)
    width, height = im.size

    gt, cls_id = convert_annotation(src_txt_dir, img_name)

    xml_file_path = os.path.join(src_xml_dir, f"{img_name}.xml")
    with open(xml_file_path, 'w') as xml_file:
        xml_file.write('<?xml version="1.0" ?>\n')
        xml_file.write('<doc>\n')
        xml_file.write(f'<folder>{src_img_dir}</folder>\n')
        xml_file.write(f'<filename>{img_name}.jpg</filename>\n')
        xml_file.write('    <path>' + img_path + '</path>\n')
        xml_file.write('    <outputs>\n')
        xml_file.write('        <object>\n')

        for count, spt in enumerate(gt):
            xml_file.write('            <item>\n')
            xml_file.write(f'                <name>{classes[int(cls_id[count])]}</name>\n')
            xml_file.write('                <bndbox>\n')
            xml_file.write('                    <xmin>' + spt[0] + '</xmin>\n')
            xml_file.write('                    <ymin>' + spt[1] + '</ymin>\n')
            xml_file.write('                    <xmax>' + spt[2] + '</xmax>\n')
            xml_file.write('                    <ymax>' + spt[3] + '</ymax>\n')
            xml_file.write('                </bndbox>\n')
            xml_file.write('            </item>\n')
        xml_file.write('        </object>\n')
        xml_file.write('    </outputs>\n')
        xml_file.write('    <labeled>true</labeled>\n')
        xml_file.write('    <size>\n')
        xml_file.write('        <width>' + str(width) + '</width>\n')
        xml_file.write('        <height>' + str(height) + '</height>\n')
        xml_file.write('        <depth>3</depth>\n')
        xml_file.write('    </size>\n')
        xml_file.write('</doc>')

需要修改的地方:

1.类别名称

2.图片所在文件夹路径

3.pascal源文件夹路径

4.保存文件夹路径

运行成功如图所示:

 成功转换后则可以重新导入xml文件了。

参考文章:解决精灵标注助手暂不支持导入pascal文件_精灵标注助手为啥导入不了_starryskily的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/weixin_45819759/article/details/131442039