YOLO系列

1.YOLO概述

        目标检测算法通常分为两类,包括one stage和two stage它们两者的区别在于two stage算法需要先生成一个有可能包含待检物体的预选框,然后再在这些预选框进行分类和回归;而one stage算法会直接在网络中提取特征来预测物体分类和位置。

        以往的物体检测方法R-CNN、Fast R-CNN 等通常将检测问题转变为分类问题,而YOLO将检测变为一个回归问题,并且它的训练和检测均是在一个单独网络中进行,输入一张图像,经过网络直接输出预测框和类别,可以直接进行端到端的优化。而R-CNN、Fast R-CNN 等就是one stage算法,YOLO是two stage算法。

2.YOLOv1

[1506.02640] You Only Look Once: Unified, Real-Time Object Detection (arxiv.org)

YOLO系列_第1张图片

2.1 训练阶段

         对于目标检测来说,我们需要人工对图片中的目标使用矩形框进行标注并指明类别,得到训练集。

1.如何得到矩形框

                                        YOLO系列_第2张图片

YOLO系列_第3张图片
        输入图像划分成S × S个网格,每个网格会给出B个边界框(bouding box)。如果目标的中心点落入了某个网格中,则由这个网格来负责预测这个目标。训练时只选择与ground truth(真实框)的IOU最大的那个边界框来负责预测该目标,

        其中每个边界框包含5个预测值:x,y,w,h,confidence,(x,y)代表预测边界框的中心点坐标,w,h是边界框的宽度和高度,confidence是预测边界框和真实边界框的IOU。

        confidence反映了网络模型对该边界框是否含有目标的信心,以及边界框位置预测的准确度。定义为如下公式

                

        其中 Pr(Object)代表若网格中存在目标为1,不存在为0。如果网格中不包含目标则Pr(Object) = 0因此confidence也为0,包含物体Pr(Object) = 1那么confidence就等于预测边界框和真实边界框的IOU(交并比)。IOU越大代表预测框和真实框。

                                YOLO系列_第4张图片

        对于每一个需要目标检测的类别都有一个概率,每个网格预测C个条件类别概率, Pr(Class i |Object)是一个bounding box在含有物体的条件下属于某个类别的概率,每个网格只预测一组条件类别概率,B个边界框共用这个概率。

        这些信息包含在一个含S×S×(B×5+C)的张量中,C为类别个数。YOLOv1在PASCAL VOC数据集上进行评估,于是设置S=7,B=2,C=20。YOLO通过卷积神经网络得到这个张量。

2.网络结构

 YOLO系列_第5张图片        输入448×448×3的图像。经过24层卷积层,同样和ResNet的bottleneck一样,使用1×1卷积降维和升维。经过两个全连接层输出1470,然后Reshape得到7×7×30的特征图。每个网格包含30个信息。

YOLO系列_第6张图片

  • 除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU 
  • 使用了 Dropout  

3.损失函数

        损失函数由多个部分组成,都是均方误差的形式,所以YOLO将目标检测问题变成了回归问题

YOLO系列_第7张图片

YOLO系列_第8张图片

YOLO系列_第9张图片

         λnoobj = 0.5即调低不存在目标对象的bounding box的置信度误差的权重,让有目标对象的bouding box的置信度损失占比更大

        此外,x,y,w,h还需要进行归一化

YOLO系列_第10张图片

        经过上述公式得到的normalization的(x, y, w, h),再加之前提到的confidence,才共同组成了一个真正在网络中用于回归的bounding box;而当网络在Test阶段(x, y, w, h)经过反向解码又可得到目标在图像坐标系的框。 

2.2 预测阶段

        输入图片进入网络后,7×7×30的特征图。包含98个boudingbox的位置信息和每个网格条件类概率(包含物体的条件下是某个类别的概率)

物体的概率即置信度和条件类概率(包含物体的条件下是某个类别的概率)相乘就可以得到该边界框20个类别的得分值。

              

        可以得到下面这个图,每个网格2个边界框,每个边界框有20个类的得分值。然后我们需要剔除得分值低的,剔除重复框

   YOLO系列_第11张图片    YOLO系列_第12张图片

        1.接下来对于每一个类别,设置一个阈值,过滤掉得分值太低的,直接置0。然后按照从大到小排序。

