admin管理员组文章数量:1609966
今天想查看一个数据集的标注情况时出现了如下错误:
点击打开原xml文件发现与精灵助手导出的xml文件格式是有一定差别的,就想将原格式文件做一个批量转换。代码如下所示:
# _*_encoding:utf-8_*_
import os, sys
import glob
from PIL import Image
import xml.etree.ElementTree as ET
import numpy as np
classes = ['person', 'hat'] # 类别
def convert_annotation(voc_path, image_id):
print(f"已转换:{image_id}")
in_file = open(voc_path + '/%s.xml' % (image_id), 'rb')
# 解析xml文件
tree = ET.parse(in_file)
# 获得对应的键值对
root = tree.getroot()
bbox = [] # 初始化
cls_id = []
for obj in root.iter('object'):
# 获得difficult
difficult = obj.find('difficult').text
# 获得类别 =string 类型
cls = obj.find('name').text
# 通过类别名称找到id
cls_id.append(classes.index(cls))
# 找到bndbox 对象
xmlbox = obj.find('bndbox')
# 获取对应的bndbox的数组 = ['xmin','xmax','ymin','ymax']
bbox.append(
[xmlbox.find('xmin').text, xmlbox.find('ymin').text, xmlbox.find('xmax').text, xmlbox.find('ymax').text])
return bbox, cls_id
src_img_dir = "data/VOC2028/JPEGImages"
src_txt_dir = r"data/VOC2028/Annotations" # 源文件夹
src_xml_dir = r"data/VOC2028/convert_ann" # 保存文件夹
img_Lists = glob.glob(src_img_dir + '/*.jpg')
img_basenames = []
for item in img_Lists:
img_basenames.append(os.path.basename(item))
img_names = []
for item in img_basenames:
temp1, temp2 = os.path.splitext(item)
img_names.append(temp1)
for img in img_names:
img_path = src_img_dir + '\\' + img + '.jpg'
im = Image.open(img_path)
width, height = im.size
gt, cls_id = convert_annotation(src_txt_dir, img)
xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')
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}.jpg</filename>\n')
xml_file.write(' <path>' + img_path + '</path>\n')
xml_file.write(' <outputs>\n')
xml_file.write(' <object>\n')
count = 0
for spt in 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')
count += 1
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>')
其中要修改的地方一个是classes列表,改为自己分类的名称就好了;另外要修改的是你原xml文件和转换格式后的xml文件保存的文件夹。最后转换效果如下所示,种类和位置都能够显示出来了:
(ps:我也不知道为什么就总有十张图无法完成导入,但是xml文件是全部完成转换了的,求大佬告知)
版权声明:本文标题:解决精灵标注助手暂不支持导入pascal文件 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728585596a1164904.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论