YOLOv5网络详解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

官方源码仓库https://github.com/ultralytics/yolov5
文章下载地址没有

视频讲解https://www.bilibili.com/video/BV1T3411p7zR


文章目录


0 前言

在前面我们已经介绍过了YOLOv1~v4的网络的结构今天接着上次的YOLOv4再来聊聊YOLOv5如果还不了解YOLOv4的可以参考之前的博文。YOLOv5项目的作者是Glenn Jocher并不是原Darknet项目的作者Joseph Redmon。并且这个项目至今都没有发表过正式的论文。之前翻阅该项目的issue时发现有很多人问过这个问题有兴趣的可以翻翻这个issue #1333。作者当时也有说准备在2021年的12月1号之前发表并承诺如果到时候没有发表就吃掉自己的帽子。
在这里插入图片描述

(⊙o⊙)…emmm但这都2022年了也不知道他的帽子是啥味儿。过了他承诺的发表期限后很多人还去该issue下表示"关怀"问啥时候吃帽子下面这位大哥给我整笑了。

在这里插入图片描述

通过和上篇博文讲的YOLOv4对比其实YOLOv5在Backbone部分没太大变化。但是YOLOv5在v6.0版本后相比之前版本有一个很小的改动把网络的第一层原来是Focus模块换成了一个6x6大小的卷积层。两者在理论上其实等价的但是对于现有的一些GPU设备以及相应的优化算法使用6x6大小的卷积层比使用Focus模块更加高效。详情可以参考这个issue #4825。下图是原来的Focus模块(和之前Swin Transformer中的Patch Merging类似)将每个2x2的相邻像素划分为一个patch然后将每个patch中相同位置同一颜色像素给拼在一起就得到了4个feature map然后在接上一个3x3大小的卷积层。这和直接使用一个6x6大小的卷积层等效。