YOLO系列_第13张图片

         2.然后需要经过NMS非极大值抑制。例如下面最高为0.5,将每一个除了之外的都与最高的进行比较,设置一个阈值,如果他们IOU超过这个阈值,就认为重复识别了一个目标,那么就将低得分值的过滤掉置0

YOLO系列_第14张图片

YOLO系列_第15张图片

YOLO系列_第16张图片

YOLO系列_第17张图片

        3.接着不断重复这个步骤,到得分值次高的,bb20已经被置0了,直接到bb15

YOLO系列_第18张图片

        这里示例只是对于狗这个类别。对于每一个类别都进行如上操作1.2.3。最后将不为0的框都画出来,得到最后结果。

YOLO系列_第19张图片

2.3 优劣

优点:

1. 检测速度快,因为它是one-stage的,直接将检测视作回归问题;

2. YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。

3. YOLO可以学到物体的泛化特征。当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。

缺点:

1. 虽然每个格子可以预测B个bounding box,但是这B个bbox的预测输出只能是一个类的。这种空间约束限制了我们的模型可以预测附近目标的数量,即对成群的小目标预测有问题;

2. 多个不同类的目标中心落在同一个网格时,我们一个网格内的bbox输出类别唯一,检测出现问题;

3. 模型采用了多个下采样层,导致模型学到的特征并不精细,也会影响检测结果;

4. 相比于其他先进的目标检测系统,它的精度稍低;召回率低;

5. YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

YOLO系列_第20张图片

YOLO系列_第21张图片 3. YOLOv2

[1612.08242] YOLO9000: Better, Faster, Stronger (arxiv.org)

YOLO系列_第22张图片

        YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。YOLOv2的改进策略如图2所示,可以看出,大部分的改进方法都可以比较显著提升模型的mAP。下面详细介绍各个改进策略。

YOLO系列_第23张图片

1.Batch Normalization

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

2.High Resolution Classifier

     基于ImageNet分类模型基本采用大小为 224×224 的图片作为输入,分辨率相对较低,不利于检测模型。所以YOLOv1在采用 224×224 分类模型预训练后,将分辨率增加至 448×448 ,并使用这个高分辨率在检测数据集上finetune(微调)。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。

        所以YOLOv2增加了在ImageNet数据集上直接说使用 448×448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。

3.Convolutional With Anchor Boxes

        在YOLOv1中,输入图片会被划分为 7×7 网格,每个单元格预测2个边界框。而实际中由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。

        YOLO一代包含有全连接层,从而能直接预测Bounding Boxes的坐标值。 Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

        此外,YOLOv2不是采用 448×448 图片作为输入,而是采用 416×416 大小。因为YOLOv2模型下采样的总步长为 32 ,对于 416×416 大小的图片,最终得到的特征图大小为 13×13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。

YOLO系列_第24张图片

        YOLOv1两个bouding box共享一套类别概率,YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,

YOLO系列_第25张图片

        和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体是哪个边界框预测它,需要在训练中确定,即由那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。 

        使用Anchor Box会让精确度稍微下降,但用了它能让YOLO能预测出大于一千个框,同时recall大大提升达到88%,mAP达到69.2%。

4.Dimension Clusters

        在Faster R-CNN和SSD中,先验框的长和宽都是手动设定的,带有一定的主观性(下图15)。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误(下图SSE),因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标

                                                YOLO系列_第26张图片

YOLO系列_第27张图片

        上图为在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框,其相对于图片的大小如上右图所示。

5.Direct location prediction

预测的边界框的实际中心位置(x,y)根据下面公式来计算,

txty为预测的坐标偏移值;w_{p}h_{p}为先验框的宽高,x_{p}y_{p}为先验框的中心位置。

        但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当 tx=1 时边界框将向右偏移先验框的一个宽度大小,而当 tx=−1 时边界框将向左偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的偏移量。

        Yolov2中将边框的结果的中心点约束在当前的网格中而不会飞到别的网格,预测边界框中心点相对于对应cell左上角位置的相对偏移值,要先将网格大小归一化,即令一个网格的宽=1,高=1,并使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内。可以按如下公式计算出边界框实际位置和大小:

