解读YOLOv1-YOLOv8的原理与网络结构

2024-02-08 15:20

本文主要是介绍解读YOLOv1-YOLOv8的原理与网络结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)_yolo目标检测_zyw2002的博客-CSDN博客

膜拜!YOLO目标检测竟被讲的如此简单!(完整版)YOLOv1-v8,草履虫都能听懂!这么好的课程还没人看?我不更了!!!_哔哩哔哩_bilibili

YOLO V1


简介


【论文解读】Yolo三部曲解读——Yolov1 - 知乎 (zhihu.com)

【目标检测论文阅读】YOLOv1 - 知乎 (zhihu.com)

YOLOv1学习笔记_pydw_收尾人VEM的博客-CSDN博客

lrsB1t.png
  1. Resize image:将输入图片resize到448x448
  2. Run ConvNet:使用CNN提取特征,FC层输出分类和回归结果
  3. Non-max Suppression:非极大值抑制筛选出最终的结果

物体检测的两个步骤可以概括为:

步骤一:检测目标位置(生成矩形框)

步骤二:对目标物体进行分类

物体检测主流的算法框架大致分为one-stage与two-stage。two-stage算法代表有R-CNN系列,one-stage算法代表有Yolo系列。two-stage算法将步骤一与步骤二分开执行,输入图像先经过候选框生成网络(例如faster rcnn中的RPN网络),再经过分类网络;one-stage算法将步骤一与步骤二同时执行,输入图像只经过一个网络,生成的结果中同时包含位置与类别信息。two-stage与one-stage相比,精度高,但是计算量更大,所以运算较慢

论文中提及的三点:

  1. Yolo很快,将detection视为回归问题,仅使用一个neural network同时预测bounding box的位置和类别,因此速度很快
  2. Yolo由于不需提取region proposal(区域提案),而是直接在整幅图像进行检测,因此YOLOv1可以**联系上下文信息和特征,**减少将背景检测为物体的错误
  3. Yolo学到的图片特征更为通用。YOLOv1学习到的是目标的泛化表示(generalizable representations),泛化能力非常强,更容易应用于新的领域或输入

结构


lrsT6b.png

1-1卷积降维,减少参数

YOLOv1的网络结构很简单,借鉴了GooLeNet设计,共包含24个卷积层,2个全链接层(前20层中用1×1 reduction layers 紧跟 3×3 convolutional layers 取代GooLeNet的 inception modules)

**1.输入:**448 x 448 x 3,由于网络的最后需要接入两个全连接层,全连接层需要固定尺寸的输入,故需要将输入resize

**2.Conv + FC:**主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数,但是最后一层采用线性激活函数

**3.输出:**最后一个FC层得到一个1470 x 1的输出,将这个输出reshap一下,得到 7 x 7 x 30 的一个tensor,即最终每个单元格都有一个30维的输出,代表预测结果。具体如下

lrspQe.png
7✖7网格

输入图像被划分为 7 x 7 的单元格(grid),输出tensor中的 7 x 7 对应着输入图像的 7 x 7 个单元格,每个单元格对应输出30维的向量。如上图所示,输入图像左上角的网格对应到输出张量中左上角的向量

要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中

在Yolo中,如果一个物体的中心点,落在了某个格子中,那么这个格子将负责预测这个物体。这句话怎么理解?

lrsLvP.png

用上图举例,设左下角格子假设坐标为 (1,1),小狗所在的最小包围矩形框的中心,落在了 (2,3) 这个格子中。那么7✖7个格子中,(2,3) 这个格子负责预测小狗,而那些没有物体中心点落进来的格子,则不负责预测任何物体。这个设定就好比该网络在一开始,就将整个图片上的预测任务进行了分工,一共设定7✖7个按照方阵列队的检测人员,每个人员负责检测一个物体,大家的分工界线,就是看被检测物体的中心点落在谁的格子里。当然,是77还是99,是上图中的参数S,可以自己修改,精度和性能会随之有些变化

30的含义

lrsE4Q.png lrs0Iw.png

lrsN9f.png

损失


看到这里读者或许会有疑问,Yolo里的每个格点,是怎么知道该预测哪个物体的?这就是神经网络算法的能力。首先拿到一批标注好的图片数据集,按照规则打好标签,之后让神经网络去拟合训练数据集。训练数据集中的标签是通过人工标注获得,当神经网络对数据集拟合的足够好时,那么就相当于神经网络具备了一定的和人一样的识别能力

lrsqKc.png

lrsuP3.png

lrs859.png

  • 对于有object的cell,那么计算cell的分类误差,然后cell中两个bbox的置信度误差,然后cell中和ground truth box的IoU最大的bbox的位置误差
  • 对于没有object的cell,那就只计算cell中两个bbox的置信度误差
lrs5kH.png

此外,因为误差在小的box上体现的更明显,就是一点点小的位置上的偏差可能对大的box影响不是很大,但是对小的box的影响就比较明显了,所以为了给不同size的box的位置loss赋予不同的‘权重’,需要对w和h开方后才进行计算。函数图像可知,当x较小时,x的一点小的变化都会导致y大的变化,而当x较大的时候,x的一点儿小的变化不会让y的变化太大。 但这个方法只能减弱这个问题,并不能彻底解决这个问题

正负样例


正样本:

  1. **对象中心落在网格内:**对于每个真实对象(ground truth object),其边界框(bounding box)的中心落在哪个网格单元内,那个网格单元就负责预测这个对象。因此,该网格单元和与之对应的预测边界框成为“正样本”
  2. **存在性置信度:**与该网格相关联的“对象存在的置信度”应该接近1
  3. **类别标签:**该网格单元还需要预测该对象的类别

负样本:

  1. **对象中心不落在网格内:**如果一个网格单元内没有任何真实对象(ground truth object)的中心,那么该网格单元就是一个“负样本”
  2. **存在性置信度:**与这些负样本网格相关联的“对象存在的置信度”接近0

推断


lrsG4Y.png lrsw6j.png lrsHN5.png lrsbI4.png lrsh0h.png

预测出一个每个框是一个类别,是一个条件概率

一些技巧


  1. 回归offset代替直接回归坐标

(x,y)不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。例如,第一个格点中物体坐标为 (2.3,3.6) ,另一个格点中的物体坐标为(5.4,6.3),这四个数值让神经网络暴力回归,有一定难度。所以这里的offset是指,既然格点已知,那么物体中心点的坐标一定在格点正方形里,相对于格点左上角的位移值一定在区间[0, 1)中。让神经网络去预测 (0.3,0.6) 与 (0.4,0.3) 会更加容易,在使用时,加上格点左上角坐标(2,3)、(5,6)即可

  1. 同一格点的不同预测框有不同作用

前文中提到,每个格点预测两个或多个矩形框。此时假设每个格点预测两个矩形框。那么在训练时,见到一个真实物体,我们是希望两个框都去逼近这个物体的真实矩形框,还是只用一个去逼近?或许通常来想,让两个人一起去做同一件事,比一个人做一件事成功率要高,所以可能会让两个框都去逼近这个真实物体。但是作者没有这样做,在损失函数计算中,只对和真实物体最接近的框计算损失,其余框不进行修正。这样操作之后作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升

  1. 使用非极大抑制生成预测框

在推理时,使用物体的类别预测最大值p乘以预测框的最大值c,作为输出预测物体的置信度。这样也可以过滤掉一些大部分重叠的矩形框。输出检测物体的置信度,同时考虑了矩形框与类别,满足阈值的输出更加可信

优缺点