在这里插入图片描述

  • Copy paste将部分目标随机的粘贴到图片中前提是数据要有segments数据才行即每个目标的实例分割信息。下面是Copy paste原论文中的示意图。
    在这里插入图片描述

  • MixUp就是将两张图片按照一定的透明度融合在一起具体有没有用不太清楚毕竟没有论文也没有消融实验。代码中只有较大的模型才使用到了MixUp而且每次只有10%的概率会使用到。
    在这里插入图片描述

  • Albumentations主要是做些滤波、直方图均衡化以及改变图片质量等等我看代码里写的只有安装了albumentations包才会启用但在项目的requirements.txt文件中albumentations包是被注释掉了的所以默认不启用。

  • Augment HSV(Hue, Saturation, Value)随机调整色度饱和度以及明度。
    在这里插入图片描述

  • Random horizontal flip随机水平翻转
    在这里插入图片描述


  • 3 训练策略

    在YOLOv5源码中使用到了很多训练的策略这里简单总结几个我注意到的点还有些没注意到的请大家自己看下源码

    • Multi-scale training(0.5~1.5x)多尺度训练假设设置输入图片的大小为 640 × 640 640 \times 640 640×640训练时采用尺寸是在 0.5 × 640 ∼ 1.5 × 640 0.5 \times 640 \sim 1.5 \times 640 0.5×6401.5×640之间随机取值注意取值时取得都是32的整数倍因为网络会最大下采样32倍。
    • AutoAnchor(For training custom data)训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板。
    • Warmup and Cosine LR scheduler训练前先进行Warmup热身然后在采用Cosine学习率下降策略。
    • EMA(Exponential Moving Average)可以理解为给训练的参数加了一个动量让它更新过程更加平滑。
    • Mixed precision混合精度训练能够减少显存的占用并且加快训练速度前提是GPU硬件支持。
    • Evolve hyper-parameters超参数优化没有炼丹经验的人勿碰保持默认就好。

    4 其他

    4.1 损失计算

    YOLOv5的损失主要由三个部分组成

    • Classes loss分类损失采用的是BCE loss注意只计算正样本的分类损失。
    • Objectness lossobj损失采用的依然是BCE loss注意这里的obj指的是网络预测的目标边界框与GT Box的CIoU。这里计算的是所有样本的obj损失。
    • Location loss定位损失采用的是CIoU loss注意只计算正样本的定位损失。

    L o s s = λ 1 L c l s + λ 2 L o b j + λ 3 L l o c Loss=\lambda_1 L_{cls} + \lambda_2 L_{obj} + \lambda_3 L_{loc} Loss=λ1Lcls+λ2Lobj+λ3Lloc
    其中 λ 1 , λ 2 , λ 3 \lambda_1, \lambda_2, \lambda_3 λ1,λ2,λ3为平衡系数。

    4.2 平衡不同尺度的损失

    这里是指针对三个预测特征层P3, P4, P5上的obj损失采用不同的权重。在源码中针对预测小目标的预测特征层P3采用的权重是4.0针对预测中等目标的预测特征层P4采用的权重是1.0针对预测大目标的预测特征层P5采用的权重是0.4作者说这是针对COCO数据集设置的超参数。
    L o b j = 4.0 ⋅ L o b j s m a l l + 1.0 ⋅ L o b j m e d i u m + 0.4 ⋅ L o b j l a r g e L_{obj} = 4.0 \cdot L_{obj}^{small} + 1.0 \cdot L_{obj}^{medium} + 0.4 \cdot L_{obj}^{large} Lobj=4.0Lobjsmall+1.0Lobjmedium+0.4Lobjlarge

    4.3 消除Grid敏感度

    在上篇文章YOLOv4中有提到过主要是调整预测目标中心点相对Grid网格的左上角偏移量。下图是YOLOv2v3的计算公式。

    在这里插入图片描述

    其中

    • t x t_x tx是网络预测的目标中心 x x x坐标偏移量相对于网格的左上角
    • t y t_y ty是网络预测的目标中心 y y y坐标偏移量相对于网格的左上角
    • c x c_x cx是对应网格左上角的 x x x坐标
    • c y c_y cy是对应网格左上角的 y y y坐标
    • σ \sigma σSigmoid激活函数将预测的偏移量限制在0到1之间即预测的中心点不会超出对应的Grid Cell区域

    关于预测目标中心点相对Grid网格左上角 ( c x , c y ) (c_x, c_y) (cx,cy)偏移量为 σ ( t x ) , σ ( t y ) \sigma(t_x), \sigma(t_y) σ(tx),σ(ty)。YOLOv4的作者认为这样做不太合理比如当真实目标中心点非常靠近网格的左上角点 σ ( t x ) \sigma(t_x) σ(tx) σ ( t y ) \sigma(t_y) σ(ty)应该趋近与0或者右下角点 σ ( t x ) \sigma(t_x) σ(tx) σ ( t y ) \sigma(t_y) σ(ty)应该趋近与1时网络的预测值需要负无穷或者正无穷时才能取到而这种很极端的值网络一般无法达到。为了解决这个问题作者对偏移量进行了缩放从原来的 ( 0 , 1 ) (0, 1) (0,1)缩放到 ( − 0.5 , 1.5 ) (-0.5, 1.5) (0.5,1.5)这样网络预测的偏移量就能很方便达到0或1故最终预测的目标中心点 b x , b y b_x, b_y bx,by的计算公式为
    b x = ( 2 ⋅ σ ( t x ) − 0.5 ) + c x b y = ( 2 ⋅ σ ( t y ) − 0.5 ) + c y b_x = (2 \cdot \sigma(t_x) - 0.5) + c_x \\ b_y = (2 \cdot \sigma(t_y) - 0.5) + c_y bx=(2σ(tx)0.5)+cxby=(2σ(ty)0.5)+cy
    下图是我绘制的 y = σ ( x ) y = \sigma(x) y=σ(x)对应before曲线和 y = 2 ⋅ σ ( x ) − 0.5 y = 2 \cdot \sigma(x) - 0.5 y=2σ(x)0.5对应after曲线很明显通过引入缩放系数scale以后 y y y x x x更敏感了且偏移的范围由原来的 ( 0 , 1 ) (0, 1) (0,1)调整到了 ( − 0.5 , 1.5 ) (-0.5, 1.5) (0.5,1.5)
    在这里插入图片描述
    在YOLOv5中除了调整预测Anchor相对Grid网格左上角 ( c x , c y ) (c_x, c_y) (cx,cy)偏移量以外还调整了预测目标高宽的计算公式之前是
    b w = p w ⋅ e t w b h = p h ⋅ e t h b_w = p_w \cdot e^{t_w} \\ b_h = p_h \cdot e^{t_h} bw=pwetwbh=pheth
    在YOLOv5调整为
    b w = p w ⋅ ( 2 ⋅ σ ( t w ) ) 2 b h = p h ⋅ ( 2 ⋅ σ ( t h ) ) 2 b_w = p_w \cdot (2 \cdot \sigma(t_w))^2 \\ b_h = p_h \cdot (2 \cdot \sigma(t_h))^2 bw=pw(2σ(tw))2bh=ph(2σ(th))2
    作者Glenn Jocher的原话如下也可以参考issue #471

    The original yolo/darknet box equations have a serious flaw. Width and Height are completely unbounded as they are simply out=exp(in), which is dangerous, as it can lead to runaway gradients, instabilities, NaN losses and ultimately a complete loss of training.

    作者的大致意思是原来的计算公式并没有对预测目标宽高做限制这样可能出现梯度爆炸训练不稳定等问题。下图是修改前 y = e x y = e^x y=ex和修改后 y = ( 2 ⋅ σ ( x ) ) 2 y = (2 \cdot \sigma(x))^2 y=(2σ(x))2相对Anchor宽高的倍率因子的变化曲线 很明显调整后倍率因子被限制在 ( 0 , 4 ) (0, 4) (0,4)之间。
    在这里插入图片描述

    4.4 匹配正样本(Build Targets)

    之前在YOLOv4介绍中有讲过该部分内容其实YOLOv5也差不多。主要的区别在于GT BoxAnchor Templates模板的匹配方式。在YOLOv4中是直接将每个GT Box与对应的Anchor Templates模板计算IoU只要IoU大于设定的阈值就算匹配成功。但在YOLOv5中作者先去计算每个GT Box与对应的Anchor Templates模板的高宽比例即
    r w = w g t / w a t r h = h g t / h a t r_w = w_{gt} / w_{at} \\ r_h = h_{gt} / h_{at} \\ rw=wgt/watrh=hgt/hat
    然后统计这些比例和它们倒数之间的最大值这里可以理解成计算GT BoxAnchor Templates分别在宽度以及高度方向的最大差异当相等的时候比例为1差异最小
    r w m a x = m a x ( r w , 1 / r w ) r h m a x = m a x ( r h , 1 / r h ) r_w^{max} = max(r_w, 1 / r_w) \\ r_h^{max} = max(r_h, 1 / r_h) rwmax=max(rw,1/rw)rhmax=max(rh,1/rh)
    接着统计 r w m a x r_w^{max} rwmax r h m a x r_h^{max} rhmax之间的最大值即宽度和高度方向差异最大的值
    r m a x = m a x ( r w m a x , r h m a x ) r^{max} = max(r_w^{max}, r_h^{max}) rmax=max(rwmax,rhmax)
    如果GT Box和对应的Anchor Template r m a x r^{max} rmax小于阈值anchor_t在源码中默认设置为4.0GT Box和对应的Anchor Template的高、宽比例相差不算太大则将GT Box分配给该Anchor Template模板。为了方便大家理解可以看下我画的图。假设对某个GT Box而言其实只要GT Box满足在某个Anchor Template宽和高的 × 0.25 \times 0.25 ×0.25倍和 × 4.0 \times 4.0 ×4.0倍之间就算匹配成功。

    在这里插入图片描述
    剩下的步骤和YOLOv4中一致

    • GT投影到对应预测特征层上根据GT的中心点定位到对应Cell注意图中有三个对应的Cell。因为网络预测中心点的偏移范围已经调整到了 ( − 0.5 , 1.5 ) (-0.5, 1.5) (0.5,1.5)所以按理说只要Grid Cell左上角点距离GT中心点在 ( − 0.5 , 1.5 ) (−0.5,1.5) (0.5,1.5)范围内它们对应的Anchor都能回归到GT的位置处。这样会让正样本的数量得到大量的扩充。
    • 则这三个Cell对应的AT2AT3都为正样本。

    在这里插入图片描述
    还需要注意的是YOLOv5源码中扩展Cell时只会往上、下、左、右四个方向扩展不会往左上、右上、左下、右下方向扩展。下面又给出了一些根据 G T x c e n t e r , G T y c e n t e r GT_x^{center}, GT_y^{center} GTxcenter,GTycenter的位置扩展的一些Cell案例其中%1表示取余并保留小数部分。

    在这里插入图片描述
    到此YOLOv5相关的内容基本上都分析完了。当然由于个人原因肯定还有一些细节被我忽略掉了也建议大家自己看看源码收获肯定会更多。

    阿里云国内75折 回扣 微信号:monov8
    阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6