YOLO系列_第28张图片

        cx为当前网格对于图像左上角的偏移量,cy为当前网格对于图像左上角的偏移量,p_{w},p_{h}​是先验框的宽和高。

YOLO系列_第29张图片

        最终预测边框的蓝色中心点被约束在蓝色背景的网格内

        约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%。

预测框在原图的还原:

假设网络预测值为:

在这里插入图片描述

 anchor框为:

在这里插入图片描述

假设当前网格距离左上角的偏移量为cx=cy=1

 则目标在特征图中的位置:

在这里插入图片描述

 在原图像中的位置:

在这里插入图片描述

*32是因为经过了5次降采样

6.New Network: Darknet-19

        YOLOv2采用了一个新的特征提取网络Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。主要采用 3×3 卷积,采用 2×2 的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。Darknet-19最终采用global avgpooling做预测,并且在 3×3 卷积之间使用 1×1 卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

YOLO系列_第30张图片

 7.Fine-Grained Features

        YOLOv2的输入图片大小为 416×416 ,经过5次maxpooling之后得到 13×13 大小的特征图,并以此特征图采用卷积做预测。 13×13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。

        YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是 26×26 大小的特征图(最后一个maxpooling层的输入)。以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。于 26×26×512 的特征图,经passthrough层处理之后就变成了 13×13×2048 的新特征图,与后面的 13×13×1024 特征图连接在一起形成 13×13×3072 大小的特征图

YOLO系列_第31张图片

YOLO系列_第32张图片

        使用Fine-Grained Features之后YOLOv2的性能有1%的提升。

8.Multi-ScaleTraining

        作者希望YOLO v2能健壮的运行于不同尺寸的图片之上,所以把这一想法用于训练model中。
区别于之前的补全图片的尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小320*320,最大608*608,网络会自动改变尺寸,并继续训练的过程。
        这一策略让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高。

YOLO系列_第33张图片

        YOLO系列_第34张图片 

9.损失函数

YOLO系列_第35张图片

YOLOv2的训练

        YOLOv2的训练主要包括三个阶段。

        第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224×224 ,共训练160个epochs。

        然后第二阶段将网络的输入调整为 448×448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。

        第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。网络修改包括:移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3×3×2014卷积层,同时增加了一个passthrough层,最后使用 1×1 卷积层输出预测结果。

YOLO系列_第36张图片

YOLO系列_第37张图片

 YOLO9000

        在YOLO-V2的整个技术架构中中,还提出了一个联合训练分类和检测数据的机制,以大幅提升其支持的检测目标种类,该目标检测模型称为YOLO-9000。

       ImageNet这样的分类任务数据集往往拥有类别众多且图像数量庞大的标注数据,但是缺少目标的位置信息,而目标检测数据集提供精确的目标位置信息,但是图像数量相对分类任务数据集要少很多,目标类别也很少。YOLO-9000的联合训练机制旨在综合两种数据集的优势——使用目标检测数据集的数据去训练检测相关的能力,例如包围框的位置信息、以及每个包围框中是否包含特定目标及其属于各类目标的概率,而使用仅有类别标签的分类任务数据集来扩展可检测的目标种类。YOLO-9000在具体实现过程中,包括层级分类(hierarchical classification)模型构造与分类与检测模型联合训练两方面内容。

        YOLO9000效果其实并不好,这里不详细介绍。

YOLO系列_第38张图片

YOLO系列_第39张图片

 4.YOLOv3

[1804.02767] YOLOv3: An Incremental Improvement (arxiv.org)

YOLO系列_第40张图片

1.Backbone

        新的用于特征提取的骨干网络backbone为Darknet-53

                YOLO系列_第41张图片

        Backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的残差连接。虽然速度有所下降,但提高了准确率与运算速度,比同精度的ResNet还快很多

YOLO系列_第42张图片

2.整个网络结构

YOLO系列_第43张图片

上图三个蓝色方框内表示Yolov3的三个基本组件

  1. CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成。
  2. Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
  3. ResX:由一个CBLX个残差组件构成,是Yolov3中的大组件。每个Res模块前面的CBL都起到下采样的作用,整个网络会经过五次下采样,如果输入为416,那么特征图的尺寸依次为416->208->104->52->26->13

