yolov5 数据集预处理(多文件夹同时提取文件并分类)(同时随机提取一定比例的图片和txt文件到指定文件)

yolov5 数据集预处理

最近老师要求了一个任务,要开始训练数据集了。

然后我就看到了密密麻麻已经将图片标记好的压缩包,jpg,txt,csv,zip文件全部都跑到了一起,我想着不能纯手工分类吧,50多个文件夹,我不得分死。所以就尝试着对这些数据分类了。

解压大家需要自行解压哈

功能

将文件夹内的东西全部移出,并删除空文件夹。同时可以将txt,jpg,csv,zip,rar文件分别放在不同的文件夹内。(这些文件夹如果没有会自动创建)

同时还有按照一定比例随机抽取文件的功能。

下面会有函数的讲解!

先附上代码:

已经给大家写好注释了,注意看哈

# 这是移文件的脚本
import csv
import imp
import random
import shutil
import os
import glob
import os, random, shutil

'''这是个移动文件的函数'''
def move_file(old_path, new_path,flag):        #前者可以是文件(文件夹)   后者为文件夹 flag 用于判断是否为文件夹
    if flag == 0:
        filelist = os.listdir(old_path) #列出该目录下的所有文件,listdir返回的文件列表是不包含路径的。
        for file in filelist:
            src = os.path.join(old_path, file)
            dst = os.path.join(new_path, file)
            shutil.move(src, dst)
    elif flag ==1:                      #如果不为文件夹,直接移动文件到指定目录
        src = old_path
        dst = new_path
        shutil.move(src, dst)


'''
参数1:你杂乱无章存放这各种各样文件地文件夹路径
参数2:你新的存放子文件夹的路径
可以进行文件类型的粗分类,可以看代码,再添加你想要单独领出来的文件类型    
'''
def move_all_file(old_path_all,new_path):
    old_path_every =''                                  #这是该文件夹下具体的文件(包含子文件夹)
    file_list = os.listdir(old_path_all)                #获取文件路径
    for i in range(len(file_list)):                     #遍利每一个文件夹
        if os.path.isdir(old_path_all+"/"+file_list[i]):    #判断下一个文件是否为文件夹
            old_path_every = old_path_all+"/"+file_list[i]  #设置总文件夹中每个文件的路径
            move_file(old_path_every, new_path,0)
            os.removedirs(old_path_every)                       #将空文件夹删除
        elif os.path.splitext(old_path_all+"/"+file_list[i])[1] == ".csv":
            old_path_every = old_path_all+"/"+file_list[i]
            mkdir("./csv")
            move_file(old_path_every, "./csv",1)
        elif os.path.splitext(old_path_all+"/"+file_list[i])[1] == ".zip":
            old_path_every = old_path_all+"/"+file_list[i]
            mkdir("./zip")
            move_file(old_path_every, "./zip",1)
        elif os.path.splitext(old_path_all+"/"+file_list[i])[1] == ".rar":
            old_path_every = old_path_all+"/"+file_list[i]
            mkdir("./rar")
            move_file(old_path_every, "./rar",1)
        elif os.path.splitext(old_path_all+"/"+file_list[i])[1] == ".txt":
            old_path_every = old_path_all+"/"+file_list[i]
            mkdir("./txt")
            move_file(old_path_every, "./txt",1)
        elif os.path.splitext(old_path_all+"/"+file_list[i])[1] == ".xml":
            old_path_every = old_path_all+"/"+file_list[i]
            mkdir("./xml")
            move_file(old_path_every, "./xml",1)
            

    # remove_file(old_path_all,new_path)                  #移动不是文件夹的文件

import os
 
'''这个就是一个简单的创建文件夹的函数'''
def mkdir(path):
	folder = os.path.exists(path)
	if not folder:                   #判断是否存在文件夹如果不存在则创建为文件夹
		os.makedirs(path)            #makedirs 创建文件时如果路径不存在会创建这个路径
		print ("---  new folder...  ---")
		print ("---  OK  ---")
	else:
		print ("---  There is this folder!  ---")
		
'''这个解决多个csv文件合并的问题,解放你的双手'''
def csv_row_connect(old_path_all):              #合并csv文件
    csv_list = glob.glob(old_path_all+'/*.csv')
    print('共发现%s个CSV文件'% len(csv_list))
    print('正在处理............')
    for i in csv_list:
        fr =  open(i,'r',encoding='utf-8',errors='ignore').read()
        with open('文件合集.csv','a',encoding='utf-8',errors='ignore') as f:
            f.write(fr)
    print('合并完毕!')


