在训练 yolox 模型做目标检测时,有时需要将数据集中的 xml 文件与对应的图片根据文件中的标签进行统一的重命名,故在此分享一个重命名的代码示例。
假设共有 4 个标签,分别为 mask、face、mask_chin、mask_mouth_chin,分别对应 0、1、2、3。如果文件只含一种标签,则按单一标签命名,否则按混合标签命名(用 mix 来代替新名称中的标签名部分)。
代码如下:
import os
import xml.etree.ElementTree as ET
import glob
def rename(xmldir, imgdir, outdir):
os.chdir(imgdir)
imgs = os.listdir('.')
imgs = glob.glob(str(imgs) + '*.jpg')
os.chdir(xmldir)
annotations = os.listdir('.')
annotations = glob.glob(str(annotations) + '*.xml')
labels = ['mask', 'face', 'mask_chin', 'mask_mouth_chin']
nums = [1, 1, 1, 1, 1]
for i, file in enumerate(annotations):
in_file = open(file, encoding = 'utf-8')
tree = ET.parse(in_file)
root = tree.getroot()
lastCla = -1
isSingle = 1
for obj in root.iter('object'):
name = obj.find('name').text
if name == "mask": cla = 0
elif name == "face": cla = 1
elif name =="mask_chin": cla = 2
elif name == 'mask_mouth_chin': cla = 3
if lastCla == -1: lastCla = cla
elif lastCla != cla:
isSingle = 0
break
in_file.close()
name = ""
if isSingle == 1:
name = str(lastCla) + "_" + labels[lastCla] + "_" + str(nums[lastCla])
nums[lastCla] = nums[lastCla] + 1
else:
name = "4_mix_" + str(nums[4])
nums[4] = nums[4] + 1
old_xml = os.path.join(os.path.abspath(xmldir), file)
new_xml = os.path.join(os.path.abspath(outdir), name + ".xml")
os.rename(old_xml, new_xml)
old_img = os.path.join(os.path.abspath(imgdir), file.split('.')[0] + '.jpg')
new_img = os.path.join(os.path.abspath(outdir), name + ".jpg")
os.rename(old_img, new_img)
xmldir = 'G:/1/xml/'
imgdir = 'G:/1/img/'
outdir = 'G:/1/rename/'
rename(xmldir, imgdir, outdir)
命名结果示例: 0_mask_1.xml 0_mask_1.jpg 0_mask_2.xml 0_mask_2.jpg …………… 1_face_1.xml 1_face_1.jpg 1_face_2.xml 1_face_2.jpg …………… 2_mask_chin_1.xml 2_mask_chin_1.jpg 2_mask_chin_2.xml 2_mask_chin_2.jpg …………… 3_mask_mouth_chin_1.xml 3_mask_mouth_chin_1.jpg 3_mask_mouth_chin_2.xml 3_mask_mouth_chin_2.jpg …………… 4_mix_1.xml 4_mix_1.jpg 4_mix_2.xml 4_mix_2.jpg ……………
|