作者 | Fengwen、 BBuf
欢迎Star、试用One-YOLOv5:
github.com/Oneflow-Inc…
1
结构项目预览
2
装置
git clone https://github.com/Oneflow-Inc/one-yolov5 # clone
cd one-yolov5
pip install -r requirements.txt # install
3
练习
两种练习方式
- 带权重练习
$ python path/to/train.py --data coco.yaml --weights yolov5s --img 640
- 不带权重练习
$ 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 (橙色)。
详细的目标分析详见文章《模型精确度评价》(
mp.weixin.qq.com/s/nvfAU6TwT…
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
- github.com/ultralytics…
- docs.ultralytics.com/quick-start…
欢迎 Star、试用 OneFlow 最新版本:
github.com/Oneflow-Inc…