自己制作的数据集每个类别都相互在一起,数据集并未打乱,为增加训练得到一个好的识别精度和强的泛化能力,所以在训练之前使用shuffle函数去打乱每次训练数据的顺序。不打乱数据集会导致网络在学习过程中产生一定的偏见问题,降低了数据集的丰富度。
import numpy as np
import cv2
import os
import random
import xml.etree.ElementTree as ET
#原始图片路径和xml文件路径
image_root = 'D:/VOCdevkit/JPEGImages/'
xml_root='D:/VOCdevkit/Annotations/'
image_list = os.listdir(image_root)
xml_list=os.listdir(xml_root)
#打乱后的输出图片路径和xml文件路径
image_output = 'D:/VOCdevkit/111/'
xml_output='D:/VOCdevkit/222/'
index = [i for i in range(len(image_list))]
print(len(image_list))
print(len(xml_list))
random.shuffle(index)
a=np.array(index)
num=1
for i in a:
img_name=image_list[i]
xml_name=xml_list[i]
print('修改第', i+1, '个',' 生成第',num,'个')
img_path = image_root + img_name
xml_path = xml_root+xml_name
I = cv2.imread(img_path)
xmlDoc = ET.parse(xml_path)
root = xmlDoc.getroot()
sub1 = root.find('filename')
img_save_path = image_output + str(num) + '.jpg'
xml_save_path = xml_output+str(num)+'.xml'
sub1.text =str(num)+'.jpg'
cv2.imwrite(img_save_path, I)
xmlDoc.write(xml_save_path)
num+=1