其他基础操作:

  1. Concat:张量拼接,会扩充两个张量的维度,例如26*26*256和26*26*512两个张量拼接,结果是26*26*768。
  2. add:张量相加,张量直接相加,不会扩充维度,例如104*104*128和104*104*128相加,结果还是104*104*128。

YOLO系列_第44张图片

网络结构解析:

  1. Yolov3中,只有卷积层,通过步长为2的卷积下采样。所以对于输入图片尺寸没有特别限制,只要是32的倍数即可
  2. Yolov3借鉴了金字塔特征图FPN思想,深层小尺寸特征图感受野大检测大尺寸物体,而浅层大尺寸特征图感受野小检测小尺寸物体。特征图的输出维度为N × N ( 3 × (4 + 1 + 80)), N × N 为输出特征图尺寸,一共3个Anchor框,每个框有4项信息\left ( x,y,w,h,c \right ),80为可以识别类别数。所以特征图的输出维度为( 3 × (4 + 1 + 80)) = 255 。

        3.Yolov3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下采样8倍。输入图像经过Darknet-53(无全连接层)再经过3*3卷积层、1*1卷积之后生成特征图一,特征图一经过1*1卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的操作产生特征图三。以416输入为例,三个特征图一共可以产生(13×13×3)+(26×26×3)+(52×52×3)= 10647个预测框,比起v1和v2大大提升了小目标和密集目标的检测性能

YOLO系列_第45张图片

        4.上采样层(upsample):作用是将小尺寸特征图通过插值等方法,生成大尺寸图像。上采样层不改变特征图的通道数。

3.正负样本与损失函数

  1. 预测框一共分为三种情况:正例(positive)、负例(negative)、忽略样例(ignore)。
  2. 正例:Yolov3的训练,不再按照ground truth中心点,严格分配指定cell,而是根据预测值寻找IOU最大的预测框作为正例。任取一个ground truth,与所有预测框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框,只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth,就在余下的检测框中,寻找IOU最大的检测框作为正例。正例产生置信度loss、检测框loss、类别loss,类别标签对应类别为1,其余为0;置信度标签为1。所以一个grid cell可以不止检测一个目标。
  3. 忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
  4. 负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0。

YOLO系列_第46张图片

4.训练与预测

YOLO系列_第47张图片

5.性能 

YOLO系列_第48张图片

YOLO系列_第49张图片

YOLO系列_第50张图片

       Yolov3精度与SSD相比略有小优,与Faster R-CNN相比略有逊色,几乎持平,比RetinaNet差。但是速度是SSD、RetinaNet、Faster R-CNN至少2倍以上。 

5.YOLOv4

[2004.10934] YOLOv4: Optimal Speed and Accuracy of Object Detection (arxiv.org)

        在 YOLO 系列的原作者 Joseph Redmon 宣布退出 CV 领域后,表明其不会再更新YOLO系列。但AlexeyAB 继承了 YOLO 系列的思想和理念,在 YOLOv3 的基础上不断进行改进发布了 YOLOv4,并得到了原作者 Joseph Redmon 的承认。

        YOLOv4 可以使用传统的单GPU 进行训练和测试,并能够获得实时的,高精度的检测结果。与当时其他最先进的目标检测器的比较的结果如图所示,YOLOv4 在与 EfficientDet 性能相当的情况下,推理速度比其快两倍。相比 YOLOv3 的 AP 和 FPS 分别提高了 10% 和 12%。 

        整体而言,YOLOv4几乎没有像前几代YOLO一样提出一些创新性的东西,而是大量列举了近几年以来关于目标检测的一些最新技术和成果,并对这些方法进行了大量的试验来从而达到更好的效果。

        YOLO系列_第51张图片

1. Bag of freebies

        只增加训练成本,但是能显著提高精度,并不影响推理速度

1.1 Mosaic数据增强

        将四张训练图通过随机缩放、随机裁减、随机排布的方式拼接成一张进行训练

进行Mosaic数据增强的优点

  • 丰富数据集: 随机使用4张图像,随机缩放后随机拼接,增加很多小目标,大大增加了数据多样性。
  • 增强模型鲁棒性: 混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
  • 加强批归一化(Batch Normalization)的效果: 当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
  • 有利于提升小目标检测性能: Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标,从而提升了模型的检测能力。
     

