栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

划分数据集为VOC数据格式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

划分数据集为VOC数据格式

目录
  • 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. 代码

使用本代码方法:

  1. 先确定一个数据集文件夹,先就命名为VOC2007吧(如上)
  2. 在VOC2007文件夹下面手动构建 3 个子文件夹:
    Annotations:存放所有xml标签
    JPEGImages:存放所有图像
    ImageSets:运行本代码后,自动存储划分结果
  3. 指明 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训练数据集划分-爱代码爱编程
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号