优点:

  1. **速度:**最显著的优点是速度
  2. **全局信息:**由于YOLO在整个图像上进行推断,而不是在局部区域进行,因此它能更好地利用全局上下文信息
  3. **多尺度检测:**虽然初版的YOLO主要用于固定尺度的检测,但其架构灵活地支持多尺度检测
  4. 迁移泛化能力强

缺点:

  1. **准确性:**初版的YOLO在小目标或密集排列目标的检测方面存在一定的局限性
  2. **定位误差:**由于使用了较大的网格来预测边界框,YOLOv1对目标的定位不如基于候选区域的方法准确
  3. **每个网格只检测一个类别:**在 YOLOv1 的设计中,每个网格只预测一个类别和一个边界框,这限制了它在一个小区域内检测多个目标的能力
  4. **高召回率但低准确率:**通常有更高的召回率(检测到更多的真实目标)但更低的准确率(更多的误检)
  5. 在YOLOv1中,其backbone先在ImageNet上进行预训练,预训练时所输入的图像尺寸是224×224,而做检测任务时,YOLOv1所接收的输入图像尺寸是448×448
  • 分类转换成了回归
  • 训练阶段-中心点落到那个框中就由那个框产生的预测框负责预测-逐渐拟合
  • 因为YOLO中每个cell只预测两个bbox和一个类别,这就限制了能预测重叠或邻近物体的数量,比如说两个物体的中心点都落在这个cell中,但是这个cell只能预测一个类别
  • 此外,不像Faster R-CNN一样预测offset,YOLO是直接预测bbox的位置的,这就增加了训练的难度
  • YOLO是根据训练数据来预测bbox的,但是当测试数据中的物体出现了训练数据中的物体没有的长宽比时,YOLO的泛化能力低
  • 同时经过多次下采样,使得最终得到的feature的分辨率比较低,就是得到coarse feature,这可能会影响到物体的定位
  • 损失函数的设计存在缺陷,使得物体的定位误差有点儿大,尤其在不同尺寸大小的物体的处理上还有待加强
  • **实时应用:**由于其高速和简洁性,YOLO 特别适用于实时或近实时的应用,比如自动驾驶、监控等
  • **易于实现和部署:**相对较少的组件和端到端的设计使得 YOLO 更容易实现和部署

YOLO V2


简介


lrsVPU.png

Yolov2论文标题就是更好,更快,更强。Yolov1发表之后,计算机视觉领域出现了很多trick,例如批归一化、多尺度训练,v2也尝试借鉴了R-CNN体系中的anchor box,所有的改进提升,下面逐一介绍

Better


Batch Normalization(批归一化)

在YOLOv1中,每一层卷积的结构都是线性卷积和激活函数,并没有使用批归一化(batch normalization,简称BN)。于是,在YOLOv2中,YOLO作者为YOLOv1添加了BN层,即卷积层的组成从原先的线性卷积与激活函数的组合改进为后来常用的“卷积三件套”:线性卷积、BN层以及激活函数

lrsWFq.png
lrsvNs.png

Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用dropout

lrsaaa.png lrsDM7.png

0附近,激活函数活跃区,容易进行收敛

BN和Dropout不能一起用

High Resolution Classifier(分类网络高分辨率预训练)

backbone网络在ImageNet上看得都是224×224的低分辨率图像,突然看到448×448的高分辨率图像,难免会“眼晕”。为了缓解这一问题,作者将已经在224×224的低分辨率图像上训练好的分类网络又在448×448的高分辨率图像上进行微调,共微调10个轮次。微调完毕后,再去掉最后的全局平均池化层和softmax层,作为最终的backbone网络

lrsS0I.png
Convolutional With Anchor Boxes(Anchor Box-替换全连接层)

更加容易学习和收敛

在v2中,神经网络不对预测矩形框的宽高的绝对值进行预测,而是预测与Anchor框的偏差(offset),每个格点指定n(5)个Anchor框。在训练时,最接近ground truth的框产生loss,其余框不产生loss。在引入Anchor Box操作后,mAP由69.5下降至69.2,原因在于,每个格点预测的物体变多之后,召回率大幅上升,准确率有所下降,总体mAP略有下降

lrsRkJ.png

v2中移除了v1最后的两层全连接层,全连接层计算量大,耗时久。文中没有详细描述全连接层的替换方案,这里笔者猜测是利用1*1的卷积层代替(欢迎指正),具体的网络结构原文中没有提

lrsU5V.png
Dimension Clusters(Anchor Box的宽高由聚类产生)

Anchor Box的宽高不经过人为获得,而是将训练数据集中的矩形框全部拿出来。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
d ( box,centroid ) = 1 − IOU(box,centroid) d(\text{box,centroid})=1-\text{IOU(box,centroid)} d(box,centroid)=1IOU(box,centroid)
聚类选择5个Anchor,等价于手动要9个Anchor效果

Direct location prediction(绝对位置预测)

作者又对边界框的预测方法做了相应的调整

首先,对每一个边界框,YOLO仍旧去学习中心点偏移量 t x t_x tx t y t_y ty。我们知道,这个中心点偏移量是介于01范围之间的数,在YOLOv1时,作者没有在意这一点,直接使用线性函数输出,这显然是有问题的,在训练初期,模型很有可能会输出数值极大的中心点偏移量,导致训练不稳定甚至发散。于是,作者使用sigmoid函数使得网络对偏移量的预测是处在01范围中。我们的YOLOv1+正是借鉴了这一点

其次,对每一个边界框,由于有了边界框的尺寸先验信息,故网络不必再去学习整个边界框的宽高了。假设某个先验框的宽和高分别为 p w p_w pw p h p_h ph,网络输出宽高的偏移量为 t w t_w tw t h t_h th,则使用公式即可解算出边界框的宽和高

lrsYbG.png

预测框的中心线被限制在一个cell里

偏移量的限制,野蛮生长,限制0-1之间,限制正数

Fine-Grained Features(细粒度特征)

lrsrRB.png

不难发现,特征图在经过reorg操作的处理后,特征图的宽高会减半,而通道则扩充至4倍,因此,从backbone拿出来的26×26×512特征图就变成了13×13×2048特征图。这种特殊降采样操作的好处就在于降低分辨率的同时,没丢掉任何细节信息,信息总量保持不变引入更多的细节信息,确实有助于提升模型的检测性能

lrstFt.png

底层的细粒度特征与高层的语义特征;有利于小物体检测

Multi-Scale Training(多尺寸训练)

lrs4qb.png

在训练网络时,每训练迭代10次(常用iteration表示训练一次,即一次前向传播和一次反向传播,而训练一轮次则用epoch,即数据集的所有数据都经过了一次迭代),就从**{320,352,384,416,448,480,512,576,608}**选择一个新的图像尺寸用作后续10次训练的图像尺寸。注意,这些尺寸都是32的整数倍,因为网络的最大降采样倍数就是32。兼容不同,小分辨率速度就快的能力

这种多尺度训练的好处就在于可以改变数据集中各类物体的大小占比,比如说,一个物体在608的图像中占据较多的像素,面积较大,而在320图像中就会变少了,就所占的像素数量而言,相当于从一个较大的物体变成了较小物体。通常,多尺度训练是常用的提升模型性能的技巧之一。不过,技巧终归是技巧,并不总是有效的,若是我们的目标几乎不会有明显的尺寸变化,那么也就没必要进行多尺度训练了

Faster


Darknet-19:

lrsCae.png