'''
从你存放的所有jpg格式图片和txt文件的文件夹中,随机抽取一定比例,放在你的新文件夹下
这里,我是设置的是yolov5要求的数据集格式(注意!!!这里是抽取,不是拷贝,所以抽取比例一定要注意)
这可以按照你输入的比例,随机抽取图片到你的指定文件夹
需要分析一下代码,但是是很简单的!!!
这里还没有优化好,注意看注释,!!!!感叹号的地方就是你要修改的路径

'''
#rate 自定义抽取图片的比例,比方说100张抽10张,那就是0.1
def allocate_date_set(older_picture_path,older_txt_path,rate):                      #则是随机抽取图片函数
        pathDir = os.listdir(older_txt_path)        #取图片的原始路径
        filenumber=len(pathDir)
                                                        
        picknumber=int(filenumber*rate)                 #按照rate比例从文件夹中取一定数量图片
        sample = random.sample(pathDir, picknumber)     #随机选取picknumber数量的样本图片
        mkdir("./images/train")
        mkdir("./images/test")
        mkdir("./images/val")
        mkdir("./labels/train")
        mkdir("./labels/test")
        mkdir("./labels/val")
        print (sample)
        for name in sample:
            picture_path_every =older_picture_path+'/'+os.path.splitext(name)[0]+".jpg"
            txt_path_every =older_txt_path+'/'+os.path.splitext(name)[0]+".txt"
            picture_name = os.path.splitext(name)[0]+".jpg"
            txt_name = os.path.splitext(name)[0]+".txt"
            if os.path.exists(picture_path_every) and os.path.exists(txt_path_every):
                shutil.move(picture_path_every, "./image/test/"+picture_name)           #需要修改的地方!!!!!!
                shutil.move(txt_path_every,"labels/test/"+txt_name)                     #!!!!!!!!!!
        return

# def move_data_set():



if __name__ == '__main__':
    move_all_file(old_path_all="./move_to",new_path="./test2")      #老目录 新目录
    csv_row_connect("./csv")
	# allocate_date_set(older_picture_path="./images",older_txt_path="./txt",rate = 0.6)#源图片文件夹路径  源txt文件


最后附上我一开始的数据集的样子
就是文件夹下有文件夹文件夹然后再是文件的样子。如果你们刚搜集来的数据也是这个样子,那应该能用我的这一份代码进行快速的分类。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
预处理YOLOv8数据集的步骤如下1][^2]: 1. 收集集:收集包含目标物体的图像和相应的标注文件。标注文件通常是以XML或JSON格式存储的,包含目标的位置和类别信息。 2. 数据集划分:将数据集划分为训练集、验证集和测试集。训练集用于模型的训练验证集用于调整模型的超参数和评估模型的性能,测试集用于最终评估模型的泛化能力。 3. 图像增强:对图像进行增强操作,以扩充数据集并提高模型的鲁棒性。常见的增强操作包括随机裁剪、缩放、旋转、翻转、亮度调整等。 4. 标签转换:将标注文件中的目标位置信息转换为模型所需的格式。YOLOv8使用的标签格式是每个目标的类别、中心坐标、宽度和高度。 5. 数据集预处理:对图像进行预处理操作,以满足模型的输入要求。YOLOv8要求输入图像的尺寸是固定的,通常是416x416像素。预处理操作包括图像缩放、归一化和通道顺序调整。 6. 数据加载:将预处理后的数据加载到模型中进行训练或推理。可以使用数据加载器来批量加载数据,以提高训练和推理的效率。 下面是一个预处理YOLOv8数据集的示例代码: ```python import cv2 import os # 设置数据集路径和输出路径 dataset_path = '/path/to/dataset' output_path = '/path/to/preprocessed_dataset' # 遍历数据集中的图像文件 for filename in os.listdir(dataset_path): if filename.endswith('.jpg'): # 读取图像 image_path = os.path.join(dataset_path, filename) image = cv2.imread(image_path) # 进行图像增强操作(例如随机裁剪、缩放、翻转等) # 进行标签转换操作 # 进行数据集预处理操作(例如图像缩放、归一化等) # 保存预处理后的图像 output_filename = os.path.join(output_path, filename) cv2.imwrite(output_filename, image) # 输出预处理后的数据集路径 print('预处理后的数据集路径:', output_path) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值