YOLOv5全面解析教程⑥:模型训练流程详解

八股文背诵
• 阅读 2558

YOLOv5全面解析教程⑥:模型训练流程详解

作者 | Fengwen、BBuf

欢迎Star、试用One-YOLOv5:
https://github.com/Oneflow-Inc/one-yolov5

1

结构项目预览

YOLOv5全面解析教程⑥:模型训练流程详解

2

安装

git clone https://github.com/Oneflow-Inc/one-yolov5  # clone
cd one-yolov5
pip install -r requirements.txt  # install

3

训练

两种训练方式

1.带权重训练

$ python path/to/train.py --data coco.yaml --weights yolov5s --img 640
  1. 不带权重训练
$ python path/to/train.py --data coco.yaml --weights '' --cfg yolov5s.yaml --img 640

单GPU训练

$ python train.py  --data coco.yaml --weights yolov5s --device 0

多GPU训练

$ python -m oneflow.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s --device 0,1

注意:

  • --nproc_per_node 指定要使用多少GPU。举个例子:在上面多GPU训练指令中它是2。
  • --batch 是总批量大小。它将平均分配给每个GPU。在上面的示例中,每GPU是64/2=32。
  • --cfg : 指定一个包含所有评估参数的配置文件。
  • 上面的代码默认使用GPU 0…(N-1)。使用特定的GPU?可以通过简单在 --device 后跟指定GPU来实现。「案例」,在下面的代码中,我们将使用GPU 2,3。
$ python -m oneflow.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --device 2,3

恢复训练

如果你的训练进程中断了,你可以这样恢复先前的训练进程。

# 多卡训练.
python -m oneflow.distributed.launch --nproc_per_node 2 train.py --resume

你也可以通过 --resume 参数指定要恢复的模型路径。

# 记得把 /path/to/your/checkpoint/path  替换为你要恢复训练的模型权重路径
--resume /path/to/your/checkpoint/path

使用SyncBatchNorm

SyncBatchNorm可以提高多gpu训练的准确性,但会显著降低训练速度。它仅适用于多GPU DistributedDataParallel 训练。建议最好在每个GPU上的样本数量较小(样本数量<=8)时使用。

要使用SyncBatchNorm,只需将添加 --sync-bn 参数选项,具体「案例」如下:

$ python -m oneflow.distributed.launch --nproc_per_node 2 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' --sync-bn

4

评估

下面的命令是在COCO val2017数据集上以640像素的图像大小测试 yolov5x 模型。yolov5x是可用小模型中最大且最精确的,其它可用选项是 yolov5n ,yolov5m,yolov5s,yolov5l ,以及他们的 P6 对应项比如 yolov5s6 ,或者你自定义的模型,即 runs/exp/weights/best 。

$ python val.py --weights yolov5x --data coco.yaml --img 640 

5

推理

首先,下载一个训练好的模型权重文件,或选择你自己训练的模型;然后,通过 detect.py文件进行推理。

