yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)

玩转yolov5

  • 前言
  • 1、yolov5项目克隆和安装
    • 1.1 代码下载
    • 1.2 安装环境
    • 1.3 下载预训练权重
    • 1.4 安装测试
  • 2、数据准备
    • 2.1 数据形式
    • 2.2 数据转换
    • 2.3 转换结果
  • 3、相关配置
    • 3.1 数据配置文件
    • 3.2 模型配置文件
  • 4、训练
  • 5、预测
  • 总结


前言

以阿里天池比赛为例,手把手教你玩转yolov5,妈妈再也不用担心用yolov5训练自己的数据集啦。
yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第1张图片

1、yolov5项目克隆和安装

1.1 代码下载

下面提供两种下载代码的方式:

  1. 通过官网提供的代码下载

提示:
1. 如果是win系统的话,建议安装一个git,可以直接像linux那样丝滑,安装起来也很简单,在官网找到和电脑自己电脑配置相同的文件,一直下一步直到结束,就安装好了。
2. 如果使用一下代码出现连接失败的话,可以使用git clone http://github.com/ultralytics/yolov5.git
3. 如果出现超时的话。可以在后面加一个时间--timeout 5000

git clone https://github.com/ultralytics/yolov5.git
  1. 第二种就是通过我的提供的连接下载啦

我提供的连接包含了数据和注释,非常详细,适合新手,当然自己也是新手哈。
百度云链接:https://pan.baidu.com/s/1xN44KpPPxdUoEdIM9Vkvhw
提取码:fasf

1.2 安装环境

  1. 需要注意的是yolov5代码兼容性很高,对pytorch、pythoncuda没有特别的要求,我建议的话安装pytorch1.9、python3.8.这里默认你已经安装好了这些基础环境,没有安装的也很简单,百度一搜就出来了
  2. 下面就是安装yolov5需要用到的包了,命令很简单哈,这里使用清华镜像哈,也可以改成豆瓣/中科院。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

1.3 下载预训练权重

  1. 下载yolov5s.pt,yolov5m.pt,yolov5l.pt,yolov5x.pt权重文件,自己新建一个文件夹放置这些权重,我新建的文件夹为weights。提示后面s、m、l、x表示网络的宽度和深度,最小的是s,速度最快、精度最低,其余你们自己类比哈!
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第2张图片 3. 下载连接https://github.com/ultralytics/yolov5/releases当然这里面很全哈,支持pytorch、tensorflow、openvino、tensorrt,注意下载对应的类别哈,用我的代码的话,后面已经下载好了哈。

1.4 安装测试

如果上面步骤的实现了的话,我们来测试一下,看看能否正常运行吧。

  1. 测试的代码如下

需要注意的是,yolov5提供了测试2张图片位于./data/images/,下面的代码。我放到了./data/test_images/,其次这里用的权重是yolo5.pt

python detect.py --source ./data/test_images/ --weights weights/yolov5s.pt
  1. 测试结果

注意核对自己的下面几个信息,可以找到你输出的文件夹,查看结果,至于如何详细了解如何运行detect.py更多的信息,大家可以查看我之前写的博客,有详细的介绍https://blog.csdn.net/CharmsLUO/article/details/123422822

yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第3张图片
3. 查看输出结果的位置yolov5\runs\detect\exp13,这是我的位置哈,你的位置,你的运行结果上面可以看到
yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第4张图片

2、数据准备

2.1 数据形式

如果上面的步骤都准备好了的话,我下面就来开始准备数据吧。
我们这里以阿里天池比赛的数据集为例,数据连接和数据描述,可以查看下面连接https://blog.csdn.net/CharmsLUO/article/details/124313955

2.2 数据转换

  1. 处理数据, 由于官网提供的数据格式是,top 左上角坐标Y height 字符高度 left 左上角坐标X width 字符宽度 label 字符编码,我们需要转化成yolov5的数据格式,中心点 + 长宽
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第5张图片
  2. 下面提供转化的代码
import json 
import tqdm 
import cv2  
import os

# 文件路径
# json文件路径 
json_dir = './dataset/mchar_train.json'  
# 图片所在路径 
img_dir='./yolov5/data/images/mchar_train/'  
# 输出的 txt 文件路径 
out_dir = './yolov5/data/labels/mchar_train/'  
# 不存在就新建文件路径
if not os.path.exists(out_dir):
    os.makedirs(out_dir)
  