左边是分类:训练,224-224,160epcohs,多项式学习率衰减0.1,正则化0.0005,动量0.9,剪切,旋转,色调,饱和度,明亮,再在448-448上训练10epcohs

修改成目标检测网络:160epochs,开始学习率0.001,10-60-90分别除以10,0.0005,0.9,随即裁剪,颜色变化

类别更多:训练阶段,检测到是分类标签的就反向传播分类损失,目标检测类比,使模型具有两者的能力

Stronger


联合训练方法思路简单清晰,Yolo v2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和ImageNet大致相同。

联合分类与检测数据集,这里不同于将网络的backbone在ImageNet上进行预训练,预训练只能提高卷积核的鲁棒性,而分类检测数据集联合,可以扩充识别物体种类。例如,在检测物体数据集中,有类别人,当网络有了一定的找出人的位置的能力后,可以通过分类数据集,添加细分类别:男人、女人、小孩、成人、运动员等等。这里会遇到一个问题,类别之间并不一定是互斥关系,可能是包含(例如人与男人)、相交(运动员与男人),那么在网络中,该怎么对类别进行预测和训练呢?

作者使用WordTree,解决了ImageNet与coco之间的类别问题

lrsj3w.png

树结构表示物体之间的从属关系非常合适,第一个大类,物体,物体之下有动物、人工制品、自然物体等,动物中又有更具体的分类。此时,在类别中,不对所有的类别进行softmax操作,而对同一层级的类别进行softmax

lrsn56.png

如图中所示,同一颜色的位置,进行softmax操作,使得同一颜色中只有一个类别预测分值最大。在预测时,从树的根节点开始向下检索,每次选取预测分值最高的子节点,直到所有选择的节点预测分值连乘后小于某一阈值时停止。在训练时,如果标签为人,那么只对人这个节点以及其所有的父节点进行loss计算,而其子节点,男人、女人、小孩等,不进行loss计算

计算损失


lrsJMP.png

第一项loss是计算background的置信度误差,但是哪些预测框来预测背景呢,需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差

第二项是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算,我觉得这项应该是在训练前期使预测框快速学习到先验框的形状

第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。在计算obj置信度时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。这点在YOLOv3论文中也有相关说明:YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框

尽管YOLOv2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss

另外需要注意的一点是,在计算boxes的和误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正:l.coord_scale * (2 - truth.w*truth.h),这样对于尺度较小的boxes其权重系数会更大一些,起到和YOLOv1计算平方根相似的效果

正负样例


正样本(Positive Samples):

  1. IoU(交并比):在训练过程中,YOLOv2通常使用IoU(Intersection over Union)来确定哪些锚框(Anchor Boxes)与真实边界框(Ground Truth Bounding Boxes)匹配。一般情况下,如果某个锚框与真实边界框的IoU超过一个预定的阈值(通常为0.5或更高),则该锚框被认为是一个正样本
  2. 最佳锚框:对于每个真实边界框,选择与其具有最高IoU的锚框,即使IoU值低于阈值
  3. 分类标签:正样本的分类标签通常与其对应的真实边界框的类别标签相同

负样本(Negative Samples):

  1. 低IoU:通常,具有低IoU(与所有真实边界框的IoU都低于某一阈值)的锚框被认为是负样本
  2. 背景分类:负样本通常被分配一个“背景”分类标签,这意味着这些锚框不包含任何感兴趣的目标

通过这种方式,YOLOv2试图在正样本中捕获各种形状和尺寸的目标,同时也生成负样本以帮助模型更好地区分目标和背景。这样的正负样本配置对于训练一个健壮和高性能的目标检测模型是至关重要的

优缺点


  1. Darknet-19:YOLOv2提出了一个全新的19层网络架构(Darknet-19),用于特征提取。该网络既轻量级也高效

  2. 锚框(Anchor Boxes):使用锚框可以更准确地检测不同形状和大小的物体,改进了对高度重叠物体的检测能力

  3. 多尺度检测:通过引入多尺度检测,YOLOv2能更好地检测不同大小的物体。这极大地提高了对小目标的检测能力

  4. 速度快:YOLOv2是为实时性能优化的。只需要一次前向传播,就能完成目标的检测

  5. 联合训练(Joint Training):YOLOv2可以同时在检测和分类任务上进行训练,这提高了其泛化性能

  6. 位置敏感性和类别预测:YOLOv2对于物体位置的敏感性减小,而对于类别预测的准确性提高

  7. 对小目标的检测不佳:尽管进行了多尺度检测,YOLOv2对小目标的检测性能仍然不如一些其他算法

  8. 处理高度重叠目标的挑战:尽管引入了锚框,但在高度重叠或密集的物体情况下,检测性能仍然有待提高

  9. 位置精度较低:虽然YOLOv2在类别识别方面表现出色,但在定位物体方面的精度相对较低

YOLO V3


结构


lrsfBQ.png

lrsibf.png

lrssRc.png

lrs2Z3.png

lrsFqj.png

lrsZD5.png

在Yolov3的设计中,每个特征图的每个格子中,都配置3个不同的先验框,所以最后三个特征图

先验框


lrsdfm.png

在Yolov1中,网络直接回归检测框的宽、高,这样效果有限。所以在Yolov2中,改为了回归基于先验框的变化值,这样网络的学习难度降低,整体精度提升不小。Yolov3沿用了Yolov2中关于先验框的技巧,并且使用k-means对数据集中的标签框进行聚类,得到类别中心点的9个框,作为先验框。在COCO数据集中(原始图片全部resize为416 × 416),九个框分别是 (10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) ,顺序为w × h

检测置信度解码


lrso34.png

  1. 置信度用逻辑回归,v3变成二分类, 应该找到iou最大的预测框去拟合真实的且置信度标签置为1(9个anchors)
  2. 置信度在输出85维中占固定一位,由sigmoid函数解码即可,解码之后数值区间在[0,1]中

v1和v2使用iou作为置信度标签

  1. 预测框和真实最高只有0.7
  2. 小目标,iou对像素偏移很敏感,无法有效学习

多类别标注与分类,每一个类别输出一个概率,有别于前面的网络概率和为1

多标签,softmax默认是互斥的

类别解码


COCO数据集有80个类别,所以类别数在85维输出中占了80维,每一维独立代表一个类别的置信度。使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活

三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:

  1. 训练时4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算
  2. 推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了

检测框解码


有了先验框与输出特征图,就可以解码检测框 x,y,w,h,类似于V2

计算损失


lr2kJ9.png

正负样本产生


lr29Ah.png

L o s s = l o s s N 1 + l o s s N 2 + l o s s N 3 Loss=loss_{N_1}+loss_{N_2}+loss_{N_3} Loss=lossN1+lossN2+lossN3

x、y、w、h使用MSE作为损失函数,也可以使用smooth L1 loss(出自Faster R-CNN)作为损失函数。smooth L1可以使训练更加平滑。置信度、类别标签由于是0,1二分类,所以使用交叉熵作为损失函数

训练与测试


lr2TBY.png lr2mgH.png

训练策略解释:

  1. ground truth为什么不按照中心点分配对应的预测box?

(1)在Yolov3的训练策略中,不再像Yolov1那样,每个cell负责中心落在该cell中的ground truth。原因是Yolov3一共产生3个特征图,3个特征图上的cell,中心是有重合的。训练时,可能最契合的是特征图1的第3个box,但是推理的时候特征图2的第1个box置信度最高。所以Yolov3的训练,不再按照ground truth中心点,严格分配指定cell,而是根据预测值寻找IOU最大的预测框作为正例

