为 YOLOv3 分割基于图像的数据集

Splitting image based dataset for YOLOv3

我有一个关于拆分 20k 图像及其标签的数据集的问题,数据集的格式为 YOLOv3,其中有一个图像文件和一个同名的 .txt 文件作为图片,文本文件里面有标签。

我想将数据集拆分成 train/test 个拆分,有没有办法随机 select 图像及其标签 .txt 文件并使用 [= 将其存储在单独的文件夹中12=]?

我希望能够随机拆分数据集。例如,select 16k 文件连同标签文件也将它们分别存储在 train 文件夹中,其余 4k 应存储在 test 文件夹中。

这可以在文件资源管理器中手动完成,方法是 select 将前 16k 个文件移动到不同的文件夹,但拆分不会是随机的,因为我打算一遍又一遍地这样做对于相同的数据集。

这是数据的样子 images and labels screenshot

我建议你看看下面的Python内置模块

用于操作 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)