YOLOv5训练部署

本文以coco128数据集为例,完成YOLOv5的训练部署,如何自制数据集我会在下一篇博客详细讲解。

准备工作

数据集和标注文件大家可以从下方链接获取。

链接:https://pan.baidu.com/s/1gEFYs0X41Kd14YblsgZ1ZA

提取码:fir3

训练预处理

  1. 解压后在images目录下新建文件夹val用来存放验证集图片

  1. 在labels目录下新建文件夹val用来存放验证集标签

  1. 使用下面代码将训练集的部分划归到验证集中(记住路径修改成自己的),当然由于coco128数据集只有128张图片却有80个类别,其实按这种方法划分并不太合适,但是这里为了介绍方法以便于之后自制数据集训练,就采用这种处理方法。

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\yolov5-5.0\coco128\images\train2017" + "\\"  # 源图片文件夹路径
    tarDir = r'C:\Users\HDJ\Desktop\yolov5-5.0\coco128\images\val'  # 图片移动到新的文件夹路径
    moveimg(fileDir, tarDir)
    file_list = os.listdir(tarDir)
    file_label_train = r"C:\Users\HDJ\Desktop\yolov5-5.0\coco128\labels\train2017"  # 源图片标签路径
    file_label_val = r"C:\Users\HDJ\Desktop\yolov5-5.0\coco128\labels\val"  # 标签
    # 移动到新的文件路径
    movelabel(file_list, file_label_train, file_label_val)

运行完成后文件夹结构

coco128
├── images
│   ├── train2017(包含103张图片)
│   ├── val(包含25张图片)
│
├── labels
│   ├── train2017(包含103个txt文件)
│   ├── val(包含25个txt文件)

训练部署实现

找到data目录下的coco.yaml文件。

在coco128.yaml文件中先注释掉download那一行代码(1)再修改参数。train改成训练集图片所在路径(2);val改成验证集所在路径(最好用绝对路径)(3)。

(4)是类别数量,保持默认即可;(5)是每个类别的名称,保持默认即可。

在models目录将yolov5s.yaml文件复制一份,将其重命名为yolov5_coco.yaml。

在yolov5_coco.yaml文件中将类型数修改为80

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

parser.add_argument('--epochs',type=int, default=50)

我的电脑是拯救者Y9000P,3060版本的显卡,cpu的核心数是8核所以改成

运行后可能会出现页面文件太小,无法完成操作的报错,详见常见下方“报错与解决”

训练成功

在训练完成后会在runs/train中产生exp文件

在detect.py中将推断使用的权重模型改成训练得到的模型,我的路径为

C:/Users/HDJ/Desktop/yolov5-5.0/runs/train/exp/weights/best.pt

parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp/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'

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

猜你喜欢

转载自blog.csdn.net/Albert_yeager/article/details/128839996