- 1. VOC数据格式
- 2. 代码
1. VOC数据格式
VOC数据集格式-参考
VOCdevkit(数据集名称) ├── VOC2007 ├── Annotations 进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应 ├── ImageSets 包含三个子文件夹 Layout、Main、Segmentation,其中 Main 存放的是分类和检测的数据集分割文件 ├── Main │ ├── train.txt 写着用于训练的图片名称, 共 2501 个 │ ├── val.txt 写着用于验证的图片名称,共 2510 个 │ ├── trainval.txt train与val的合集。共 5011 个 │ ├── test.txt 写着用于测试的图片名称,共 4952 个 ├── JPEGImages 存放 .jpg 格式的图片文件 ├── SegmentationClass 存放按照 class 分割的图片 (object detection 不会使用到) └── SegmentationObject 存放按照 object 分割的图片 (object detection 不会使用到)
2. 代码
使用本代码方法:
- 先确定一个数据集文件夹,先就命名为VOC2007吧(如上)
- 在VOC2007文件夹下面手动构建 3 个子文件夹:
Annotations:存放所有xml标签
JPEGImages:存放所有图像
ImageSets:运行本代码后,自动存储划分结果 - 指明 3 个文件地址:images_dir、xml_dir、save_dir,再运行本代码即可
import os
import random
image_ext = ['.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff']
def img_and_existxml(x, xml_list): # 是图像文件且存在标签
xname, ext = os.path.splitext(x)
if ext not in image_ext:
return False
else:
return xname + '.xml' in xml_list
rate = 0.9 # 接近于8:1:1 (9:1):1
images_dir = r'D:A_datasetthreepeopleimages' # 所有图像路径
xml_dir = r'D:A_datasetthreepeoplelabels_xml' # 所有xml标签路径
save_dir = r'D:A_datasetthreepeopleImageSets'
if __name__ == '__main__':
if not os.path.exists(images_dir):
print('fileDir not exists.')
else:
if not os.path.exists(save_dir):
os.makedirs(save_dir)
save_main_dir = os.path.join(save_dir, 'Main')
os.makedirs(save_main_dir)
xml_list = os.listdir(xml_dir)
filelist = [x for x in os.listdir(images_dir) if img_and_existxml(x, xml_list)]
random.seed(0) # 设置随机数种子,保证每次得到的随机采样值相同
trainval_list = random.sample(filelist, int(rate * len(filelist))) # 随机采样
train_list = random.sample(trainval_list, int(rate * len(trainval_list))) # 随机采样
trainval_txt = open(os.path.join(save_main_dir, 'trainval.txt'), 'w')
train_txt = open(os.path.join(save_main_dir, 'train.txt'), 'w')
val_txt = open(os.path.join(save_main_dir, 'val.txt'), 'w')
test_txt = open(os.path.join(save_main_dir, 'test.txt'), 'w')
num = [0, 0, 0, 0]
res_txt = open(os.path.join(save_main_dir, 'result.txt'), 'w')
for file in filelist:
filename, _ = os.path.splitext(file)
if file in trainval_list:
trainval_txt.write(filename + 'n') # 写入trainval.txt
num[0] += 1
if file in train_list:
train_txt.write(filename + 'n') # 写入train.txt
num[1] += 1
else:
val_txt.write(filename + 'n') # 写入val.txt
num[2] += 1
else: # 测试集
test_txt.write(filename + 'n') # 写入test.txt
num[3] += 1
trainval_txt.close()
train_txt.close()
val_txt.close()
test_txt.close()
# 记录结果
res_txt.write('trainval: {}'.format(num[0]) + 'n')
res_txt.write('train: {}'.format(num[1]) + 'n')
res_txt.write('val: {}'.format(num[2]) + 'n')
res_txt.write('test: {}'.format(num[3]))
res_txt.close()
print('yes, saved in {}'.format(save_main_dir))
print('trainval: {}'.format(num[0]))
print('train: {}'.format(num[1]))
print('val: {}'.format(num[2]))
print('test: {}'.format(num[3]))
参考链接:
- python将文件夹内的数据集按比例随机划分为训练集测试集,并移至其他目录
- yolov5训练数据集划分-爱代码爱编程