1.2 自对抗训练(Self-adversarial-training,SAT)

主要目标是通过改变输入图像,使得网络难以识别,从而迫使网络提高泛化性能

  • 第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象。
  • 第二阶段,对修改后的图像进行正常的目标检测

YOLO系列_第52张图片

1.3 DropBlock

        DropBlock是适用于卷积层的正则化方法,它作用的对象的特征图。在DropBlock中,特征在一个个block中,当应用DropBlock时,一个feature map中的连续区域会一起被drop掉。那么模型为了拟合数据网络就不得不往别出看以寻找新的证据。

        其中(a)是输入到卷积网络的原始图像,(b)和©中的绿色区域包括激活单元,这些激活单元在输入图像中包含语义信息。随机丢弃激活对删除语义信息无效,因为附近的激活包含紧密相关的信息。 相反,删除连续区域可以删除某些语义信息(例如,头或脚),从而强制其余单元学习用于分类输入图像的其它特征,这样就增加了模型的泛化能力。

1.4 类标签平滑(Label Smoothing)

        原因:对预测有100%的信心可能表明模型是在记忆数据,而不是在学习。如果训练样本中会出现少量的错误样本,而模型过于相信训练样本,在训练过程中调整参数极力去逼近样本,这就导致了这些错误样本的负面影响变大。

     具体做法:标签平滑调整预测的目标上限为一个较低的值,比如0.9。它将使用这个值而不是1.0来计算损失。这样就缓解了过度拟合。

YOLO系列_第53张图片

1.5 边界框损失函数CIOU

        YOLOV4用CIOU损失代替了YOLOv3的box位置损失,取代了预测框和真实框的中心点坐标以及宽高信息设定MSE损失函数,其他部分损失没改变

YOLO系列_第54张图片

        其中,ρ2(b,bgt)分别代表了预测框和真实框的中心点的欧式距离。c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离。

                                YOLO系列_第55张图片

1.6 cmBN 

  1. BN:对当前mini-batch进行归一化
  2. CBN: 对当前以及当前往前数3个mini-batch的结果进行归一化
  3. CmBN: CmBN 在整个批次中使用Cross min-batch Normalization 收集统计数据,而非在单独的mini-batch中收集统计数据

        我们知道,BN 是对当前 mini-batch 的数据进行归一化;CBN 是通过收集最近几次迭代iterations信息来更新当前迭代时刻的均值和方差;而 CmBN 是在整个 batch 中使用 Cross min-batch Normalization 进行归一化,而不是在单独的 mini-batch 中进行归一化,这只收集一个批次内mini-batches之间的数据

1.7 消除网格敏感性

YOLO系列_第56张图片

        如果ground ture的中心点落在了grid cell的左上角或者右下角,那么就需要YOLO系列_第57张图片的值接近于0或者1,对于Sigmoid函数来说就相当于预测值需要接近负无穷或者负无穷,这种很极端的值网络很难做到,于是引入了一个大于1的缩放系数scale_{xy}

                        YOLO系列_第58张图片

        通过引入这个系数,网络的预测值能够很容易达到0或者1,现在比较新的实现方法包括YOLOv5都将这个系数设置为2

                                        ​​​​​​​      

        下图为原Sigmoid函数和改进后的Sigmoid函数图像,并且偏移的范围由原来的( 0 , 1 )调整到了( − 0.5 , 1.5 ) 

YOLO系列_第59张图片

1.8 多个Anchor对应一个ground ture
        在YOLOv3中针对每一个GT都只分配了一个Anchor。但在YOLOv4中一个GT可以同时分配给多个Anchor,它们是直接使用Anchor模板与GT Boxes进行粗略匹配,然后在定位到对应cell的对应Anchor

    之前正样本匹配过程。流程大致如下图所示:比如说针对某个预测特征层采用如下三种Anchor模板AT 1、AT 2、AT 3

