【Python】随机划分数据集并生成VOC格式列表

在这里插入图片描述

1.Introduction

做目标检测时,用LabelImg生成的 xml 文件需要和对应的图片文件名,生成VOC格式列表。同时需要按照一定比例划分为训练集、验证集和测试集。
在这里插入图片描述

2.Materials and methods

上述功能可以分为四步:

(1)读取图片名或者xml文件名(这俩一样)
(2)对文件名列表打乱顺序
(3)按比例从乱序表中抽取文件名
(4)拼接字符串,写入txt文件

话不多说,上代码:

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 30 14:49:41 2020

@author: YaoYee
"""

import os
import random

READ_DIR = 'C:/Users/YaoYee/Desktop/data/Annotations'
WRITE_DIR = 'C:/Users/YaoYee/Desktop/data'

TRAIN_RATIO = 0.7
VAL_RATIO = 0.2
TEST_RATIO = 0.1

imgs = os.listdir(READ_DIR)
# Shuffle list imgs in place.
random.shuffle(imgs)  

with open(WRITE_DIR+'/train_list.txt', 'w') as f:
    for im in imgs[0:int(len(imgs)*TRAIN_RATIO)]:
        info = 'JPEGImages/'+im+' '
        info += 'Annotations/'+im[0:4]+'.xml\n'
        f.write(info)

with open(WRITE_DIR+'/val_list.txt', 'w') as f:
    for im in imgs[int(len(imgs)*TRAIN_RATIO):int(len(imgs)*(TRAIN_RATIO+VAL_RATIO))]:
        info = 'JPEGImages/'+im+' '
        info += 'Annotations/'+im[0:4]+'.xml\n'
        f.write(info)

with open(WRITE_DIR+'/test_list.txt', 'w') as f:
    for im in imgs[int(len(imgs)*(TRAIN_RATIO+VAL_RATIO)):]:
        info = 'JPEGImages/'+im+' '
        info += 'Annotations/'+im[0:4]+'.xml\n'
        f.write(info)

print('The data length is:', len(imgs))
print('The train_data length is:', int(len(imgs)*TRAIN_RATIO))
print('The val_data length is:', int(len(imgs)*(TRAIN_RATIO+VAL_RATIO))-int(len(imgs)*TRAIN_RATIO))
print('The test_data length is:', len(imgs)-int(len(imgs)*(TRAIN_RATIO+VAL_RATIO)))

如果想按原顺序划分数据集,在代码中把下面行注释掉就行了~

#random.shuffle(imgs)  

3. Results and discussion

运行下看看效果~
在这里插入图片描述
可以发现,效果还是很好的,不过细心的小伙伴可能发现了,这里并没有生成Label文件,也就是没有读取xml文件里的label信息,本文暂时不涉及这块(后面再说)。

如果用paddle的话,官方已经实现了划分+读取标签,可直接调用,如下:

import paddlex

!paddlex --split_dataset --format VOC --dataset_dir C:\Users\YaoYee\Desktop\data --val_value 0.2 --test_value 0.1

4. Conclusion

Python真好用~

猜你喜欢:👇🏻
【Python】如何在文件夹里批量分割图片?
【Python】如何在文件夹里批量替换文本中的内容?
【Python】如何在文件夹里批量修改文件名?(0001-1000)

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值