YOLOv5——模型的训练train.py与图片的标注

该文章已生成可运行项目,

一、下载源码

项目地址:
https://github.com/ultralytics/yolov5.giticon-default.png?t=O83Ahttps://github.com/ultralytics/yolov5.git

git clone https://github.com/ultralytics/yolov5
# 用于克隆yolov5项目
cd yolov5
pip install -r requirements.txt  
# 安装所有依赖库

下载完成后执行python detect.py测试yolov5是否可以正常运行

运行结果会放置在yolov5/runs/detect

二、数据集准备

可以直接下载已有数据集也可以手动标注图片制作数据集

本文使用labelimg来完成手动标注数据集这一步骤

1.安装labelimg

pip install labelimg

2.启动labelimg

安装完成后,直接输入labelimg会打开标注界面

3.标注数据集

打开要标注的图片文件夹,并修改标注信息存储路径,然后开始标注

标注完后,标注信息存储路径下会出现标注文件,格式为txt文本

每张图片的标注信息与图片名相同,最终会多一个classes.txt文件,这个文件保存有所有的标注类别

三、修改配置文件

1.模型配置文件

官方给出的已有的模型配置文件一般在yolov5/models路径下,如下面的yolov5s.yaml

自己训练模型时,只需要修改下识别结果的总类别数 nc

总类别数

nc: 80 # number of classes

倍增因子

depth_multiple (深度倍增因子):

这个参数决定了模型每个层的深度,也就是每个模块中的重复次数。值为 0.33 表示模型的深度会减少到原始深度的 33%。

width_multiple (宽度倍增因子):

这个参数用于调整模型每层的通道数(卷积层的输出通道数)。值为 0.50 表示模型的宽度(通道数)将减少到原始宽度的 50%。

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)
  ]

2.数据集配置文件

官方给出的已有的数据集配置文件一般在yolov5/data路径下,如下面的coco.yaml

开头注释,指明许可证,使用COCO 2017数据集,示例用法,文件结构,以及数据集的三种指定方式:

# Ultralytics YOLOv5 🚀, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here (20.1 GB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]

配置数据集路径,path指根路径,数据集所在的最外层文件夹,设置path后其他文件的路径均以path为基准

train指训练集,test指测试集,val指验证集,可以设置为图片文件夹的位置或存有目录地址的文本文件:

path: ../datasets/coco # dataset root dir
train: train2017.txt # train images (relative to 'path') 118287 images
val: val2017.txt # val images (relative to 'path') 5000 images
test: test-dev2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

所有要识别的目标的种类,从0开始编号

# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  ············
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush

如果使用的数据集不存在,会自动从url下载到本地(官方给出的数据集):

# Download script/URL (optional)
download: |
  from utils.general import download, Path

  # Download labels
  segments = False  # segment or box labels
  dir = Path(yaml['path'])  # dataset root dir
  url = 'https://github.com/ultralytics/assets/releases/download/v0.0.0/'
  urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labels
  download(urls, dir=dir.parent)

  # Download data
  urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images
          'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images
          'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)
  download(urls, dir=dir / 'images', threads=3)

自己训练模型时,只需要保留数据集路径配置和检测目标种类即可,如:

train: ../../Datas/train/images
val: ../../Datas/valid/images
test: ../../Datas/test/images

names: 
  0: A
  1: B
  2: C
  3: D
  4: E
  5: F
  6: G
  7: H
  8: I
  9: J
  10: K
  11: L
  12: M
  13: N
  15: O
  14: P
  16: Q
  17: R
  18: S
  19: T
  20: U
  21: V
  22: W
  23: X
  24: Y
  25: Z

三、训练模型

1.模型训练

训练模型使用train.py,

YOLOv5提供了在COCO数据集上预训练后的参数,我们可以通过参数--weights yolov5s.pt加载预训练参数进行迁移学习,或在训练大数据集时用一个空的--weights ''参数从零开始训练

 yolov5预训练模型下载链接

Release v7.0 - YOLOv5 SOTA Realtime Instance Segmentation · ultralytics/yolov5 (github.com)icon-default.png?t=O83Ahttps://github.com/ultralytics/yolov5/releases/v7.0

使用预训练好的yolov5模型,设置好要使用的预训练模型,数据集配置,模型配置,要训练的轮数,每批次处理的图片数:

python train.py --weight yolov5s.pt --data data.yaml --cfg yolov5s.yaml --epochs 100 --batch-size 8

# 使用预训练的模型yolov5s.pt
# 数据集配置文件为data.yaml,模型配置文件为yolov5s.yaml
# 训练的轮数为100,每批次处理8张图片

2.参数列表