YOLO系列_第60张图片

  1. 将每个GT Boxes与每个Anchor模板进行匹配(这里直接将GT和Anchor模板左上角对齐,然后计算IoU)
  2. 如果GT与某个Anchor模板的IoU大于给定的阈值,则将GT分配给该Anchor模板,如图中的AT 2
  3. 将GT投影到对应预测特征层上,根据GT的中心点定位到对应cell
  4. 则该cell对应的AT2为正样本

        但在YOLOv4中关于匹配正样本的方法又有些许不同。通过缩放后网络预测中心点的偏移范围已经从原来的( 0 , 1 )调整到了( − 0.5 , 1.5 ),某个Cell左上角点距离GT中心在( − 0.5 , 1.5 )范围内都满足条件。所以对于同一个GT Boxes可以分配给更多的Anchor,即正样本的数量更多了。如下图所示:

YOLO系列_第61张图片

YOLO系列_第62张图片

1.8 使用余弦退火学习率

1.9 遗传算法寻找最优超参数

2. Bag-of-Specials

        通过稍许增加推理成本,来提高目标检测精度的方法

2.1 DIoU NMS

        在实际应用场景中,当两个不同物体挨得很近时,由于IOU值比较大,往往经过NMS处理后,只剩下一个检测框,这样导致漏检的错误情况发生。

        基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。 其公式如下:

                        

        得分最高的预测框M和其它框Bi的(IOU-DIOU)值比较小时,Bi的得分值Si仍然保持,否则,当(IOU-DIOU)大于NMS threshold值时,Si值就设成0了,即被过滤掉。

2.2 Soft NMS

        传统的非极大值抑制是将IOU超过阈值的候选框都删除掉,这种状态下如果遇到两个物体重叠出现,效果就大打折扣,Soft-NMS不直接剔除,而是降低置信度得分。

2.3 Mish激活函数

        作者发现用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时精度要高一些。Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数。

                YOLO系列_第63张图片

                                                        

2.4 SPP

        SPP 是空间金字塔池化网络,它采用并行最大池化的方式,将输入的特征图进行不同尺度的最大池化,再进行多尺度融合,这样可以提高感受野,分离出最显著的上下文特征,并且几乎没有降低网络运行速度。但更重要的作用是可以让任意大小的特征图都能够转换成固定大小的输出,那么,当 SPP 后面接入全连接层时,则可以输出固定大小的特征图给全连接层。

        通过使用 SPP 模块,比单纯的使用 k x k 的最大池化,能更有效的加强特征提取,从而显著的分离了最重要的上下文特征。

        具体步骤为将特征层分别通过一个池化核大小为5x59x913x13的最大池化层,通过padding不改变输出尺寸,然后在通道方向进行将三个新特征图和原输入特征图进行在通道方向concat拼接YOLO系列_第64张图片

2.5 PAN 

  PANPath Aggregation Network)结构其实就是在YOLOV3使用的FPN(从顶到底信息融合)基础上加上了从底到顶的信息融合

YOLO系列_第65张图片

        但YOLOv4PAN结构和原始PAN结构论文的融合方式又略有差异,如下图所示。图(a)是原始论文中的融合方式,即特征层之间融合时是直接通过相加的方式进行融合的,但在YOLOv4中是通过在通道方向Concat拼接的方式进行融合的,这和V3的FPN是一样的

        YOLO系列_第66张图片

2.6 SAM

        SAM 模块是注意力模块,YOLOv4 将 SAM 的 spatial-wise 注意力改为 point-wise 。并且在SAM中没有使用 pooling ,而是直接用一个卷积进行代替,再使用 sigmoid 进行激活,然后对应点相乘,所以说改进后的模型是 point-wise attention。        

        ​​​​​​​YOLO系列_第67张图片

2.7 CSPDarketNet53

        从结构上来看,CSP模块是将输入通道分成两部分进行操作,一部分进行常规操作后跟另一部分进行通道拼接

        ​​​​​​​        ​​​​​​​        ​​​​​​​        YOLO系列_第68张图片

  • 增强CNN学习能力
  • 移除计算瓶颈
  • 减少显存占用

        使用了CSP模块后的Backnode如下图

YOLO系列_第69张图片

2. 整个YOLOV4网络结构

YOLO系列_第70张图片

