YOLOv5自制数据集训练与部署

本文介绍了如何创建自定义的数据集,包括设置文件夹结构,采集图像,使用LabelImg工具进行标注,以及预处理步骤,如划分训练集和验证集。接着,文章讲述了在YOLO框架下调整配置文件进行训练,并解决训练过程中可能出现的问题,最后展示了训练后的实时检测效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将详细讲解如何自制数据集,并复习上一篇博客中训练部署的相关步骤,希望大家能熟练运用,真正掌握 数据及制作-训练-检测推断 这一基本流程。

数据集制作

建立文件夹

新建一个结构如下的文件夹


dataset
├── images
│  ├── train(用来放训练集图片)
│  ├── val(用来放验证集张图片)
│
├── labels
│  ├── train(用来放训练集图片的标签)
│  ├── val(用来放验证集图片的标签)
│
│  ├── predefined_classes.txt  定义自己要标注的所有类别
图像采集

可以直接拍摄图片,也可以用无人机拍一段视频,用视频切片代码切成图片集。这里为了演示方便,我直接用电脑摄像头拍了一些照片(别学我,实际项目中数据集采集是非常关键的步骤,会直接影响最终目标检测效果)。然后将图片全部放到dataset/images/train目录下(图片名称随意)。

我要识别的标志有两个,分别命名为H、O,因此在predefined_classes.txt中填入H、O(中间用换行),如果有其他类别也要像这样每个类别占一行,这样标注的时候会很方便。

左边的命名为H,右边的命名为O

使用labeling工具进行标注(存储为yolo格式)
  1. 在windows终端(快捷键:win+R,在其中输入cmd打开)中安装labeling工具


pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

  1. 安装完成后终端进入dataset路径(注意,路径改成自己的)


cd C:\Users\HDJ\Desktop\dataset

  1. 输入labelimg images predefined_classes.txt 打开标记软件


labelimg images predefined_classes.txt

  1. 打开后会出现下面界面(没有出现图片也不要紧,按照下面步骤设置完成后就有了)

  • Open Dir选择路径dataset\images\train

  • Change Save Dir 选择路径 dataset\labels\train

  • 第三条红线必须选YOLO格式(否则后面还要调回YOLO格式)

  1. 在最上方菜单栏的view选项下,选择下面几个模式(方便标注)

  1. 开始进行标注

操作:W(调出标注十字架)—鼠标框住要识别物体—选对应标签—D(切换到下一张图片)

循环操作直到完成所有图片标注,这个时候进入dataset\labels\train目录可以看到所有图片对应的标签

训练预处理

使用下面代码将训练集的部分划归到验证集中(记住路径修改成自己的)然后将dataset文件夹放到yolo工程中。


import os, random, shutil

def moveimg(fileDir, tarDir):
    pathDir = os.listdir(fileDir)  # 取图片的原始路径
    filenumber = len(pathDir)
    rate = 0.2  # 自定义抽取图片的比例,比方说100张抽10张,那就是0.1
    picknumber = int(filenumber * rate)  # 按照rate比例从文件夹中取一定数量图片
    sample = random.sample(pathDir, picknumber)  # 随机选取picknumber数量的样本图片
    print(sample)
    for name in sample:
        shutil.move(fileDir + name, tarDir + "\\" + name)
    return

def movelabel(file_list, file_label_train, file_label_val):
    for i in file_list:
        if i.endswith('.jpg'):
            filename = file_label_train + "\\" + i[:-4] + '.txt'  
            if os.path.exists(filename):
                shutil.move(filename, file_label_val)
                print(i + "处理成功!")

if __name__ == '__main__':
    fileDir = r"C:\Users\HDJ\Desktop\dataset\images\train" + "\\"  # 图片训练集文件夹
    tarDir = r'C:\Users\HDJ\Desktop\dataset\images\val'  # 标签验证集文件夹
    moveimg(fileDir, tarDir)
    file_list = os.listdir(tarDir)
    file_label_train = r"C:\Users\HDJ\Desktop\dataset\labels\train"  # 图片训练集文件夹
    file_label_val = r"C:\Users\HDJ\Desktop\dataset\labels\val"  # 标签验证集文件夹
    movelabel(file_list, file_label_train, file_label_val)

训练部署实现

  1. 找到data目录下的coco128.yaml文件,将该文件复制一份,将复制的文件重命名为signal.yaml,在signal.yaml文件中先注释掉一行代码再修改参数,train改成训练集所在路径;val改成验证集所在路径(必须要用绝对路径),因为我训练标注的只有两个标志,所以nc改成2,names改成[H,O].

  1. 在models目录将yolov5s.yaml文件复制一份,将其重命名为yolov5_signal.yaml。在yolov5_signal.yaml文件中将类型数修改为2

  1. 在train.py的(1)(2)中修改默认yaml文件,在(3)中更改训练轮数(这里我用50轮)


parser.add_argument('--epochs',type=int, default=50)
  1. 点击运行,可能会出现页面文件太小,无法完成操作的报错,详见常见下方“报错与解决”

训练成功

训练完成后会在runs/train中产生exp2文件(exp是上一篇博客训练得到的,没删)

在detect.py中将推断使用的权重模型改成训练得到的模型,运行即可实现自训练模型目标识别


我的路径为
C:/Users/HDJ/Desktop/yolov5-5.0/runs/train/exp2/weights/best.pt

parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp2/weights/best.pt', help='model.pt path(s)')

实时检测效果

常见报错与解决

1、OSError: [WinError 1455] 页面文件太小,无法完成操作。

这是由于pycharm虚拟内存不够,在utils路径下找到datasets.py这个文件,将里面的第81行里面的参数nw改为0

2、AssertionError:Image Not Found D:\PycharmProjects\yolov5-hat\VOCdevkit\images\train\000000.jpg

在另一台电脑上训练时,要先把标签文件的.cache删掉(这两个文件是在训练中产生的)

不然会报“找不到图片0”的错(可以理解为由于这两个文件的存在,把训练的路径锁成了之前训练的路径)

3、OMP:Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll alreadyinitialized

是numpy库的一个小bug

在train.py文件的顶头部分添加

importos

os.environ['KMP_DUPLICATE_LIB_OK']='True'

求学路上,你我共勉(๑•̀ㅂ•́)و✧

yolov5中,数据集的预处理包括以下几个步骤: 1. 图像尺寸调整:根据模型的要求,将输入的图像尺寸调整到特定的大小。在yolov5中,根据不同的模型版本,图像的尺寸可以是1280x1280或640x640。 2. 数据增强:为了增加模型的鲁棒性和泛化能力,可以对图像进行数据增强操作。常见的数据增强操作包括随机裁剪、随机翻转、颜色变换等。 3. 标签编码:对于目标检测任务,需要对每个图像中的目标进行标注。标签编码的过程包括将目标的坐标信息转换为模型所需的格式,例如边界框的(x, y, w, h)表示方式。 4. 数据载入和批处理:将预处理后的图像和标签数据加载到模型中进行训练。在yolov5中,可以通过自定义数据集类来实现数据的载入,并重写相应的函数,如__init__、__len__、__getitem__和collate_fn。 综上所述,yolov5数据集预处理涉及图像尺寸调整、数据增强、标签编码以及数据载入和批处理等步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)](https://blog.csdn.net/hymn1993/article/details/123664708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值