当我们弄到的数据集出现这种问题时,大可不必将xml标签文件全部删掉,可以使用下面这个脚本。
import os
import shutil
def split(src, img, annota):
imges = [] # 存储所有图片的路径
annotation = [] # 存储所有xml的路径
# 第一步:遍历需要分离的文件夹
for f in os.listdir(src):
if f.endswith(".jpg"): #可以是.jpg,.png,.jpeg等等
imges.append(f)
if f.endswith(".xml"): #可以是json文件或者xml文件
annotation.append(f)
# 第二步:创建目标图片文件夹和xml文件夹
if not os.path.isdir(img): # 如果目标图片文件夹不存在
os.mkdir(img)
if not os.path.isdir(annota): # 如果目标xml文件夹不存在
os.mkdir(annota)
# 第三步:转移到目标文件夹中
for im in imges: # 遍历所有的图片,将图片文件转移到目标文件夹中
new_path = os.path.join(src, im)
print(new_path)
shutil.copy(new_path, img)
for ann in annotation: # 遍历所有的xml,将xml文件转移到目标文件夹中
new_path = os.path.join(src, ann)
print(new_path)
shutil.copy(new_path, annota)
if __name__ == "__main__":
point = r"D:\yolov11-n\river_float" # 相对路径,xml与jpg混合在一起的那个文件前面的路径地址
SrcDir = "val" # 需要分离的文件,也就是xml与jpg混合在一起的那个文件
dicimg = r"D:\yolov11-n\river_float\images\val_picture" # 用于存放jpg图片文件
dicann = r"D:\yolov11-n\river_float\images\val_xml" # 用于存放xml标签文件
src = os.path.join(point, SrcDir)
imges = os.path.join(point, dicimg)
annoations = os.path.join(point, dicann)
split(src, imges, annoations)
只需要修改主程序运行下的四个文件路径即可。