YOLO系列_第71张图片 6.YOLOv5

        YOLOv5项目的作者是Glenn Jocher,YOLOv5在V4发布不久后便出来了,但这个项目至今都没有发表过正式的论文,只能从代码进行分析,YOLOv5变化并不大,总体和V4差不多,V5更偏重于工程实践,更便于我们使用。此外YOLOv5是YOLO 家族中首次使用 PyTorch 而不是  Darknet 编写模型的本地版本,Darknet版本的YOLO配置更加复杂,不适合生产环境。

ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite (github.com)

YOLO系列_第72张图片

1.自适应锚框计算

         在前面的版本中Anchors的大小是预先给出的(根据COCO数据集得到),YOLOV5将使用K-means计算数据集Anchors嵌入代码中,通过参数设置即可调用,这样一来Anchors的大小​​​​​​​可以更加匹配自己的数据集

2.SiLu激活函数

        V5中使用的是SiLU激活函数

        ​​​​​​​        ​​​​​​​        ​​​​​​​        YOLO系列_第73张图片

                                                 SiLU(x)=x*Sigmoid(x) 

3.SPPF

        在SPP的基础上改进为SPPF,SPPF在输出相同的情况下速度更快

YOLO系列_第74张图片

YOLO系列_第75张图片

  • 等效于
  • 等效于

YOLO系列_第76张图片

4.CSP-PAN

       在YOLOv4中,Neck的PAN结构是没有引入CSP结构的,但在YOLOv5中作者在PAN结构中加入了CSP,详情见网络结构图

5.YOLOv5网络结构

       与之前不同的是在YOLOv5中给出了四种不同网络(n,s,m,l,x),变为多种可选配的网络,网络架构是一致的,深度和宽度逐渐增加,输入图像尺寸为640×640。此外还有输入图像尺寸为1280×1280的版本,后缀为s,当然结构上也有些差异,后者会下采样64倍,采用4个预测特征层,而前者只会下采样到32倍且采用3个预测特征层

YOLO系列_第77张图片

YOLO系列_第78张图片

        yolov5l完整网络结构如下。和YOLOv4对比,YOLOv5在Backbone部分没太大变化

YOLO系列_第79张图片

6.损失计算

YOLOv5的损失主要由三个部分组成,基本还是没变:

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

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

7.平衡不同尺度的损失

这里是指针对三个预测特征层(P3, P4, P5)上的obj损失采用不同的权重。在源码中,针对预测小目标的预测特征层(P3)采用的权重是4.0,针对预测中等目标的预测特征层(P4)采用的权重是1.0,针对预测大目标的预测特征层(P5)采用的权重是0.4,作者说这是针对COCO数据集设置的超参数。        ​​​​​​​                 

8.改进宽高计算

        在YOLOv5中除了调整预测Anchor相对Grid网格左上角(c_{x},c_{y})的计算之外,还调整了预测目标高宽的计算公式,之前是

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​

在YOLOv5调整为:
 

        作者的大致意思是,原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题

        下图是修改前y=e^{x},和修改后y=(2e^{x})^{2},(相对Anchor宽高的倍率因子)的变化曲线, 很明显调整后倍率因子被限制在( 0 , 4 ) 之间。

        ​​​​​​​        YOLO系列_第80张图片

9.正样本匹配

        主要的区别在于GT Box与Anchor模板的匹配方式。在YOLOv4中是直接将每个GT Box与对应的Anchor模板计算IoU,只要IoU大于设定的阈值就算匹配成功。但在YOLOv5中,作者先去计算每个GT Box与对应的Anchor模板的高宽比例,即:

        然后统计这些比例和它们倒数之间的最大值,这里可以理解成计算GT BoxAnchor分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小):

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        


YOLO系列_第81张图片         设置4是因为修改后计算宽高的式子最多是4倍Anchor宽高

7.YOLOv8

ultralytics/ultralytics: NEW - YOLOv8 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)

        YOLOv8和v5都是Ultralytics下的产品,v8是在v5的基础上吸收了YOLOX,v6,v7的一些优点改进的版本。对比v5精度提高不少,但推理速度也有所下降

YOLO系列_第82张图片