def main():  

    # 读取 json 文件数据  
    with open(json_dir, 'r') as load_f:  
        content = json.load(load_f)  

    # 循环处理  
    for key, value in tqdm.tqdm(content.items()):  

        tmp = key.split('.')  
        # 文件名前缀
        filename = out_dir + tmp[0] + '.txt'  
  
        # 左上角x 例如:left = [243, 121]
        left=value['left']  
        # 左上角y  
        top=value['top']  
        # 字符高度  
        height=value['height']  
        # 字符宽度  
        width=value['width']  
        # 字符值(字符标签)
        label=value['label']  
  
        # 读入标签对应的图片
        image_cv = cv2.imread(img_dir+tmp[0]+'.png') 
        # 获取图片宽和高   
        image_height=image_cv.shape[0]  
        image_width=image_cv.shape[1]  

        # 获取标注框的四个角的坐标,原点在左上
        for index in range(len(left)):  
            # 左上横坐标
            bbox0=left[index] 
            # 左上纵坐标 
            bbox1 = top[index] 
            # 右下横坐标 
            bbox2=bbox0+width[index] 
            # 右下纵坐标 
            bbox3=bbox1+height[index]  
            # 标签
            theLabel=label[index]  
  
            # 计算yolo数据格式所需要的中心点的相对 x, y 坐标, w,h 的值
            #  yolo格式是以标签中心点来求相对位置的
            x = (bbox0 + bbox2) / 2 / image_width  
            y = (bbox1 + bbox3) / 2 / image_height
            # 相对于图片的相对长宽  
            w = (bbox2 - bbox0) / image_width  
            h = (bbox3 - bbox1) / image_height 
            # 创建一个新文件,模式是a+, 可读可写,文件存在在后面追加
            fp = open(filename, mode="a+", encoding="utf-8")  
            # 保留6为有效数字
            file_str = str(theLabel) + ' ' + str(round(x, 6)) + ' ' + str(round(y, 6)) + ' ' + str(round(w, 6)) + ' ' + str(round(h, 6))  
            # 注意换行符
            fp.write(file_str+'\n')  
            # 写入完毕关闭
            fp.close()  
  
if __name__ == '__main__':  
    main()

2.3 转换结果

  1. 最后生成的数据文件格式如下

注意:由于我使用的是阿里天池比赛数据集,其中images下的mchar_train文件夹中放训练用的3万张图片,mchar_val文件夹中放验证用的1万张图片。labels下的mchar_train文件夹中放mchar_train.json解析后的json文件,mchar_val文件夹中放mchar_val.json解析后的json文件。

  1. 图像
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第6张图片
  2. 标签
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第7张图片

3、相关配置

3.1 数据配置文件

创建一个数据配置文件,数据加载的时候需要用到。格式为.yaml,可以自己新建一个文件夹装这个文件,可以像我直接在yolov5/data/文件下创建。里面有很多现成的数据配置文件,比如说VOC.yaml、coco.yaml,可以参照这种格式依葫芦画瓢。我创建文件如下:

  1. 代码
train: ./data/images/mchar_train/
val: ./data/images/mchar_val/

# number of classes
nc: 10

# class names
names: ['0','1','2','3','4','5','6','7','8','9']
  1. 文件
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第8张图片

3.2 模型配置文件

创建模型配置文件,可以直接从yolov5s.yaml,yolov5m.yaml,yolov5l.yaml,yolov5x.yaml选择你想用的模型。复制粘贴就可以,记住改名字哈,模型配置文件你可以创建在models,也可以新建文件夹。我直接创建在yolov5下,提示注意修改类别数nc
我这里以yolov5s.yaml为例,创建yolov5s_mchar.yaml

  1. 代码
# YOLOv5  by Ultralytics, GPL-3.0 license

# Parameters
nc: 10  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]
  1. 文件
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第9张图片

4、训练

以上步骤都完成之后,我们开始训练自己的数据集啦

  1. 代码
python train.py --data ./data/mchar.yaml --cfg yolov5l_mchar.yaml --epochs 80 --batch-size 8 --weights ./weights/yolov5s.pt
  1. 训练
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第10张图片
  2. 训练过程

输出的位置,如果没有设置位置的话,会自动创建,创建一般在./run/train/exp*

yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第11张图片

注意了解更多训练相关的细节可以查看连接:https://blog.csdn.net/CharmsLUO/article/details/123542598

5、预测

  1. 代码
python detect.py --weights ./runs/train/exp5/weights/best.pt  --source ./data/images/mchar_val/ 
  1. 预测
    yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第12张图片
  2. 预测过程

输出的位置,如果没有设置位置的话,会自动创建,创建一般在./run/detect/exp*

yolov5使用教程训练our数据——手把手教你训练预测(以阿里天池比赛为例)_第13张图片

想了解更多预测相关的细节可以查看连接:https://blog.csdn.net/CharmsLUO/article/details/123422822


总结

以上就是今天的内容了,yolov5系列,下次再出一个用tensorrt加速的教程。

你可能感兴趣的:(yolov5,目标检测,算法大赛,深度学习,yolo,计算机视觉,目标检测)