0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

YOLOv5使用教程详解(单卡,多卡,多机训练)

jf_pmFSk4VX 来源:GiantPandaCV 作者:GiantPandaCV 2022-11-21 15:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

代码仓库地址:https://github.com/Oneflow-Inc/one-yolov5欢迎star one-yolov5项目 获取 最新的动态。如果你有问题,欢迎在仓库给我们提出宝贵的意见。 如果对你有帮助,欢迎来给我Star呀~

声明:Model Train(以coco数据集为例) 。本文涉及到了大量的超链接,但是在微信文章里面外链接会被吃掉,所以欢迎大家到这里查看本篇文章的完整版本:https://start.oneflow.org/oneflow-yolo-doc/tutorials/03_chapter/quick_start.html

项目结构预览

8e8b9c84-68d6-11ed-8abf-dac502259ad0.pngimage

安装

gitclonehttps://github.com/Oneflow-Inc/one-yolov5#clone
cdone-yolov5
pipinstall-rrequirements.txt#install

训练

两种训练方式

  1. 带权重训练
$pythonpath/to/train.py--datacoco.yaml--weightsyolov5s--img640
  1. 不带权重训练
$pythonpath/to/train.py--datacoco.yaml--weights''--cfgyolov5s.yaml--img640

GPU训练

$pythontrain.py--datacoco.yaml--weightsyolov5s--device0

多GPU训练

$python-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--weightsyolov5s--device0,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-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''--device2,3

恢复训练

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

#多卡训练.
python-moneflow.distributed.launch--nproc_per_node2train.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-moneflow.distributed.launch--nproc_per_node2train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''--sync-bn

评估

下面的命令是在COCO val2017数据集上以640像素的图像大小测试 yolov5x 模型。yolov5x是可用小模型中最大且最精确的,其它可用选项是 yolov5nyolov5myolov5syolov5l ,以及他们的 P6 对应项比如 yolov5s6 ,或者你自定义的模型,即 runs/exp/weights/best 。有关可用模型的更多信息,请参阅我们的README-TABLE

$pythonval.py--weightsyolov5x--datacoco.yaml--img640

推理

首先,下载一个训练好的模型权重文件,或选择你自己训练的模型;

然后,通过 detect.py文件进行推理。

