关于目标检测中按照比例将数据集随机划分成训练集和测试集

1. 前言

在做目标检测任务的时候,不少网上的数据,没有划分数据集,只是将数据和标签放在不同的文件夹下,没有划分数据集

虽然代码简单,每次重新编写还是颇为麻烦,这里记录一下

如下,有的数据集这样摆放:

这里的py文件是划分代码,和rawDataSet 放在相同目录下

关于图像分类任务划分数据集:关于图像分类任务中划分数据集,并且生成分类类别的josn字典文件

关于xml文件生成相应的类别json字典文件:

目标检测篇:如何根据xml标注文件生成类别classes的json文件

目标检测数据的可视化:

xml : 关于目标检测任务中,XML(voc格式)标注文件的可视化

txt : 关于目标检测任务中,YOLO(txt格式)标注文件的可视化

2. 完整代码

如下:

python 复制代码
import random
import os
import shutil
from tqdm import tqdm


# 划分数据函数
def split_data(root,test_rate):
    images_path = [os.path.join(root,i) for i in os.listdir(root)]      # 获取所有图片路径
    test_split_path = random.sample(images_path, k=int(len(images_path) * test_rate))   # 随机采样测试集

    # 遍历所有图片
    for image_path in tqdm(images_path,desc='loading...'):
        # 获取相应的标注文件,这里需要根据目录、后缀更改
        label_path = image_path.replace('images','annotation')
        label_path = label_path.replace('.png','.xml')

        # 划分数据
        if image_path in test_split_path:       # 在测试集
            shutil.copy(image_path,'./data/test/images')
            shutil.copy(label_path,'./data/test/labels')
        else:
            shutil.copy(image_path,'./data/train/images')
            shutil.copy(label_path,'./data/train/labels')


if __name__ == '__main__':
    rawDataSet = './rawDataSet/images'            # 原始数据的图片路径

    if os.path.exists('./data'):        # 如果之前有,那么删除
        shutil.rmtree('./data')

    os.makedirs('./data/train/images')      # 训练集图片
    os.makedirs('./data/train/labels')      # 训练集标签
    os.makedirs('./data/test/images')       # 测试集图片
    os.makedirs('./data/test/labels')       # 测试集标签

    # 划分数据
    split_data(root=rawDataSet,test_rate=0.2)

代码运行过程:这里测试的就是五个数据

生成结果:

3. 代码使用的相关问题

不同于其他任务,脚本的运行逻辑是传入原始数据的图片目录 ,因为目标检测的标注文件和原图只是存放的目录不同,并且后缀不同,文件名是完全相同的

所以划分数据的时候,只需要找到图片,根据目录可以直接找到对应的标签

如下,第一个是目录的替换,根据数据进行更换,

第二个是图片后缀,根据自己数据集更换即可

如果是yolo标注的txt文件,也是一样的,后缀更换就行了

相关推荐
梦梦代码精1 天前
《全栈开源智能体:终结企业AI拼图时代》
人工智能·后端·深度学习·小程序·前端框架·开源·语音识别
suyong_yq1 天前
RUHMI & RA8P1 教程 Part4 - 使用 RUHMI 转换 AI 模型文件
人工智能·ai·嵌入式·arm
程序员欣宸1 天前
LangChain4j实战之十三:函数调用,低级API版本
java·人工智能·ai·langchain4j
charlie1145141911 天前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
咚咚王者1 天前
人工智能之核心基础 机器学习 第十二章 半监督学习
人工智能·学习·机器学习
人工智能训练1 天前
UE5 如何显示蓝图运行流程
人工智能·ue5·ai编程·数字人·蓝图
deephub1 天前
构建自己的AI编程助手:基于RAG的上下文感知实现方案
人工智能·机器学习·ai编程·rag·ai编程助手
AI营销干货站1 天前
工业B2B获客难?原圈科技解析2026五大AI营销增长引擎
人工智能
程序员老刘·1 天前
重拾Eval能力:D4rt为Flutter注入AI进化基因
人工智能·flutter·跨平台开发·客户端开发
kebijuelun1 天前
FlashInfer-Bench:把 AI 生成的 GPU Kernel 放进真实 LLM 系统的“闭环引擎”
人工智能·gpt·深度学习·机器学习·语言模型