python path/to/detect.py --weights yolov5s --source 0              # webcam
                                                    img.jpg        # image
                                                    vid.mp4        # video
                                                    path/          # directory
                                                    path/*.jpg     # glob
                                                    'https://youtu.be/Zgi9g1ksQHc'  # YouTube
                                                    'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

6

训练结果

本地日志

默认情况下,所有结果都记录为runs/train,并为每个新训练创建一个新的训练结果目录,如runs/train/exp2、runs/train/exp3等。查看训练和测试JPG以查看 mosaics, labels, predictions and augmentation 效果。注意:Mosaic Dataloader 用于训练(如下所示),这是Ultralytics发表的新概念,首次出现在YOLOv4中。

train_batch0.jpg 显示 batch 为 0 的 (mosaics and labels):

YOLOv5全面解析教程⑥:模型训练流程详解

val_batch0_labels.jpg 展示测试 batch 为 0 的labels:

YOLOv5全面解析教程⑥:模型训练流程详解

val_batch0_pred.jpg 展示测试 batch 为 0 predictions(预测):

YOLOv5全面解析教程⑥:模型训练流程详解

训练训损失和性能的指标有记录到Tensorboard和自定义结果中results.csv日志文件,训练训完成后作为结果绘制 results.png如下。在这里,我们展示了在COCO128上训练的YOLOV5结果

  • 从零开始训练 (蓝色)。
  • 加载预训练权重 --weights yolov5s (橙色)。

YOLOv5全面解析教程⑥:模型训练流程详解

具体的指标分析详见文章《模型精确度评估》(https://mp.weixin.qq.com/s/nvfAU6TwTDoZhF8zFpCaOw

7

训练技巧

声明:大多数情况下,只要数据集足够大且标记良好,就可以在不改变模型或训练设置的情况下获得良好的结果。如果一开始你没有得到好的结果,你可以采取一些步骤来改进,但我们始终建议用户在考虑任何更改之前先使用所有默认设置进行一次训练。这有助于建立评估基准和发现需要改进的地方。

模型选择

类似于YOLOv5x和YOLOv5x6的大型模型在几乎所有情况下都会产生更好的结果,但参数更多,需要更多的CUDA内存进行训练,运行速度较慢。

对于移动部署,我们推荐YOLOv5s/m,对于云部署,我们建议YOLOV5l/x。

YOLOv5全面解析教程⑥:模型训练流程详解
(有关所有模型的完整比较)

  • 从预先训练的权重开始训练。建议用于中小型数据集(即VOC、VisDrone、GlobalWheat)。将模型的名称传递给--weights参数。模型自动从latest YOLOv5 releasse 下载 。
python train.py --data custom.yaml --weights yolov5s 
                                             yolov5m 
                                             yolov5l 
                                             yolov5x 
                                             custom_pretrained # 自定义的网络结构文件
  • 从头开始训练的话,推荐用大的数据集(即 COCO、Objects365、OIv6 )在 --cfg 选项后传递你感兴趣的网络结构文件参数 以及空的 --weights '' 参数:
python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
                                                      yolov5m.yaml
                                                      yolov5l.yaml
                                                      yolov5x.yaml

训练配置

在修改任何内容之前,首先使用默认设置进行训练,以建立性能基线。训练参数的完整列表,能够在train.py文件中发现。

  • Epochs : 默认训练300个epochs。如果早期过拟合,则可以减少训练。如果在300个周期后未发生过拟合,则可以训练更长,比如600、1200个epochs。
  • Image size: COCO以 --img 640,的分辨率进行训练,但由于数据集中有大量的小对象,它可以从更高分辨率(如--img 1280)的训练中训练。如果有许多小对象,则自定义数据集将从更高分辨率的训练中获益。最好的推断结果是在相同的--img 处获得的 ,即如果在-img 1280处进行训练,也应该在--img 1280处进行测试和检测。
  • Batch Size: 使用更大的 --batch-size 。能够有效缓解小样本数产生的batchnorm统计的错误。
  • Hyperparameters:默认超参数在hyp.scratch-low.yaml文件中。我们建议你在考虑修改任何超参数之前,先使用默认超参数进行训练。一般来说,增加增强超参数将减少和延迟过度拟合,允许更长的训练和得到更高mAP值。减少损耗分量增益超参数,如hyp['obj'],将有助于减少这些特定损耗分量中的过度拟合。有关优化这些超参数的自动化方法,请参阅我们的 《超参数演化教程》。

...更多训练的超参数配置请查看本文的附录。

8

拓展

使用多机训练

这仅适用于多GPU分布式数据并行训练。

在训练之前,确保所有机器上的文件都相同,数据集、代码库等。之后,确保机器可以相互通信。

你必须选择一台主机器(其他机器将与之对话)。记下它的地址(master_addr)并选择一个端口(master-port)。对于下面的示例,将使用master_addr=192.168.1.1和master_ port=1234。

要使用它,可以执行以下指令:

# On master machine 0
$ python -m oneflow.distributed.launch --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''
# On machine R
$ python -m oneflow.distributed.launch --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights ''

其中G是每台机器的GPU数量,N是机器数量,R是从0到(N-1)的机器数量。
假设我有两台机器,每台机器有两个GPU,对于上面的情况,G=2,N=2,R=1。
在连接所有N台机器之前,训练不会开始。输出将仅显示在主机上!

注意:

  • oneflow目前不支持windows平台
  • --batch 必须是GPU数量的倍数。
  • GPU 0 将比其他GPU占用略多的内存,因为它维护EMA并负责检查点等。
  • 如果你得到 RuntimeError: Address already in use ,可能是因为你一次正在运行多个训练程序。要解决这个问题,只需通过添加--master_port来使用不同的端口号,如下所示
$ python -m oneflow.distributed.launch --master_port 1234 --nproc_per_node 2 ...

配置代码

# prepare
t=https://github.com/Oneflow-Inc/one-yolov5:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all -v "$(pwd)"/coco:/usr/src/coco $t
pip install --pre oneflow -f https://staging.oneflow.info/branch/master/cu112
cd .. && rm -rf app && git clone https://github.com/Oneflow-Inc/one-yolov5 -b master app && cd app
cp data/coco.yaml data/coco_profile.yaml

# profile
python train.py --batch-size 16 --data coco_profile.yaml --weights yolov5l  --epochs 1 --device 0 
python -m oneflow.distributed.launch --nproc_per_node 2 train.py --batch-size 32 --data coco_profile.yaml --weights yolov5l  --epochs 1 --device 0,1   
python -m oneflow.distributed.launch --nproc_per_node 4 train.py --batch-size 64 --data coco_profile.yaml --weights yolov5l  --epochs 1 --device 0,1,2,3  
python -m oneflow.distributed.launch --nproc_per_node 8 train.py --batch-size 128 --data coco_profile.yaml --weights yolov5l  --epochs 1 --device 0,1,2,3,4,5,6,7

附件

train.py参数解析表

YOLOv5全面解析教程⑥:模型训练流程详解

Reference

欢迎 Star、试用 OneFlow 最新版本:https://github.com/Oneflow-Inc/oneflow/

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这