pythonpath/to/detect.py--weightsyolov5s--source0#webcam
img.jpg#image
vid.mp4#video
path/#directory
path/*.jpg#glob
'https://youtu.be/Zgi9g1ksQHc'#YouTube
'rtsp://example.com/media.mp4'#RTSP,RTMP,HTTPstream

训练结果

本地日志

默认情况下,所有结果都记录为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):

8ea4ce16-68d6-11ed-8abf-dac502259ad0.jpgimg

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

8ebcfad6-68d6-11ed-8abf-dac502259ad0.jpgimg

val_batch0_pred.jpg 展示测试 batch 为 0 predictions(预测):8ee1bcb8-68d6-11ed-8abf-dac502259ad0.jpg

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

  • 从零开始训练 (蓝色)。
  • 加载预训练权重 --weights yolov5s (橙色)。
8f2203d6-68d6-11ed-8abf-dac502259ad0.pngimg

具体的指标分析详见文章《模型精确度评估》

训练技巧

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

模型选择

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

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

有关所有模型的完整比较,请参阅详细表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FotYkHQk-1668949640644)( https://user-images.githubusercontent.com/35585791/201064824-f97c82d5-6bba-4421-86d9-194e47842e35.png)]

  • 从预先训练的权重开始训练。建议用于中小型数据集(即VOC、VisDrone、GlobalWheat)。将模型的名称传递给--weights参数。模型自动从latest YOLOv5 releasse 下载 。
pythontrain.py--datacustom.yaml--weightsyolov5s
yolov5m
yolov5l
yolov5x
custom_pretrained#自定义的网络结构文件

  • 从头开始训练的话,推荐用大的数据集(即 COCO、Objects365、OIv6 )在 --cfg 选项后传递你感兴趣的网络结构文件参数 以及空的 --weights '' 参数:
pythontrain.py--datacustom.yaml--weights''--cfgyolov5s.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'],将有助于减少这些特定损耗分量中的过度拟合。有关优化这些超参数的自动化方法,请参阅我们的 《超参数演化教程》。

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

拓展

使用多机训练

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

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

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

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

#Onmastermachine0
$python-moneflow.distributed.launch--nproc_per_nodeG--nnodesN--node_rank0--master_addr"192.168.1.1"--master_port1234train.py--batch64--datacoco.yaml--cfgyolov5s.yaml--weights''
#OnmachineR
$python-moneflow.distributed.launch--nproc_per_nodeG--nnodesN--node_rankR--master_addr"192.168.1.1"--master_port1234train.py--batch64--datacoco.yaml--cfgyolov5s.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-moneflow.distributed.launch--master_port1234--nproc_per_node2...

配置代码

#prepare
t=https://github.com/Oneflow-Inc/one-yolov5:latest&&sudodockerpull$t&&sudodockerrun-it--ipc=host--gpusall-v"$(pwd)"/coco:/usr/src/coco$t
pipinstall--preoneflow-fhttps://staging.oneflow.info/branch/master/cu112
cd..&&rm-rfapp&&gitclonehttps://github.com/Oneflow-Inc/one-yolov5-bmasterapp&&cdapp
cpdata/coco.yamldata/coco_profile.yaml

#profile
pythontrain.py--batch-size16--datacoco_profile.yaml--weightsyolov5l--epochs1--device0
python-moneflow.distributed.launch--nproc_per_node2train.py--batch-size32--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1
python-moneflow.distributed.launch--nproc_per_node4train.py--batch-size64--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1,2,3
python-moneflow.distributed.launch--nproc_per_node8train.py--batch-size128--datacoco_profile.yaml--weightsyolov5l--epochs1--device0,1,2,3,4,5,6,7

附件

表3.1

表3.1 : train.py参数解析表

参数 help 帮助
--weight initial weights path 加载的权重文件路径
--cfg model.yaml path 模型配置文件,网络结构 路径
--data dataset.yaml path 数据集配置文件,数据集路径
--hyp hyperparameters path 超参数文件 路径
--epochs Total training rounds 训练总轮次
--batch-size total batch size for all GPUs, -1 for autobatch 一次训练所选取的样本数
--imgsz train, val image size (pixels) 输入图片分辨率大小
--rect rectangular training 是否采用矩形训练,默认False
--resume resume most recent training 接着打断训练上次的结果接着训练
--nosave only save final checkpoint 只保存最终的模型,默认False
--noautoanchor disable AutoAnchor 不自动调整anchor,默认False
--noplots save no plot files 不保存打印文件,默认False
--evolve evolve hyperparameters for x generations 是否进行超参数进化,默认False
--bucket gsutil bucket 谷歌云盘bucket,一般不会用到
--cache --cache images in "ram" (default) or "disk" 是否提前缓存图片到内存,以加快训练速度,默认False
--device cuda device, i.e. 0 or 0,1,2,3 or cpu 训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
--multi-scale vary img-size +/- 50%% 是否进行多尺度训练,默认False
--single-cls train multi-class data as single-class 数据集是否只有一个类别,默认False
--optimizer optimizer 优化器
--sync-bn use SyncBatchNorm, only available in DDP mode 是否使用跨卡同步BN,在DDP模式使用
--workers max dataloader workers (per RANK in DDP mode) dataloader的最大worker数量
--project save to project path 保存到项目结果地址
--name save to project/name/ 保存到项目结果/名称
--exist-ok existing project/name ok, do not increment 现有项目/名称确定,不递增,默认False
--quad quad dataloader 四元数据加载器 开启之后在尺寸大于640的图像上识别效果更好,但是有可能会使在640尺寸的图片上效果更差
--cos-lr cosine LR scheduler 是否采用退火余弦学习率,默认False
--label-smoothing Label smoothing epsilon 标签平滑
--patience EarlyStopping patience (epochs without improvement) 早停机制,默认False
--freez Freeze layers: backbone=10, first3=0 1 2 冻结层数,默认不冻结
--save-period Save checkpoint every x epochs (disabled if < 1) 用于记录训练日志信息,int 型,默认 -1
--seed Global training seed 随机数种子设置
--local_rank Automatic DDP Multi-GPU argument, do not modify 自动单机多卡训练 一般不改动

Reference

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


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    5100

    浏览量

    134477
  • 数据集
    +关注

    关注

    4

    文章

    1231

    浏览量

    26047

原文标题:《YOLOv5全面解析教程》六,YOLOv5使用教程详解(单卡,多卡,多机训练)

文章出处:【微信号:GiantPandaCV,微信公众号:GiantPandaCV】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 1031次阅读
    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:<b class='flag-5'>YOLOv5</b>目标检测例程

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 1163次阅读
    迅为如何在RK3576上部署<b class='flag-5'>YOLOv5</b>;基于RK3576构建智能门禁系统

    技术分享 | RK3588基于Yolov5的目标识别演示

    YOLO是一种基于深度神经网络的目标检测算法,用在图像或视频中实时识别和定位多个对象。在其各个版本的迭代中,YOLOv5凭借易用性和性能平衡在工业、医疗、农业、零售等领域被广泛的应用。本文以启扬
    的头像 发表于 09-18 17:27 1049次阅读
    技术分享 | RK3588基于<b class='flag-5'>Yolov5</b>的目标识别演示

    基于瑞芯微RK3576的 yolov5训练部署教程

    s、YOLOv5m、YOLOv5l、YOLOv5x 四个模型。YOLOv5 相比YOLOv4 而言,在检测平均精度降低不多的基础上,具有均值
    的头像 发表于 09-11 16:43 2409次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov5</b><b class='flag-5'>训练</b>部署教程

    在k230上使用yolov5检测图像卡死,怎么解决?

    0.99以上 模型转换指令 再将该模型放到k230设备上使用yolo大作战中yolov5检测示例,检测就会卡死,打印出的检测结果会超过1。 目前无从下手,大佬们求救!
    发表于 08-11 07:41

    yolov5训练部署全链路教程

    m、YOLOv5l、YOLOv5x四个模型。YOLOv5相比YOLOv4而言,在检测平均精度降低不多的基础上,具有均值权重文件更小,训练时间
    的头像 发表于 07-25 15:22 1354次阅读
    <b class='flag-5'>yolov5</b><b class='flag-5'>训练</b>部署全链路教程

    使用yolov5转为kmodel之后,运行MicroPython报错误:IndexError: index is out of bounds怎么解决?

    ] img,img_ori=read_img(img_path) rgb888p_size=[img.shape[2],img.shape[1]] # 初始化YOLOv5实例 yolo=YOLOv5
    发表于 06-06 06:23

    在K230上部署yolov5时 出现the array is too big的原因?

    重现步骤 1将yolov5的kmodel放入k230的data数据 2使用yolo大作战里的视频流推理代码 3运行 期待结果和实际结果 期待的结果 将目标检测的框圈起来 实际看到的结果
    发表于 05-28 07:47

    RV1126 yolov8训练部署教程

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的基于YOLOV5进行更新的 下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于Yolov5的良好表现,
    的头像 发表于 04-16 14:53 1149次阅读
    RV1126 <b class='flag-5'>yolov</b>8<b class='flag-5'>训练</b>部署教程

    OrinNano yolov11训练部署教程

    ORinNano yolov11训练部署教程
    的头像 发表于 04-10 15:26 2234次阅读
    OrinNano  <b class='flag-5'>yolov</b>11<b class='flag-5'>训练</b>部署教程

    请问如何在imx8mplus上部署和运行YOLOv5训练的模型?

    我正在从事 imx8mplus yocto 项目。我已经在自定义数据集上的 YOLOv5训练了对象检测模型。它在 ubuntu 电脑上运行良好。现在我想在我的 imx8mplus 板上运行该模型
    发表于 03-25 07:23

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸一致吗?一致会达到更好的效果?

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸一致吗,一致会达到更好的效果
    发表于 03-11 08:12

    yolov5转onnx在cubeAI进行部署,部署失败的原因?

    第一个我是转onnx时 想把权重文件变小点 就用了半精度 --half,则说17版本不支持半精度 后面则是没有缩小的单精度 但是显示哪里溢出了···· 也不说是哪里、、。。。 到底能不能部署yolov5这种东西啊?? 也没看见几个部署在这上面......................
    发表于 03-07 11:38

    【米尔RK3576开发板评测】+项目名称YOLOV5目标检测

    /examples/yolov5/model ./download_model.sh 下载的是一个ONNX格式的神经网络模型,但发现它无法在瑞芯微系统中直接运行。为了解决这个问题,您计划使用特定
    发表于 02-15 13:24

    【ELF 2学习板试用】ELF2开发板(飞凌嵌入式)部署yolov5s的自定义模型

    ://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt pip install onnx 下载预训练权重(博主尝试
    发表于 02-04 18:15