(2)笔者实验结果:第一种,ground truth先从9个先验框中确定最接近的先验框,这样可以确定ground truth所属第几个特征图以及第几个box位置,之后根据中心点进一步分配。第二种,全部4032个输出框直接和ground truth计算IOU,取IOU最高的cell分配ground truth。第二种计算方式的IOU数值,往往都比第一种要高,这样wh与xy的loss较小,网络可以更加关注类别和置信度的学习;其次,在推理时,是按照置信度排序,再进行nms筛选,第二种训练方式,每次给ground truth分配的box都是最契合的box,给这样的box置信度打1的标签,更加合理,最接近的box,在推理时更容易被发现

  1. Yolov1中的置信度标签,就是预测框与真实框的IOU,Yolov3为什么是1?

(1)置信度意味着该预测框是或者不是一个真实物体,是一个二分类,所以标签是1、0更加合理

(2)笔者实验结果:第一种:置信度标签取预测框与真实框的IOU;第二种:置信度标签取1。第一种的结果是,在训练时,有些预测框与真实框的IOU极限值就是0.7左右,置信度以0.7作为标签,置信度学习有一些偏差,最后学到的数值是0.5,0.6,那么假设推理时的激活阈值为0.7,这个检测框就被过滤掉了。但是IOU为0.7的预测框,其实已经是比较好的学习样例了。尤其是coco中的小像素物体,几个像素就可能很大程度影响IOU,所以第一种训练方法中,置信度的标签始终很小,无法有效学习,导致检测召回率不高。而检测框趋于收敛,IOU收敛至1,置信度就可以学习到1,这样的设想太过理想化。而使用第二种方法,召回率明显提升了很高

  1. 为什么有忽略样例?

(1)忽略样例是Yolov3中的点睛之笔。由于Yolov3使用了多尺度特征图,不同尺度的特征图之间会有重合检测部分。比如有一个真实物体,在训练时被分配到的检测框是特征图1的第三个box,IOU达0.98,此时恰好特征图2的第一个box与该ground truth的IOU达0.95,也检测到了该ground truth,如果此时给其置信度强行打0的标签,网络学习效果会不理想

(2)笔者实验结果:如果给全部的忽略样例置信度标签打0,那么最终的loss函数会变成 L o s s o b j Loss_{obj} Lossobj L o s s n o o b j Loss_{noobj} Lossnoobj的拉扯,不管两个loss数值的权重怎么调整,或者网络预测趋向于大多数预测为负例,或者趋向于大多数预测为正例。而加入了忽略样例之后,网络才可以学习区分正负

优缺点


优点:

  1. 多尺度检测:YOLOv3在三个不同的尺度上进行检测,提高了模型对于不同大小物体的识别能力
  1. 浅层,细粒度,圆角,结构,颜色,板块

  2. 深层,纹理 ,眼镜,腿,汽车等语义信息

  1. 类别不确定性(Class Prediction):在类别预测方面,YOLOv3采用了逻辑回归而非softmax,从而可以更好地处理多标签场景
  2. 更多的Anchor Boxes:YOLOv3使用了多达9个锚框(分布在三个不同的尺度上),相比YOLOv2更能准确地适应不同形状和大小的目标
  3. 更大的模型和更深的架构:YOLOv3使用了Darknet-53,一个比YOLOv2的Darknet-19更大、更深的网络架构,以获得更高的准确性
  4. 新的损失函数:YOLOv3采用了一个新的损失函数,更加注重目标的定位和分类,使模型在多方面都得到了改进

缺点:

  1. 小目标检测仍有局限性:尽管YOLOv3通过多尺度检测做了一定程度的改进,但对于小目标的检测准确性相对仍然较低
  2. 高置信度的错误检测:YOLOv3可能会生成一些高置信度的错误检测,尤其是在目标密集或重叠的场景中
  3. 对标注质量的依赖:与其他目标检测算法一样,YOLOv3对于高质量的标注数据非常依赖。任何标注错误或不一致都可能对模型性能产生负面影响

YOLO V4


简介


lr2pRZ.png

lr2KdB.jpg

结构


Yolo-v4:主要由三部分组成: Backbone,Neck和Head

lr2LZU.png

lr2lDs.png

创新点

  1. **输入端的创新点:**训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
  2. **BackBone主干网络:**各种方法技巧结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
  3. **Neck:**目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构
  4. **Prediction:**输出层的锚框机制和Yolov3相同,主要改进的是训练时的回归框位置损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
输入端创新

Yolov4对训练时的输入端进行改进,使得训练时在单张GPU上跑的结果也蛮好的。比如数据增强Mosaic、cmBN、SAT自对抗训练

  1. Mosaic

Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接

lr25Vw.png

为什么要进行Mosaic数据增强呢?

在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。Coco数据集中小目标占比达到41.4%,数量比中目标和大目标都要多。但在所有的训练集图片中,只有52.3%的图片有小目标,而中目标和大目标的分布相对来说更加均匀一些。针对这种状况,Yolov4的作者采用了Mosaic数据增强的方式

主要有2个优点:

**丰富数据集:**随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好
**batch不需要很大:**Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果

  1. cmBN

CmBN的做法和前面两个都不一样,其把大batch内部的4个mini batch当做一个整体,对外隔离,主要改变在于BN层的统计量计算方面,具体流程是:假设当前是第t次迭代时刻,也是mini-batch的起点,

(1) 在第t时刻开始进行梯度累加操作

(2) 在第t时刻开始进行BN统计量汇合操作,这个就是和CBN的区别,CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,其仅仅在mini batch内部进行汇合操作

(3) 就是正常的应用BN,对输入进行变换输出即可

(4) 在mini batch的最后一个时刻,进行参数更新和可学习参数更新

可以明显发现CmBN是CBN的简化版本,其唯一差别就是在计算第t时刻的BN统计量时候,CBN会考虑前一个mini batch内部的统计量,而CmBN版本,所有计算都是在mini batch内部。有人认为这种做法是为了减少内存消耗,提高训练速度,既然大家都是近似,差距应该不大,而且本身yolo训练时候,batch也不会特别小,不至于是1-2,所以CmBN的做法应该是为了yolov4专门设计的,属于实践性改进

  1. SAT自对抗训练

自对抗训练(Self-Adversarial Training,简称SAT)在YOLOv4中作为一种数据增强的方式出现。自对抗训练是一种基于生成对抗网络(GAN)中对抗训练概念的扩展。其主要目标是通过改变输入图像,使得网络难以识别,从而迫使网络提高泛化性能

在YOLOv4中,自对抗训练的主要步骤如下:

  1. 前向传播:首先,一个输入图像通过网络进行前向传播
  2. 计算损失:然后,计算预测与实际标签之间的损失
  3. 梯度回传:损失向后传播通过网络,以更新其参数
  4. 对抗性扰动:使用这些梯度来计算一个微小的对抗性扰动,该扰动能够使得损失最大化
  5. 应用扰动:将计算出的对抗性扰动应用于原始输入图像
  6. 再次训练:使用添加了对抗性扰动的图像再次进行前向和后向传播,并更新网络参数

这个过程旨在提高模型对输入变化的鲁棒性,从而在实际应用中达到更好的性能

需要指出的是,生成自对抗样本的具体方法可以有很多种方式,如添加噪声、旋转、缩放、颜色扰动等

Backbone主干结构

骨干部分图如下:

lr27fa.png

因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19 经过5次CSP模块后得到19-19大小的特征图。而且作者只在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数

