首页 前端知识 YoloV5划分自己的数据集并将json文件(矩形标注)转换为yolo可以识别的txt文件(全过程/服务器上搭建)

YoloV5划分自己的数据集并将json文件(矩形标注)转换为yolo可以识别的txt文件(全过程/服务器上搭建)

2024-05-24 09:05:48 前端知识 前端哥 584 815 我要收藏

1. 划分数据集
将图片数据集划随机划分为训练:验证:测试=6:2:2的比例,同时划分对应的json目录文件。废话不多说,直接上代码:

import os
import random
import shutil

# 指定原始数据目录
images_dir = "images"
json_dir = "Annotations"

# 指定目标输出目录
output_dir_images = "../../datasets/fish/images"
output_dir_json = "../../datasets/fish/annotations"

# 创建目标输出目录
if not os.path.exists(output_dir_images):
    os.makedirs(output_dir_images)
if not os.path.exists(output_dir_json):
    os.makedirs(output_dir_json)

# 创建训练集、验证集和测试集子目录
subdirectories = ["train", "val", "test"]

for subdir in subdirectories:
    subdir_path_images = os.path.join(output_dir_images, subdir)
    subdir_path_json = os.path.join(output_dir_json, subdir)

    if not os.path.exists(subdir_path_images):
        os.makedirs(subdir_path_images)
    if not os.path.exists(subdir_path_json):
        os.makedirs(subdir_path_json)

# 获取图像文件和 JSON 文件列表
image_files = [f for f in os.listdir(images_dir) if f.endswith(".jpg")]
json_files = [f for f in os.listdir(json_dir) if f.endswith(".json")]

# 打乱数据的顺序
random.shuffle(image_files)

# 计算划分的数据集大小
total_samples = len(image_files)
train_size = int(total_samples * 0.6)
val_size = int(total_samples * 0.2)
test_size = total_samples - train_size - val_size

# 划分数据集
train_images = image_files[:train_size]
val_images = image_files[train_size:train_size + val_size]
test_images = image_files[train_size + val_size:]

# 移动图像文件到对应的子目录
for image_file in train_images:
    src_path_images = os.path.join(images_dir, image_file)
    dest_path_images = os.path.join(output_dir_images, "train", image_file)
    shutil.copy(src_path_images, dest_path_images)

for image_file in val_images:
    src_path_images = os.path.join(images_dir, image_file)
    dest_path_images = os.path.join(output_dir_images, "val", image_file)
    shutil.copy(src_path_images, dest_path_images)

for image_file in test_images:
    src_path_images = os.path.join(images_dir, image_file)
    dest_path_images = os.path.join(output_dir_images, "test", image_file)
    shutil.copy(src_path_images, dest_path_images)

# 移动 JSON 文件到对应的子目录
for json_file in json_files:
    base_name = os.path.splitext(json_file)[0]
    if f"{base_name}.jpg" in train_images:
        src_path_json = os.path.join(json_dir, json_file)
        dest_path_json = os.path.join(output_dir_json, "train", json_file)
        shutil.copy(src_path_json, dest_path_json)
    elif f"{base_name}.jpg" in val_images:
        src_path_json = os.path.join(json_dir, json_file)
        dest_path_json = os.path.join(output_dir_json, "val", json_file)
        shutil.copy(src_path_json, dest_path_json)
    elif f"{base_name}.jpg" in test_images:
        src_path_json = os.path.join(json_dir, json_file)
        dest_path_json = os.path.join(output_dir_json, "test", json_file)
        shutil.copy(src_path_json, dest_path_json)

print("数据集划分完成。")

路径都用的是相对路径,如果不理解相对路径,可以这么理解:就是以此文件的路径开始,**举个例子:**我的images图片目录和此划分数据集的文件在同一个目录之下,则输入图片目录的时候,就直接写入图片的目录名称即可:
在这里插入图片描述

可以从图中看到,我的划分代码和images目录在在同一个目录VOCData下面。所以输入的图片目录就是:
在这里插入图片描述
…/ 这里的…(两个.)代表上级目录,因为我是用linux服务器进行划分的。
以下是我的目录格式,可以进行参考:
在这里插入图片描述
执行过后,两个数据集(images,json)就被划分为了train,val,test三个子目录。并且这两个数据集的子目录的文件都是一一对应的。如图所示:
在这里插入图片描述
此刻,划分数据集到此结束!
2. json转txt
因为上一步把json的文件夹划分为了train,val和test三个子目录,接下来要做的就是将这三个子目录的json文件都转换为txt文件。这个可以参考我的上一篇文章:python实现将一个文件夹中的多个 JSON 文件批量转换为 YOLO 可以识别的 TXT 文件

转载请注明出处或者链接地址:https://www.qianduange.cn//article/9355.html
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!