参数功能传入信息示例
--weights指定初始权重文件路径权重文件路径,如 ROOT / "yolov5s.pt"
--cfg指定模型配置文件(model.yaml)路径模型配置文件路径,如 ""
--data指定数据集配置文件(dataset.yaml)路径数据集配置文件路径,如 ROOT / "data/coco128.yaml"
--hyp指定超参数文件路径超参数文件路径,如 ROOT / "data/hyps/hyp.scratch-low.yaml"
--epochs指定总训练轮数整数,如 100
--batch-size指定总批处理大小(对所有 GPU,-1 表示自动调整)整数,如 16
--imgsz指定训练和验证图像大小(像素)整数,如 640
--rect是否进行矩形训练布尔值,action="store_true",若执行命令时带有该参数则为 True
--resume是否从最近的训练中恢复,若没有参数则默认为 False,有参数但不具体指定值时默认为 True布尔值或空参数,如 nargs="?",const=True,default=False
--nosave是否只保存最终检查点布尔值,action="store_true",若执行命令时带有该参数则为 True
--noval是否只验证最终的 epoch布尔值,action="store_true",若执行命令时带有该参数则为 True
--noautoanchor是否禁用自动锚框布尔值,action="store_true",若执行命令时带有该参数则为 True
--noplots是否不保存绘图文件布尔值,action="store_true",若执行命令时带有该参数则为 True
--evolve进化超参数的代数,如果没有参数则默认为 300整数或空参数,如 nargs="?", const=300
--evolve_population指定加载种群的位置路径,如 ROOT / "data/hyps"
--resume_evolve指定从哪一代恢复进化字符串,如 None
--bucket指定 gsutil 存储桶字符串,如 ""
--cache指定图像缓存方式(ram 或 disk),如果没有参数则默认为 ram字符串或空参数,如 nargs="?", const="ram"
--image-weights是否使用加权图像选择进行训练布尔值,action="store_true",若执行命令时带有该参数则为 True
--device指定 CUDA 设备,若为空则为 CPU设备编号或 "cpu",如 ""
--multi-scale是否进行图像尺寸变化(+/- 50%)布尔值,action="store_true",若执行命令时带有该参数则为 True
--single-cls是否将多类数据作为单类训练布尔值,action="store_true",若执行命令时带有该参数则为 True
--optimizer选择优化器(SGD、Adam、AdamW)字符串,如 "SGD"
--sync-bn是否使用同步批归一化,仅在分布式数据并行(DDP)模式下可用布尔值,action="store_true",若执行命令时带有该参数则为 True
--workers指定最大数据加载器工作线程数(在 DDP 模式下每个 RANK)整数,如 8
--project指定保存训练结果的项目路径路径,如 ROOT / "runs/train"
--name指定保存训练结果的名称字符串,如 "exp"
--exist-ok若项目 / 名称已存在是否继续,不递增布尔值,action="store_true",若执行命令时带有该参数则为 True
--quad是否使用四倍数据加载器布尔值,action="store_true",若执行命令时带有该参数则为 True
--cos-lr是否使用余弦学习率调度器布尔值,action="store_true",若执行命令时带有该参数则为 True
--label-smoothing指定标签平滑参数浮点数,如 0.0
--patience指定早停法的耐心值(没有改进的轮数)整数,如 100
--freeze指定冻结的层,例如 backbone=10, first3=0 1 2整数组成的列表,如 [0]
--save-period指定每隔多少个 epoch 保存一次检查点(小于 1 则禁用)整数,如 -1
--seed指定全局训练种子整数,如 0
--local_rank自动 DDP 多 GPU 参数,不要修改整数,如 -1
--entity指定实体字符串,如 None
--upload_dataset是否上传数据集,参数为 “val” 时有特定选项布尔值或空参数,如 nargs="?", const=True,default=False
--bbox_interval设置边界框图像日志记录间隔整数,如 -1
--artifact_alias指定数据集工件的版本别名字符串,如 "latest"
--ndjson-console是否将 NDJSON 日志记录到控制台布尔值,action="store_true",若执行命令时带有该参数则为 True
--ndjson-file是否将 NDJSON 日志记录到文件布尔值,action="store_true",若执行命令时带有该参数则为 True

3.常用参数

1)--weights
指定初始权重文件路径,例如 ROOT/yolov5s.pt

2.)-cfg
指定模型配置文件路径,例如 model.yaml

3)--data
指定数据集配置文件路径,例如 ROOT/data/coco128.yaml

4)--epochs
指定总训练轮数,整数值(如 100

5)--batch-size
指定总批处理大小,整数值(如 16),-1 表示自动调整

6)--imgsz
指定训练和验证图像大小(像素),整数值(如 640

7)--resume
是否从最近的训练中恢复,布尔值或空参数,默认为 False

8)--device
指定 CUDA 设备,若为空则为 CPU(如 "")

9)--project
指定保存训练结果的项目路径,如 ROOT/runs/train

10)--name
指定保存训练结果的名称(如 "exp"

4.训练结果

模型最终训练完成后会保存在yolov5/runs/train路径下

在训练结果文件夹下会有/weight文件夹,里面存放着训练最好的模型与最后一轮训练的模型,一般使用best.pt。

结果文件夹下还有很多评价模型优度的文件,如混淆矩阵confusion_matrix,F1_curve,P_curve,R_curve,在训练集和验证集上的召回率、准确率和损失率等,以及对数据的分析信息

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值