YOLOv3的主干网络采用的是darknet53,yolov4的Backbone:采用的主干网络为 CSPDarknet53

  1. CBM:

Yolov4网络结构中的最小组件CBM,由Conv+Bn+Mish激活函数三者组成

首先,给定一张大小为 608-608-3 的输入图像,经过3-3的Conv1 之后得到低层全局特征图,经过BN层的归一化处理后,再经过mish激活函数R,H=W=608,C=32;然后将该特征图。处理得到一个 608-608-32的特征图

Mish:
ReLU 和 Mish 的对比,Mish 的梯度更平滑,Mish 检查了理想的激活函数应该是什么(平滑、处理负号等)的所有内容

lr2AJ6.png $$ f(x)=x*tanh(ln(1+e^x)) $$ 以上无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许,允许更好的梯度流,而不是像 ReLU 中那样的硬零边界。最后,可能也是最重要的,目前的想法是,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

这里的主要区别可能是 Mish 函数在曲线上几乎所有点上的平滑度。这种通过 Mish 激活曲线平滑性来推送信息的能力如下图所示,在本文的一个简单测试中,越来越多的层被添加到一个测试神经网络中,而没有一个统一的函数。随着层深的增加ReLU 精度迅速下降,其次是 Swish。相比之下,Mish 能更好地保持准确性,这可能是因为它能更好地传播信息:

lr2NAI.png
  1. CSP模块

CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率

由CBM组件和X个Res unint模块Concate组成

第一个CSP模块:由CBM组件和1个Res unint模块Concate组成

​ 将CBM组件处理后的特征图608-608-32的F_conv2传入第一个CSP1模块进行处理(其中只有1个残差单元)

第二个CSP模块:由CBM组件和2个Res unint模块Concate组成

将第一个csp模块处理后的304-304-64特征图,传入到第二个CSP模块处理

同理经过下采样后变成了152152128的特征图,然后分别经过两个1164的s=1的卷积后得到两个分支,其中一个分支的特征块进入残差模块进行处理后,再与另一个分支进行拼接,最后第二个csp模块的最后输出是152-152-128 (残差模块中的卷积层:1-1-64和3-3-64)

第三个CSP模块:由8个Res unint模块和CBM组件Concate组成

将第二个csp模块处理后的52-152-128 的特征图,传入到第三个个CSP模块处理

同理也是经过同样的操作,最后第三个csp模块的最后输出是76-76-256 (残差模块中的卷积层:1-1-128和3-3-128),这个模块后又分为两个分支,一个分支继续进行csp模块处理,另一个分支直接进入到neck处理

第四个CSP模块:由8个Res unint模块和CBM组件Concate组成

将第三个csp模块的一个分支76-76-256的特征图,传入到第四个CSP模块处理

同理也是经过同样的操作,最后第四个csp模块的最后输出是38-38-512 (残差模块中的卷积层:1-1-256和3-3-256),这个模块后又分为两个分支,一个分支继续进行csp模块处理,另一个分支直接进入到neck处理

第五个CSP模块:由4个Res unint模块和CBM组件Concate组成

将第四个csp模块的一个分支38-38-512的特征图,传入到第五个CSP模块处理

同理也是经过同样的操作,最后第五个csp模块的最后输出是19-19-1024 (残差模块中的卷积层:1-1-512和3-3-512),这个模块输出结果直接进入到neck处理

  1. Dropblock

    Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式

    传统的Dropout很简单,一句话就可以说的清:随机删除减少神经元的数量,使网络变得更简单

    dropout主要作用在全连接层,而dropblock可以作用在任何卷积层之上

    lr2WTO.png

    文章分析了传统 dropout 在 conv 上效果不好的原因: conv 具有空间相关性,所以即使对一些单元随机进行 dropout,仍然可以有信息流向后面的网络,导致 dropout 不彻底

    中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息

    lr2chQ.png

    而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。在特征图上一块一块的进行归0操作,去促使网络去学习更加鲁棒的特征

    为了保证Dropblock后的特征图与原先特征图大小一致,需要和dropout一样,进行rescale操作

neck

lr2qJV.png

特征增强模块,主要由CBL组件,SPP模块和FPN+PAN的方式组成

  1. CBL组件:

由Conv+Bn+Leaky_relu激活函数三者组成

将第五个csp4模块的输出结果19-19-1024的特征图,传入到CBL组件中处理

spp前后三个CBL组件是对称的,它们的卷积分别是1-1-512,3-3-1024和1-1-512,步长都是1

  1. SPP模块:

采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合

lr2wTL.png

spp模块采用的1×1 ,5×5 padding=5 // 2,9×9 padding=9 // 2,13×13 padding=13 // 2的最大池化的方式,进行多尺度融合,从前面三个CBL组件输出的结果:1919512的特征图,将之送入spp模块中,最后的结果为19192048,再经过三个CBL组件的卷积后得到1919512的特征图

  1. FPN+PAN的结构:

    PAN是借鉴图像分割领域PANet的创新点

    lr2ygJ.png

    这样结合操作,FPN层自顶向下传达强语义特征,而PAN则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,加速了不同尺度特征的融合,进一步提高特征提取的能力

    FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力

    原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用**concat(route)**操作,特征图融合后的尺寸发生了变化

    lr2vYf.png
Head

YoloHead利用获得到的特征进行预测,是一个解码的过程

  1. 先验框(anchor box)

    YOLO3采用了K-means聚类得到先验框的尺寸,YOLO4延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框

  2. 解码检测框

有了先验框与输出特征图后,就可以解码检测框 x,y,w,h。 例如:(19,19,3,85),分别对应着19*19个网格,每个网格3种anchors,85=(x,y,w,h,confident),此时box的x,y是相对于网格的偏移量,所以还需要经过一些列的处理,处理方式见下图:

lr2gut.png

  1. 置信度解码

物体的检测置信度,置信度在输出85维中占固定一位,由sigmoid函数解码即可,解码之后数值区间在[0,1]中

  1. 类别解码

COCO数据集有80个类别,所以类别数在85维输出中占了80维,每一维独立代表一个类别的置信度。使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活

  1. 筛选预测框

三个特征图一共可以解码出 19 × 19 × 3 + 38 × 38× 3 + 76 × 76 × 3 = 22743个box以及相应的类别、置信度。 首先,设置一个置信度阈值,筛选掉低于阈值的box,再经过DIOU_NMS(非极大值抑制)后,就可以输出整个网络的预测结果了

回归框损失函数:Smooth L1 loss;IoU;G;D;C

IOU 作为损失函数会出现的问题(缺点)
如果两个框没有相交,根据定义,loU=0,不能反映两者的距离大小(重合度)。同时因为 loss=0,没有梯度回传,无法进行学习训练。loU 无法精确的反映两者的重合度大小。

如下图所示,三种情况 loU 都相等,但看得出来他们的重合度是不一样的,左边的图回归的效果最好,右边的最差–水平线–旋转

lr2hOb.png

GIoU:

