紧接上次,我的最终目的现在是滑动窗口切割图片并且同步标签。需要对xml文件进行读写。
python报错xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 3, column 50
我的解决方式最后我发现一个问题目标框好像被移动了。
所以最后我是xml文件转txt标签,然后根据txt文件新建xml文件,还可以没有错误啦!
xml标签 to yolov4txt标签
'''#这个文件为对ann_path_origin和img_path_origin选取特定类别的图片和xml
#生成的结果为一个图,一个txt文件,这个代码删除了只添加正样本(含有想要检测对象的样本),意味着尽管这张图片没有包含目标也会被写入txt
不会复制提取出来的图片
'''
import os
from tqdm import tqdm
import shutil
import xml.etree.ElementTree as ET
import xml
ann_path_origin = r'/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/Annotations/' #要提取的ann的xml标签文件路径,按需修改
img_path_origin = r'/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/JPEGImages/' #要提取的Image文件路径,按需修改
# img_savepath = r'/home/xys/CppProjects/darknet/xinding/obj/' #要保存到的Images文件路径,按需修改
txt_save_path = r'/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/labels/' #存入txt的路径,,按需修改
class_names_path=r'/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/class.txt' #类别文件路径
#-----------------------函数定义------------------------------------
def read_class_name(path): #读取path下的类别民
f = open(path,'r')
classes_name = []
for i in f.readlines():
classes_name.append(i.strip())
return classes_name
def mkr(path):
'''
如果path存在,就先删除所有内容再创建,否则直接创建
'''
if os.path.exists(path):#先删除再创建
shutil.rmtree(path)#递归删除目录树
os.mkdir(path)#创建目录
else:
os.mkdir(path)#如果不存在则直接创建
names = locals()
classes_name = read_class_name(class_names_path) #读取类别信息,按需修改
# mkr(img_savepath) #创建文件夹
mkr(txt_save_path)
count = 0
for xml_file_name in tqdm(os.listdir(ann_path_origin),ncols=150):
file_name = xml_file_name[:-4]
xml_file = open(ann_path_origin+xml_file_name,errors='ignore') #打开xml文件
tree = ET.parse(xml_file)
# try:
# tree = ET.parse(xml_file)
# except xml.etree.ElementTree.ParseError:
# print(xml_file_name)
# file_front = xml_file_name[:-4]
# shutil.move(ann_path_origin+xml_file_name, '/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/新建文件夹')
# shutil.move(img_path_origin+file_front+'.jpg', '/home/xys/CloundShiProjects/traffic_light/trafficlight_dect/data/新建文件夹')
root = tree.getroot() #得到根
image_width = int(root.find('size').find('width').text)
image_height = int(root.find('size').find('height').text)
all_line = []
for obj in root.iter('object'):
diffcult = obj.find('difficult').text #找到difficult,难以识别的类
cls_name = obj.find('name').text
if cls_name not in classes_name or int(diffcult) == 1:
continue
#--------------------下面的语句表示存在这个boundingbox,将此boundingbox的坐标类别写入到xml里-------------------
xmlbox = obj.find('bndbox') #找到boundingbox标签
xmin = int(float(xmlbox.find('xmin').text))
ymin = int(float(xmlbox.find('ymin').text))
xmax = int(float(xmlbox.find('xmax').text))
ymax = int(float(xmlbox.find('ymax').text))
#将boundingbox的四个坐标准换成中心点的坐标和boundingbox的宽高,并且转换映射到0-1
cls_id = classes_name.index(cls_name)
bb_h, bb_w = ymax - ymin, xmax - xmin
if image_width == 0 or image_height == 0:
continue
coodr_x, coord_y = (xmin + bb_w / 2) / image_wid