Yolo v5代码实现细节
IOU系列损失
在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式,通过预测边界框的参数和真实边界框的参数来进行计算求解的。
- 定位损失
L loc ( t , g ) = ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 + ( σ ( t y i ) − g ^ y i ) 2 + ( t w i − g ^ w i ) 2 + ( t h i − g ^ h i ) 2 N pos L_{\text {loc }}(t, g)=\frac{\sum_{i \in \text { pos }}\left(\sigma\left(t_{x}^{i}\right)-\hat{g}_{x}^{i}\right)^{2}+\left(\sigma\left(t_{y}^{i}\right)-\hat{g}_{y}^{i}\right)^{2}+\left(t_{w}^{i}-\hat{g}_{w}^{i}\right)^{2}+\left(t_{h}^{i}-\hat{g}_{h}^{i}\right)^{2}}{N_{\text {pos }}} Lloc (t,g)=Npos ∑i∈ pos (σ(txi)−g^xi)2+(σ(tyi)−g^yi)2+(twi−g^wi)2+(thi−g^hi)2
g ^ x i = g x i − c x i g ^ y i = g y i − c y i g ^ w i = ln ( g w i / p w i ) g ^ h i = ln ( g h i / p h i ) \begin{array}{l} \hat{g}_{x}^{i}=g_{x}^{i}-c_{x}^{i} \\ \hat{g}_{y}^{i}=g_{y}^{i}-c_{y}^{i} \\ \hat{g}_{w}^{i}=\ln \left(g_{w}^{i} / p_{w}^{i}\right) \\ \hat{g}_{h}^{i}=\ln \left(g_{h}^{i} / p_{h}^{i}\right) \end{array} g^xi=gxi−cxig^yi=gyi−cyig^wi=ln(gwi/pwi)g^hi=ln(ghi/phi)
IOU损失
首先需要解释的是:L2损失是坐标的欧氏距离—L2损失就是差值平方和损失。
G r o u n d t r u t h : x ~ = ( x ~ t , x ~ b , x ~ l , x ~ r ) Ground truth: \tilde{x}=\left(\tilde{x}_{t}, \tilde{x}_{b}, \tilde{x}_{l}, \tilde{x}_{r}\right) Groundtruth:x~=(x~t,x~b,x~l,x~r)
P r e d i c t i o n : x = ( x t , x b , x l , x r ) Prediction: \quad x=\left(x_{t}, x_{b}, x_{l}, x_{r}\right) Prediction:x=(xt,xb,xl,xr)
ℓ 2 loss = ∥ p r e d e t i o n − G r o u n d T r u t h ∥ 2 2 \ell_{2} \text { loss }=\|predetion-GroundTruth\|_{2}^{2} ℓ2 loss =∥predetion−GroundTruth∥22
首先我们给出IOU损失的计算形式:
IoU loss = − ln Intersection ( p r e d e t i o n , G r o u n d t r u t h ) Union ( p r e d e t i o n , G r o u n d t r u t h ) \text { IoU loss }=-\ln \frac{\text { Intersection }(predetion, Ground truth)}{\operatorname{Union}(predetion, Ground truth)} IoU loss =−lnUnion(predetion,Groundtruth) Intersection (predetion,Groundtruth)
其中更为常见的IOU损失的计算公式为: 1-IOU
使用iou损失的优点为:
- 能够更好的反应重合程度。
- 具有尺度不变性。
使用iou损失的缺点为:当两个边界框不相交是loss为0
GIOU损失
首先先要说明GIOU的概念:
G I o U = I o U − A c − u A c − 1 ≤ G I o U ≤ 1 \begin{aligned} G I o U & =I o U-\frac{A^{c}-u}{A^{c}} \\ -1 & \leq G I o U \leq 1 \end{aligned} GIoU−1=IoU−AcAc−u≤GIoU≤1
引入下面的一张图片来说明ac的概率:在图片中蓝色的面积即为ac的值绿色代表的是真实的边界框的面接,红色代表的是预测的边界框。
而u代表的是绿色框和红色框并集的面积。
与IOU类似当我们的GIOU大于某个阈值的时候说明我们的边界框匹配成功了,小于某个阈值的时候说明没有匹配成功。
在特殊的情况下GIOU会退化为IOU的
DIOU损失
在DIOU提出的原论文中作者说明了IOU损失和DIOU损失存在的两个具体的问题。
- Slow Convergence(收敛速度慢)
- Inaccurate Regression(预测的精度不足)
图中的上面部分黑色的框代表的是锚框,绿色代表的是真实的边界框,蓝色是给出的预测边界框。
经过400迭代之后才可以近似的回归正确。
下面的图即为使用Diou的情况对比,经过120次的迭代就可以完成边界框的收敛。
Distance-loU可以更好的表示边界框之间的回归关系。
首先引入DIOU的计算公式:如下所示
D I o U = I o U − ρ 2 ( b , b g t ) c 2 = I o U − d 2 c 2 − 1 ≤ D I o U ≤ 1 \begin{array}{c} D I o U=I o U-\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}=I o U-\frac{d^{2}}{c^{2}} \\ -1 \leq D I o U \leq 1 \end{array} DIoU=IoU−c2ρ2(b,bgt)=IoU−c2d2−1≤DIoU≤1
DloU损失能够直接最小化两个boxes之间的距离,因此收敛速度更快。
其中b是预测边界框中心点的位置坐标,而bgt是真实边界框中心点的位置坐标。求的是两个中心点距离的平方。
而c指的是外接矩阵的最小对角线的长度。
分析:当两个中心点的位置坐标完整的重合在一起的时候d为0,
L D I o U = 1 − D I o U L_{D I o U}=1-D I o U LDIoU=1−DIoU
0 ≤ L D I o U ≤ 2 0 \leq L_{D I o U} \leq 2 0≤LDIoU≤2
CIOU损失
一个优秀的回归定位损失应该考虑到3种几何参数:重叠面积、中心点距离、长宽比
首先在DIOU的基础上给出CIOU的计算公式:
C I o U = I o U − ( ρ 2 ( b , b g t ) c 2 + α v ) C I o U=I o U-\left(\frac{\rho^{2}\left(b, b^{g t}\right)}{c^{2}}+\alpha v\right) CIoU=IoU−(c2ρ2(b,bgt)+αv)
v = 4 π 2 ( arctan w g t h g t − arctan w h ) 2 v=\frac{4}{\pi^{2}}\left(\arctan \frac{w^{g t}}{h^{g t}}-\arctan \frac{w}{h}\right)^{2} v=π24(arctanhgtwgt−arctanhw)2
α = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-I o U)+v} α=(1−IoU)+vv
目标检测数据增强策略
Mosaic data augmentation
图像增强的常见方式就包括了图像的裁剪,图像的随机水平翻转,图像的对比度改变的一些常见的策略。
在v3-spp v4 和 v5中都使用到了Mosaic图像增强的策略。
本质上是将多张图片拼接在一起进行训练的图像增强方式。
- 增加数据的多样性
- 增加目标个数
- BN能一次性统计多张图片的参数(输入的batchsize变大的过程)
Random affine
优化策略:进行随机的仿射变换。(Rotation, Scale, Translation and Shear)旋转、缩放、平移、侧切。
但根据配置文件里的超参数发现只使用了Scale
和Translation
即缩放和平移。
MixUp
MixUp,就是将两张图片按照一定的透明度融合在一起
之前在学习opencv的过程中使用到了猫狗图片的融合操作,mixup这种数据增强的策略与融合操作类似。
Albumentations,
主要是做些滤波、直方图均衡化以及改变图片质量等等,代码里写的只有安装了albumentations包才会启用,但在项目的requirements.txt文件中albumentations包是被注释掉了的,所以默认不启用。
Augment HSV
Augment HSV(Hue, Saturation, Value),随机调整色度,饱和度以及明度。
损失计算部分
YOLOv5的损失主要由三个部分组成:
-
Classes loss,分类损失,采用的是BCE loss,注意只计算正样本的分类损失。
-
Objectness loss,obj损失,采用的依然是BCEloss,注意这里的obj指的是网络预测的目标边界框与GTBox的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 L o s s=\lambda_{1} L_{c l s}+\lambda_{2} L_{o b j}+\lambda_{3} L_{l o c} Loss=λ1Lcls+λ2Lobj+λ3Lloc
针对三个预测特征层(P3,P4,P5)上的obj损失采用不同的权重。小型目标更难预测因此可以将权重设置的大一些。
L o b j = 4.0 ⋅ L o b j small + 1.0 ⋅ L o b j medium + 0.4 ⋅ L o b j large L_{o b j}={4.0} \cdot L_{o b j}^{\text {small }}+{1.0} \cdot L_{o b j}^{\text {medium }}+0.4 \cdot L_{o b j}^{\text {large }} Lobj=4.0⋅Lobjsmall +1.0⋅Lobjmedium +0.4⋅Lobjlarge
消除Grid敏感度
在yolo v3中目标边界框的预测方式采用下面的公式来进行计算:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h \begin{array}{l} b_{x}=\sigma\left(t_{x}\right)+c_{x} \\ b_{y}=\sigma\left(t_{y}\right)+c_{y} \\ b_{w}=p_{w} e^{t_{w}} \\ b_{h}=p_{h} e^{t_{h}} \end{array} bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
将预测的边界框中心限制在当前cell中,原因是所有生成的先验框的回归参数并不是相对于锚框的而是相对于,当前cell的左上角位置生成的
对于这个图而言,ph和pw代表的是生成锚框的高度和宽度信息。蓝色代表的是网络预测的最终的位置和大小
σ ( x ) = Sigmoid ( x ) \sigma(x)=\operatorname{Sigmoid}(x) σ(x)=Sigmoid(x)
改进当中心点的位置在左上角的这种情况引入了缩放因子的概念
b x = ( σ ( t x ) ⋅ scale x y − scale x y − 1 2 ) + c x b y = ( σ ( t y ) ⋅ scale x y − scale x y − 1 2 ) + c y \begin{array}{l} b_{x}=\left(\sigma\left(t_{x}\right) \cdot \text { scale }_{x y}-\frac{\text { scale }_{x y}-1}{2}\right)+c_{x} \\ b_{y}=\left(\sigma\left(t_{y}\right) \cdot \text { scale }_{x y}-\frac{\text { scale }_{x y}-1}{2}\right)+c_{y} \end{array} bx=(σ(tx)⋅ scale xy−2 scale xy−1)+cxby=(σ(ty)⋅ scale xy−2 scale xy−1)+cy
在yolo v5网络中缩放因子一般设置为2带入得到预测边界框位置的回归参数。
b x = ( 2 ⋅ σ ( t x ) − 0.5 ) + c x b y = ( 2 ⋅ σ ( t y ) − 0.5 ) + c y \begin{array}{l} b_{x}=\left(2 \cdot \sigma\left(t_{x}\right)-0.5\right)+c_{x} \\ b_{y}=\left(2 \cdot \sigma\left(t_{y}\right)-0.5\right)+c_{y} \end{array} bx=(2⋅σ(tx)−0.5)+cxby=(2⋅σ(ty)−0.5)+cy
在yolo v5中bw和bh也同时进行改进操作。
b w = p w ⋅ ( 2 ⋅ σ ( t w ) ) 2 b h = p h ⋅ ( 2 ⋅ σ ( t h ) ) 2 \begin{array}{c} b_{w}=p_{w} \cdot\left(2 \cdot \sigma\left(t_{w}\right)\right)^{2} \\ b_{h}=p_{h} \cdot\left(2 \cdot \sigma\left(t_{h}\right)\right)^{2} \end{array} bw=pw⋅(2⋅σ(tw))2bh=ph⋅(2⋅σ(th))2
匹配正样本
之前在YOLOv4介绍中有讲过该部分内容,其实YOLOv5也差不多。主要的区别在于GT Box与Anchor 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 \begin{array}{l} r_{w}=w_{g t} / w_{a t} \\ r_{h}=h_{g t} / h_{a t} \\ \end{array} rw=wgt/watrh=hgt/hat