admin管理员组文章数量:1609939
问题:
今天想导入一个数据集的标注情况时出现了如下错误:
原因以及解决方法:
点击打开原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博客
版权声明:本文标题:精灵标注助手无法导入pascal文件 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728584669a1164831.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论