我有一个关于分割20k图像及其标签的数据集的问题,该数据集的格式为YOLOv3
,其中有一个图像文件和一个与图像同名的.txt
文件,文本文件内部有标签。
我想将数据集分割成训练/测试分割,是否有办法随机选择图像及其标签。txt文件,并使用Python
将其存储在单独的文件夹中?
我希望能够随机分割数据集。例如,选择16k的文件以及标签文件,并将它们单独存储在train文件夹中,剩余的4k应该存储在test文件夹中。
这可以在文件资源管理器中手动完成,通过选择前16k文件并将它们移动到不同的文件夹,但拆分不会是随机的,因为我计划对相同的数据集一遍又一遍地这样做。
下面是数据的样子图片和标签截图
我建议你看看下面的Python内置模块
- 水珠 随机操作系统
- shutill
用于在Python中操作文件和路径。这里是我的代码与注释,可能会解决你的问题。很简单
import glob
import random
import os
import shutil
# Get all paths to your images files and text files
PATH = 'path/to/dataset/'
img_paths = glob.glob(PATH+'*.jpg')
txt_paths = glob.glob(PATH+'*.txt')
# Calculate number of files for training, validation
data_size = len(img_paths)
r = 0.8
train_size = int(data_size * 0.8)
# Shuffle two list
img_txt = list(zip(img_paths, txt_paths))
random.seed(43)
random.shuffle(img_txt)
img_paths, txt_paths = zip(*img_txt)
# Now split them
train_img_paths = img_paths[:train_size]
train_txt_paths = txt_paths[:train_size]
valid_img_paths = img_paths[train_size:]
valid_txt_paths = txt_paths[train_size:]
# Move them to train, valid folders
train_folder = PATH+'train/'
valid_folder = PATH+'valid/'
os.mkdir(train_folder)
os.mkdir(valid_folder)
def move(paths, folder):
for p in paths:
shutil.move(p, folder)
move(train_img_paths, train_folder)
move(train_txt_paths, train_folder)
move(valid_img_paths, valid_folder)
move(valid_txt_paths, valid_folder)