由于 loU 是比值的概念,对目标物体的 scale 是不敏感的。然而检测任务中的 BBox 的回归损失(MSE loss,11-smooth loss 等)优化和loU 优化不是完全等价的,而且 Ln 范数对物体的 scale 也比较敏感,loU 无法直接优化没有重叠的部分
G I o U = I o U − ∣ A c − U ∣ ∣ A c ∣ GIoU=IoU-\frac{|A_c-U|}{|A_c|} GIoU=IoUAcAcU
上面公式的意思是:先计算两个框的最小闭包区域面积[公式1(通俗理解:同时包含预测框和真实框的最小框的面积),再计算出 loU,再计算闭包区域中不属于两个框的区域占闭包区域的比重,最后用 loU 减去这个比重得到 GIOU。

特性
1.与loU 相似,GloU 也是一种距离度量,作为损失函数的话, [公式1,满足损失函数的基本要求
2.GloU 对 scale 不敏感
3.GloU 是 loU 的下界,在两个框无限重合的情况下,loU=GloU=1

4 loU 取值[0,1],但 GloU 有对称区间,取值范围[-1,1]。在两者重合的时候取最大值 1.4.在两者无交集且无限远的时候取最小值-1,因此 GloU 是一个非常好的距离度量指标5.

与loU 只关注重叠区域不同,GloU 不仅关注重叠区域,还关注其他的非重合区域,能更好的反映两者的重合度。

DIoU:

lr28fe.png

DloU 要比 Glou 更加符合目标框回归的机制,将目标与 anchor 之间的距离,重叠率以及尺度都考虑进去,使得目标框回归变得更加稳定,不会像 U 和 GloU 一样出现训练过程中发散等问题。
论文中基于 loU 和 GloU 存在的问题,作者提出了两个问题:
1.直接最小化 anchor 框与目标框之间的归一化距离是否可行,以达到更快的收敛速度?
2.如何使回归在与目标框有重叠甚至包含时更准确、更快?
D I o U = I o U − ρ 2 ( b , b g t ) c 2 DIoU=IoU-\frac{\rho^2(b,b^{gt})}{c^2} DIoU=IoUc2ρ2(b,bgt)
其中,b,b“分别代表了预测框和真实框的中心点,且p代表的是计算两个中心点间的欧式距离。c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离.

lr2xlP.png

优点
与 GloU loss 类似,DloU loss ( [公式] ) 在与目标框不重叠时,仍然可以为边界框提供移动方向。
DloU loss 可以直接最小化两个目标框的距离,因此比 GloU loss 收敛快得多

CIoU:

论文考虑到 bbox 回归三要素中的长宽比还没被考虑到计算中,因此,进一步在 DIoU的基础上提出了 CloU。其惩罚项如下面公式:
R C I o U = ρ 2 ( b , b g t ) c 2 + α v \mathcal{R}_{CIoU}=\frac{\rho^2\left(\mathbf{b},\mathbf{b}^{gt}\right)}{c^2}+\alpha v RCIoU=c2ρ2(b,bgt)+αv
其中a 是权重函数
α = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-IoU)+v} α=(1IoU)+vv
而v用来度量长宽比的相似性,定义为
v = 4 π 2 ( arctan ⁡ w g t h g t − arctan ⁡ w h ) 2 v=\frac{4}{\pi^2}\bigg(\arctan\frac{w^{gt}}{h^{gt}}-\arctan\frac{w}{h}\bigg)^2 v=π24(arctanhgtwgtarctanhw)2
完整的 CloU 损失函数定义:

是后CloU loss的梯度类们于 DloU loss,但还要考虑1的梯度
∂ v ∂ w = 8 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) × h w 2 + h 2 , ∂ v ∂ h = − 8 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) × w w 2 + h 2 . \begin{gathered} \frac{\partial v}{\partial w} =\frac8{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac wh)\times\frac h{w^2+h^2}, \\ \frac{\partial v}{\partial h} =-\frac8{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac wh)\times\frac w{w^2+h^2}. \end{gathered} wv=π28(arctanhgtwgtarctanhw)×w2+h2h,hv=π28(arctanhgtwgtarctanhw)×w2+h2w.
反向传播, 1 w 2 + h 2 \frac{1}{w^{2}+h^{2}} w2+h21=1,防止梯度爆炸

V4使用到的技术


YOLOv4 网络由以下部分组成

  • Backbone: CSPDarknet53
  • Neck: SPP, PAN
  • Head: YOLOv3

