目标检测划分数据集

目标检测划分数据集

训练检测在数据采集、数据标注后需要划分数据集,一般对标注的数据集划分为训练集和验证集,用于一些通用算法 的训练,如YOLO、SSD、faster-RCNN等

# -*- coding:utf8 -*-
import time
import os
import random
import cv2


t_1 = time.time()
imgs_path = './drone-roi-low/images/train/'
anns_path = './drone-roi-low/labels/train/'

name = 'fruits_dataset' # 划分后数据集文件夹名,随意更改
img_train_path ='./'+name+'/images/train/'  #图片训练集保存路径
img_val_path = './'+name+'/images/val/'     #图片验证集保存路径
labels_train_path = './'+name+'/labels/train/'       #标签训练集保存路径
labels_val_path = './'+name+'/labels/val/'           #标签验证集保存路径
if not os.path.exists(img_train_path):
    os.makedirs(img_train_path)
if not os.path.exists(img_val_path):
    os.makedirs(img_val_path)
if not os.path.exists(labels_train_path):
    os.makedirs(labels_train_path)
if not os.path.exists(labels_val_path):
    os.makedirs(labels_val_path)

imgs = os.listdir(imgs_path)
anns = os.listdir(anns_path)
random.seed(2021)                           #设置一个随机种子,确保每次运行都按照既定的随机形式
random.shuffle(imgs)
train_set_rate = 0.8
train_set_num = int(len(imgs) * train_set_rate)

train_name_list = []
val_name_list = []
num_img = 0
num_train_set = 0
num_val_set = 0
for i ,img in enumerate(imgs) :
    image = cv2.imread(imgs_path + img)
    if i <= train_set_num:
        img = img.split('.')
        train_name_list.append(img[0])
        img = str.join('.', img)
        cv2.imwrite(img_train_path + img , image)
        num_train_set+=1

    else:
        img = img.split('.')
        val_name_list.append(img[0])
        img = str.join('.',img)
        cv2.imwrite(img_val_path+ img, image)
        num_val_set+=1
    i+=1
    num_img+=1
    print('num_img----------------------',i)

print('train_set--------------',num_train_set)
print('val_set-----------------',num_val_set)
print('图片总数量-----------------------',num_img)

ann_train = 0
ann_val = 0
num = 0
for ann in anns:
    ann = ann.split('.')
    if (ann[0] in train_name_list) :
        ann = str.join('.',ann)
        with open(anns_path + ann ,'r', encoding = 'UTF-8')as f:
            with open(labels_train_path + ann ,'w')as s:
                s.write(f.read())
        ann_train+=1

    elif (ann[0] in val_name_list):
        ann = str.join('.', ann)
        with open(anns_path + ann, 'r',encoding = 'UTF-8')as f:
            with open(labels_val_path + ann, 'w')as s:
                s.write(f.read())
        ann_val+=1
    num+=1
t_2 = time.time()
print('ann_train--------------------',ann_train)
print('ann_val----------------------',ann_val)
print('totle_num---------------------',num)
print('time==========================',t_2 - t_1)
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个示例的Python代码,用于将目标检测数据集划分为训练集和验证集: ```python import os import random import shutil def split_dataset(dataset_dir, train_ratio=0.8, seed=42): # 创建目标文件夹 train_dir = os.path.join(dataset_dir, 'train') val_dir = os.path.join(dataset_dir, 'val') os.makedirs(train_dir, exist_ok=True) os.makedirs(val_dir, exist_ok=True) random.seed(seed) # 获取数据集图片列表 image_files = [] for filename in os.listdir(dataset_dir): if filename.endswith('.jpg') or filename.endswith('.png'): image_files.append(filename) # 随机打乱图片列表 random.shuffle(image_files) # 计算划分点 split_index = int(len(image_files) * train_ratio) # 将图片拷贝到训练集文件夹 for filename in image_files[:split_index]: src = os.path.join(dataset_dir, filename) dst = os.path.join(train_dir, filename) shutil.copyfile(src, dst) # 将图片拷贝到验证集文件夹 for filename in image_files[split_index:]: src = os.path.join(dataset_dir, filename) dst = os.path.join(val_dir, filename) shutil.copyfile(src, dst) # 使用示例 dataset_dir = '/path/to/dataset' split_dataset(dataset_dir, train_ratio=0.8, seed=42) ``` 请将代码中的`/path/to/dataset`替换为你的目标检测数据集所在的路径。`train_ratio`参数表示训练集所占比例,默认为0.8。`seed`参数用于设置随机种子,确保可重复性,默认为42。 该代码会在给定的数据集路径下创建`train`和`val`两个文件夹,并将按照指定比例随机划分的图片拷贝到对应的文件夹中。你可以根据需要修改文件夹名称和拷贝方式等细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stsdddd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值