场景:labelme标注完成,有对应图片的标注json文件
需求:制作数据集
写在前面
代码部分是对图片和标注文件进行划分,最后仍需要使用脚本文件完成合并
数据集划分代码
# -*- coding: utf-8 -*-
"""
# @file name : my_make_dataset.py
# @author : Csy
# @date : 2023-06-18 12:01
# @brief : windows下 已有标注的json文件 图像 划分数据集
# 参考
# https://blog.csdn.net/ericdiii/article/details/130744352
# https://blog.csdn.net/m0_46364958/article/details/120227479?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D
"""
import os
import shutil
import random
import time
import numpy as np
np.random.seed(0)
start = time.time()
abs_base_path = os.getcwd()
dst_dir = 'dst'
images_dir = 'train_image'
labels_dir = 'data_annotated'
save_dirs = ['train', 'val', 'test']
save_subdirs = ['images', 'labels']
# mkdir
if not os.path.exists(os.path.join(abs_base_path, dst_dir)):
print("创建目标文件夹")
os.mkdir(os.path.join(abs_base_path, dst_dir))
# mk subdir
for dir in save_dirs:
for subdir in save_subdirs:
if not os.path.exists(os.path.join(abs_base_path, dst_dir, dir, subdir)):
os.makedirs(os.path.join(abs_base_path, dst_dir, dir, subdir))
# 图像列表
img_list = os.listdir(os.path.join(abs_base_path, images_dir))
label_list = os.listdir(os.path.join(abs_base_path, labels_dir))
# 判断一下
assert len(img_list) == len(label_list)
# 打乱
np.random.shuffle(img_list)
# 比例
train_ratio, val_ratio, test_ratio = 0.8, 0.1, 0.1
# 计算训练集,验证集,测试集的大小
num_images = len(img_list)
num_train = int(num_images * train_ratio)
num_val = int(num_images * val_ratio)
# 划分数据集
'''
这里的划分方式 可以使用 random
'''
train_images = img_list[:num_train]
val_images = img_list[num_train:num_train + num_val]
test_images = img_list[num_train + num_val:]
imgs_data = [train_images, val_images, test_images]
for i, type in enumerate(save_dirs):
for file_name in imgs_data[i]:
# img
src_path = os.path.join(abs_base_path, images_dir, file_name).replace('\\', '/')
dst_path = os.path.join(abs_base_path, dst_dir, save_dirs[i], save_subdirs[0], file_name).replace('\\', '/')
shutil.copy(src_path, dst_path)
# label
prefix = os.path.splitext(file_name)[0]
label_name = prefix + '.json'
src_path = os.path.join(abs_base_path, labels_dir, label_name).replace('\\', '/')
dst_path = os.path.join(abs_base_path, dst_dir, save_dirs[i], save_subdirs[1], label_name).replace('\\', '/')
shutil.copy(src_path, dst_path)
print('用时:', time.time() - start)
代码执行完毕结果
会出现 一个文件夹dst,下面有对应的train、val、test 三个文件夹,数据集已经划分好
合并处理
在 train、val、test 文件下 分别执行 下面这段代码
python labelme2coco.py labels_dir output_dir --labels labels.txt
生成符合coco文件夹格式的 output_dir【即 train val test】 文件夹,将 json 文件合并为一个【需要重命名】,
然后将这3个文件夹 放在工程中 对应数据加载的路径
done !