同时,YOLO v4 使用了

  • 用于 backboneBoFCutMixMosaic数据增强,DropBlock正则化,类标签平滑
  • 用于 backboneBoSMish激活,跨阶段部分连接(CSP),多输入加权残余连接(MiWRC
  • 用于检测器的 BoFCIoU 损失,CmBNDropBlock 正则化,mosaic 数据增强,自我对抗训练,消除网格敏感性,在单个 ground-truth 上使用多个 anchor,余弦退火调度器,最佳超参数,随机训练形状
  • 用于检测器 BoSMish 激活,SPP 模块,SAM 模块,PAN 路径聚集块,DIoU-NMS

结合上一章节,我们再介绍几个技术:

  1. SAM(空间注意力机制)
lr2nis.png

YOLOv4 中的 SAM(Spatial Attention Module)是一个设计用来改进特征表达的组件。空间注意力机制的核心思想是在各个空间位置上动态地重新调整特征图(Feature Map),使模型能够更加关注那些对于目标任务更为重要的区域

具体来说,SAM 通过学习一个空间注意力图(Spatial Attention Map),该图与输入的特征图有相同的空间维度(宽度和高度),但每个位置的值范围在 0 到 1 之间。这个注意力图然后与原始的特征图进行逐元素的乘法运算(element-wise multiplication),以此来重新调整特征图的每个空间位置的重要性

这种机制允许模型在不同的任务和数据集上有更好的泛化性能,尤其是在目标尺寸、形状或姿态变化很大的情况下。通过引入空间注意力机制,YOLOv4 能够更加准确地检测各种各样的对象,从而提高整体的目标检测性能

类别不平衡问题(Focal Loss )


主要用于解决目标检测中的类别不平衡问题。Focal Loss 动态地调整损失函数,在训练过程中降低容易分类样本的权重,从而让模型更加关注难以分类的样本。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。

Focus模块是为减少FLOPS和提高速度而设计的,而不是mAP

损失函数形式
Focal loss 是在交又损失函数基础上进行的修改,首先回顾二分类交叉上损失:
L = − y l o g y ′ − ( 1 − y ) log ⁡ ( 1 − y ′ ) = { − l o g y ′ , y = 1 − log ⁡ ( 1 − y ′ ) y = 0 \mathrm{L}=-\mathrm{ylog}y^{\prime}-(1-y)\log(1-y^{\prime})=\left\{\begin{matrix}-logy^{\prime}&\quad,\quad&y=1\\-\log(1-y^{\prime})&\quad&y=0\end{matrix}\right. L=ylogy(1y)log(1y)={logylog(1y),y=1y=0
y ′ y^{'} y是经过激活函数的输出,所以在 0-1 之间。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。那么 Focalloss 是怎么改进的呢?
L f l = { − ( 1 − y ′ ) γ l o g y ′ , y = 1 − y ′ γ log ⁡ ( 1 − y ′ ) , y = 0 \mathrm{L}_{fl}=\left\{\begin{matrix}{-(1-y^{\prime})^{\gamma}logy^{\prime}}&{,\quad}&{y=1}\\{-y^{\prime\gamma}\log(1-y^{\prime}),\quad}&{y=0}\\\end{matrix}\right. Lfl={(1y)γlogyyγlog(1y),,y=0y=1
image-20230831124226143

首先在原有的基础上加了一个因子,其中 gamma>0 使得减少易分类样本的损失。使得更关注于困难的、错分的样本。

  1. 平衡训练样本: 在分类问题中,经常出现类别不平衡的情况,即某些类别的样本数量远多于其他类别。如果不特别关注错分或困难的样本,模型可能会偏向于多数类,从而导致对少数类的分类性能不佳
  2. 提高泛化能力: 关注困难样本有助于模型在未见过的数据上表现得更好。简单样本往往是“容易得分”的目标,而困难样本通常包含更多模型尚未学习到的信息
  3. 防止过拟合: 如果模型只学习简单样本,那么它可能会过拟合这些样本,从而在测试集上表现不佳。通过关注困难样本,模型可以在更复杂、更具挑战性的情境中进行学习,从而提高其泛化能力
  4. 提升模型鲁棒性: 通过在训练过程中关注困难或错分的样本,模型能更好地应对噪声和其他潜在的干扰因素

例如 gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的 gamma 次方就会很小,这时损失函数值就变得更小。而预测概率为 0.3 的样本其损失相对很大。对于负类样本而言同样,预测 0.1 的结果应当远比预测 0.7 的样本损失值要小得多。对于预测概率为 0.5 时,损失只减少了 0.25 倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。

此外,加入平衡因子 alpha,用来平衡正负样本本身的比例不均: 文中 alpha 取 0.25即正样本要比负样本占比小,这是因为负例易分
L f l = { − α ( 1 − y ′ ) γ l o g y ′ , y = 1 − ( 1 − α ) y ′ γ log ⁡ ( 1 − y ′ ) , y = 0 \mathrm{L}_{fl}=\left\{\begin{matrix}-\alpha(1-y')^\gamma logy'&\quad,\quad y=1\\-(1-\alpha)y'^\gamma\log(1-y'),&\quad y=0\end{matrix}\right. Lfl={α(1y)γlogy(1α)yγlog(1y),,y=1y=0
只添加 alpha 虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题

gamma 调节简单样本权重降低的速率,当 gamma为0 时即为交叉损失函数,当gamma 增加时,调整因子的影响也在增加。实验发现 gamma 为 2 是最优


  • 把宽度w和高度h的信息整合到c空间中

  • 在YOLOv5中,作者希望减少Conv2d计算的成本,并实际使用张量重塑来减少空间(分辨率)和增加深度(通道数量)

  • 以Yolov5s的结构为例,原始6406403的图像输入Focus结构,采用切片操作,先变成32032012的特征图,再经过一次32个卷积核的卷积操作,最终变成32032032的特征图

计算损失

位置损失

C I o U = 1 − I o U + ρ 2 ( A , B ) c 2 + α v CIoU=1-IoU+\frac{\rho^2(A,B)}{c^2}+\alpha v CIoU=1IoU+c2ρ2(A,B)+αv

置信度损失

置信度损失分为两个部分,有目标的置信度损失,无目标的置信度损失

置信度损失:采用二元交叉熵损失

有目标的置信度损失:
∑ i = 0 K × K ∑ j = 0 M I i j o b j [ C i l o g ( C ^ i ) + ( 1 − C i ) l o g ( 1 − C ^ i ) ] . \sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}[C_ilog(\hat{C}_i)+(1-C_i)log(1-\hat{C}_i)]. i=0K×Kj=0MIijobj[Cilog(C^i)+(1Ci)log(1C^i)].
无目标的置信度损失:
∑ i = 0 K × K ∑ j = 0 M I i j n o o b j [ C i l o g ( C ^ i ) + ( 1 − C i ) l o g ( 1 − C ^ i ) ] \sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{noobj}[C_ilog(\hat{C}_i)+(1-C_i)log(1-\hat{C}_i)] i=0K×Kj=0MIijnoobj[Cilog(C^i)+(1Ci)log(1C^i)]

分类损失:

Classification Loss = − ∑ c ∈ C p ( c ) log ⁡ ( q ( c ) ) \text{Classification Loss} = - \sum_{c \in C} p(c) \log(q(c)) Classification Loss=cCp(c)log(q(c))

L O S S 1 = C I O U − λ o b j ∑ i = 0 K ∗ K ∑ j = 0 M I i j o b j [ C i log ⁡ ( C i ^ ) + ( 1 − L i ) l o g ( C i ^ ) ] − λ n o o b j ∑ i = 0 K ∗ K ∑ j = 0 M I i j N O o b j [ C i log ⁡ ( C i ^ ) + ( 1 − C i ) l o g ( 1 − C i ^ ) ] − ∑ i = 0 K × K ∑ j = 0 M I i j o b j ∑ c ∈ c l a s s e s [ p i ( c ) l o g ( p ^ i ( c ) ) + ( 1 − p i ( c ) ) l o g ( 1 − p ^ i ( c ) ) ] \begin{gathered} \mathrm{LOSS1=CIOU-}\lambda_{obj}\sum_{i=0}^{K*K}\sum_{j=0}^{M}I_{ij}^{obj}[C_{i}\log{(\widehat{C_{i}})}+(1-{\cal L_{i}})log{(\widehat{C_{i}})}] \\ -\lambda_{noobj}\sum_{i=0}^{K*K}\sum_{j=0}^{M}I_{ij}^{NOobj}[C_{i}\log{(\widehat{C_{i}})}+(1-C_{i})log{(1-\widehat{C_{i}})}] \\ -\quad\sum_{i=0}^{K\times K}\sum_{j=0}^MI_{ij}^{obj}\sum_{c\in classes}[p_i(c)log(\hat{p}_i(c))+(1-p_i(c))log(1-\hat{p}_i(c))] \end{gathered} LOSS1=CIOUλobji=0KKj=0MIijobj[Cilog(Ci )+(1Li)log(Ci )]λnoobji=0KKj=0MIijNOobj[Cilog(Ci )+(1Ci)log(1Ci )]i=0K×Kj=0MIijobjcclasses[pi(c)log(p^i(c))+(1pi(c))log(1p^i(c))]

lr2adc.png

优缺点


优点:

  1. CIOU Loss(Complete Intersection over Union):这是一种改进的损失函数,用于解决传统IoU损失的一些问题,从而提高模型对目标定位的准确性
  2. PANet(Path Aggregation Network)和 SAM block:这些结构改进了特征传播和模型的注意力机制
  3. Mish 激活函数:这是一种替代 ReLU 的新型激活函数,旨在改进模型的训练稳定性和性能
  4. CSPDarknet53:这是一种更有效的特征提取网络,比起其他如 VGG 和 ResNet 等网络结构,它具有更高的运算效率
  5. 使用多尺度和多宽高比的锚点:这改进了对不同形状和大小的目标的检测能力

缺点:

  1. 计算复杂性:尽管 YOLOv4 针对速度进行了优化,但其模型结构仍然相当复杂,可能不适用于资源受限的硬件
  2. 可解释性与透明度:YOLOv4 的模型结构和算法相对复杂,这可能影响模型的可解释性和透明度
  3. 易用性和训练稳定性:由于模型结构和损失函数更为复杂,对于一般用户来说,训练一个稳定和高性能的 YOLOv4 模型可能需要更多的专业知识和经验

YOLO V5


lrZ9AP.png lrZmgO.png lt0aDI.png

科科:

lrFYbY.png

YOLO v5中的改进点:

  • 输入端: 数据增强(Mosaic Augmentation、MixUp、CutMix、Bluring、Label Smoothing等)、自适应锚框计算、自适应的图像缩放
  • BackBone骨干网络: Focus结构、CSP+DarkNet等
  • Neck:FPN+PAN、SPP等
  • Prediction:更换边框回归损失函数(GIoU_LOSS)
lrZkJw.png lrZLZf.png

Anchor


lrZ3uc.png lrZwTh.png lrZ7fj.png lrZQl5.png

FPN


lrZlO3.png

结构


lrZHYY.png

灵活配置不同复杂度


lrZKdH.png

CSPNet


lrZ8iq.png

SPP


lrZxls.png image-20230907154533761

PANet


lrZ5Va.png

先下后上采集的信息更加的丰富

各类损失函数


lrZns3.png lrZFt9.png lrZZeY.png lrZijm.png lrZ2m4.png lrZ68h.png lrZeyH.png

损失函数


lrZAX7.png

前两种是二元交叉熵

  • 大多数分类器假设输出标签是互斥的。如果输出是互斥的目标类别,则确实如此。 因此,YOLO应用softmax函数将得分转换为总和为1的概率。而YOLOv3/v4/v5使用多标签分类。例如,输出标签可以是“行人”和“儿童”,它们不是非排他性的。(现在输出得分的总和可以大于1)

  • YOLOv3/v4/v5用多个独立的逻辑 (logistic) 分类器替换sftmax函数,以计算输入属于特定标签的可能性

  • 在计算分类损失进行训练时,YOLOv3/v4/v5对每个标签使用二元交叉熵损失。这也避免使用softmax函数而降低了计算复杂度

lrZWTI.png
  • 边界框回归是许多2D /3D计算机视觉任务中最基本的组件之一

  • 改进机会是使用根据loU计算的度量损失取代替代回归损失 (l1和l2-norms)

lrZchV.png

lrZvrL.png

  • 收敛速度

  • 重叠面积,中心距离,宽高比

标注坐标转换


lrZadJ.png

目标框回归


lrZOwG.png lrZSSB.png lrZP7b.png lrZRVe.png

训练技巧:


  1. 预热训练
lrZzh6.png lrZtmw.png
  1. 余弦退火学习率

η t = η m i n i + 1 2 ( η m a x i − η m i n i ) ( 1 + cos ⁡ ( T c u r T i π ) ) \eta_t=\eta_{min}^i+\frac{1}{2}(\eta_{max}^i-\eta_{min}^i)(1+\cos(\frac{T_{cur}}{T_i}\pi)) ηt=ηmini+21(ηmaxiηmini)(1+cos(TiTcurπ))
lrZ4rO.png

自动计算锚框 Autoanchor


Anchor给出了目标宽高的初始值,需要回归的是目标真实宽高与初始宽高的偏移量,而不使用anchor的做法需要回归宽高的绝对量

自动锚只在最佳召回低于阈值时运行((BPR,最大可能召回率,98%)

聚类

超参数进化 hyperparameter evolution

超参数进化是一种利用遗传算法进行优化的超参数优化方法

自动混合精度训练Automatic mixed precision(AMP) training

默认情况下,GPU上的所有模型训练都启用AMP

所有的YOLOv5检查点都保存在FP16中。ai GPU推理在FP16上完成

lrZCeQ.png lrZXwf.png

断点续训

您可以单独使用resume,不带参数,或者指向要从中恢复的last.pt

Multi-GPU Training

数据并行(DataParalle)是PyTorch提供的最基本的方法,但有GPU内存不平衡的问题

分布式数据并行(Distributed DataParallel)是PyTorch的一个特性,最初是为分布式学习而创建的,但它也可以用于多GPU学习,没有内存不平衡问题和无法利用GPU,默认使用

Multi-GPU Training–ultralytics/yolov5 (github.com)

lrZjSc.png

并行数据加载

串行加载–并行加载–并行流水线(gpu处理数据-cpu还可以加载数据)

数据增强


lrdTWs.png lrdmja.png

Mixup-Cutout-CutMix

lrdLp7.png

在计算机视觉和深度学习中,数据增强(Data Augmentation)是一种常见的方法,用于增加训练数据集的多样性,减少模型过拟合,并提高模型在未见数据上的泛化能力

  1. Mixup

Mixup 是一种数据增强方法,通过对两张图像以及其相应标签的线性组合来生成新的训练样本
Mixup ( Image 1 , Image 2 , λ ) = λ × Image 1 + ( 1 − λ ) × Image 2 \text{Mixup}(\text{Image}_1, \text{Image}_2, \lambda) = \lambda \times \text{Image}_1 + (1-\lambda) \times \text{Image}_2 Mixup(Image1,Image2,λ)=λ×Image1+(1λ)×Image2

Label = λ × Label 1 + ( 1 − λ ) × Label 2 \text{Label} = \lambda \times \text{Label}_1 + (1-\lambda) \times \text{Label}_2 Label=λ×Label1+(1λ)×Label2

其中, l a m b d a lambda lambda是一个从某个分布(通常是 beta 分布)中随机抽样的数值

  1. Cutout

Cutout 是另一种数据增强方法,通过随机选取图像上的一块区域,并将其像素值设置为0(或其他固定值)来工作。直观地,这种方法强迫模型学习到更多的上下文信息,而不仅仅是依赖于局部特征

  1. CutMix

CutMix是Mixup 和Cutout 的一个组合。它选取两张不同的图像,并从一张图像中裁剪一个随机区域,然后将其粘贴到另一张图像上

数学描述如下:

  1. 随机选择一个矩形区域R从图像A中
  2. 删除图像B在相同区域R的内容
  3. 将从A中裁剪的区域R粘贴到B中

标签也是一个加权组合:

Label = λ × Label A + ( 1 − λ ) × Label B \text{Label} = \lambda \times \text{Label}_A + (1-\lambda) \times \text{Label}_B Label=λ×LabelA+(1λ)×LabelB
其中, λ \lambda λ 是由区域 R在图像B中所占比例计算得出的

YOLOV6


lzoBhm.png

YOLOv6 原理和实现全解析 — MMYOLO 0.6.0 文档

【yolov6系列一】深度解析网络架构_所向披靡的张大刀的博客-CSDN博客

lzo0OY.png

lzo3iH.png

YOLOV7


YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集_AmbitionToFree的博客-CSDN博客

深入浅出 Yolo 系列之 Yolov7 基础网络结构详解_yolov7网络结构_计算机视觉linke的博客-CSDN博客

目标检测算法——YOLOV7——详解_TigerZ*的博客-CSDN博客

YoloV7:又快又准,Yolov4团队力作! - 知乎 (zhihu.com)

【万众瞩目的YOLOv7目标检测教学它来啦!】碾压市面所有目标检测器!深入原理、代码复现、实战教学…【YOLO算法|目标检测算法|YOLOv5】_哔哩哔哩_bilibili

YOLOv7论文,网络结构,官方源码,超详细解析_哔哩哔哩_bilibili

圖解 YOLOv7 - part1_哔哩哔哩_bilibili

强推!YOLOv7论文创新点,网络结构,官方源码,全详解,手把手带你逐行解读YOLOV7代码!_哔哩哔哩_bilibili

【YOLOV7,越学越爽!】这可能是最适合你学习的YOLOV7教程!含原理讲解+源码实战!-YOLOV7、目标检测、YOLO、源码讲解、计算机视觉、机器学习_哔哩哔哩_bilibili

lzoQXq.png

YOLOV8


pip install -e .  # 可以修改代码
conda init cmd.exe  # 激活cmd,使用激活环境

YOLOv8 原理和实现全解析 — MMYOLO 0.6.0 文档

【手把手带你实战YOLOv8-入门篇】YOLOv8 模型预测_哔哩哔哩_bilibili

超级强大的YOLOv8算法,计算机视觉领域必学的算法模型!比v1-v7性能更强!_哔哩哔哩_bilibili

lzoqTs.png

lzobSL.png

这篇关于解读YOLOv1-YOLOv8的原理与网络结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691429

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工