乐趣区

关于人工智能:YOLOv5全面解析教程⑥模型训练流程详解

作者 | Fengwen、BBuf

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

1

构造我的项目预览

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

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

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

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

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

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

7

训练技巧

申明:大多数状况下,只有数据集足够大且标记良好,就能够在不扭转模型或训练设置的状况下取得良好的后果。如果一开始你没有失去好的后果,你能够采取一些步骤来改良,但咱们始终倡议用户在思考任何更改之前先应用所有默认设置进行一次训练。这有助于建设评估基准和发现须要改良的中央。

模型抉择

相似于 YOLOv5x 和 YOLOv5x6 的大型模型在简直所有状况下都会产生更好的后果,但参数更多,须要更多的 CUDA 内存进行训练,运行速度较慢。

对于挪动部署,咱们举荐 YOLOv5s/m,对于云部署,咱们倡议 YOLOV5l/x。

(无关所有模型的残缺比拟)

  • 从事后训练的权重开始训练。倡议用于中小型数据集(即 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 参数解析表

Reference

  • https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
  • https://docs.ultralytics.com/quick-start/

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

退出移动版