1.Anchor Free

        在之前版本中YOLOv2~v5(注意YOLOv1不包括在内)都是基于Anchor进行预测的。即先在原图上生成一堆密密麻麻的Anchor Boxes,然后网络基于这些Anchor去预测它们的类别、中心点偏移量以及宽高缩放因子得到网络预测输出的目标,最后通过NMS即可得到最终预测目标。那基于Anchor的网络存在哪些问题

  • 检测器的性能和Anchor的size以及aspect ratio相关,Anchor非常依赖超参数的设置
  • 一般Anchor的size和aspect ratio都是固定的,所以很难处理那些形状变化很大的目标(比如一本书横着放w远大于h,竖着放h远大于w,斜着放w可能等于h,很难设计出合适的Anchor)。而且迁移到其他任务中时,如果新的数据集目标和预训练数据集中的目标形状差异很大,一般需要重新设计Anchor。
  • 为了达到更高的召回率,一般需要在图片中生成非常密集的Anchor Boxes尽可能保证每个目标都会有Anchor Boxes和它相交,那么在训练时绝大部分的Anchor Boxes都会被分为负样本,这样会导致正负样本极度不均。
  • Anchor的引入使得网络在训练过程中更加的繁琐,因为匹配正负样本时需要计算每个Anchor Boxes和每个GT BBoxes之间的IoU。

        YOLOv8使用了Anchor Free,它的思想是跳出Anchor的限制,在预测特征图的每个位置上直接去预测该点分别距离目标左侧(l: left),上侧(t:top),右侧(r: right)以及下侧(b:bottom)的距离

2.解耦头(decoupled detection head)

        Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构

        之前版本的检测头将类别和box位置信息等一并输出,yolov5检测头如下

                                                

        v8使用的解耦头将分类和检测头分离

YOLO系列_第83张图片

3.样本匹配 

        动态分配策略则可以根据训练的进展和样本的特点动态调整权重。在训练初期,模型可能会很难区分正负样本,因此应该更加关注那些容易被错分的样本。随着训练的进行,模型逐渐变得更加强大,可以更好地区分样本,因此应该逐渐减小困难样本的权重,同时增加易分样本的权重。动态分配策略可以根据训练损失或者其他指标来进行调整,可以更好地适应不同的数据集和模型。
典型的动态分配策略如YOLOX的simOTA、TOOD的Task-Aligned Assigner和RTMDet的DynamicSoftlLabelAssigner等。

        YOLOv5采用的依然是静态分配策略,考虑到动态分配策略的优异性,Yolov8算法中直接引用了TOOD中的Task·Aligned Assigner正负样本分配策略。
        Task-Aligned Assigner,顾名思义就是对齐分配器,即在训练过程中动态调整正负样本的分配比例。根据分类与回归的分数,作为加权分数,选择正样本。公式如下:

其中
        s是标注类别对应的预测分值,u是预测框和GT Box的loU,两者相乘即可衡量对齐程度(Task-Alignment)。

        a和β是权重超参数。,可以同时控制分类得分和I0U的优化来实现Task-Alignment,从而引导网络动态关注高质量的anchor。当类别分值越高且loU越高时,t的值就越接近于1。
具体执行步骤如下:
1.基于分类得分和预测框与GT的loU,加权得到一个关联分类以及回归的对齐分数alignment metrics.
2.计算anchor的中心点是否在当前GT框内,只有在当前GT内的anchor才能作为正样本。
3.满足2的前提下,基于alignment metrics选取topK大的作为正样本,其余作为负样本进行训练。 

4.损失计算

  • 分类分支依然采用 BCE Loss
  • 回归分支 Distribution Focal Loss, 同时还使用了 CIoU Loss

        DFL(Distribution Focal Loss),其主要是将框的位置建模成一个 general distribution,能够让网络更快地聚焦于目标 y 附近的值,增大它们的概率;

YOLO系列_第84张图片

        DFL的含义是以交叉熵的形式去优化与标签y最接近的一左一右2个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。

5.C2f

        YOLOv8将C3模块改进为C2f,输入通道数都变成一半,减少了计算量和参数量,另一半在最后进行融合。C2f让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息

YOLO系列_第85张图片

6.网络结构

        对比v5总体架构改动过并不大

YOLO系列_第86张图片

你可能感兴趣的:(机器学习与深度学习,YOLO,深度学习,人工智能)