目标检测概述


什么是目标检测?


滑动窗口(Sliding Window)


滑动窗口的效率问题和改进
滑动窗口的效率问题:计算成本很大

  • 改进思路 1:使用启发式算法替换暴力遍历
    例如 R-CNN,Fast R-CNN 中使用 Selective Search 产生提议框 (区域提议
    依赖外部算法,系统实现复杂,难以联合优化性能
  • 改进思路 2:减少冗余计算,使用卷积网络实现密集预测目前普遍采用的方式

    改进思路:用卷积一次性计算所有特征,再取出对应位置的特征完成分类

    原图滑窗重叠区域重复计算卷积 ❌
    特征图滑窗重叠区域只计算一次卷积特征,与窗的个数无关 ✔

在特征图上进行密集预测


目标检测的基本范式

  • One Stage: YOLO系列
    输出检测框的左上角和右下角坐标 (x1,y1),(x2,y2)
    一个CNN网络回归预测即可
  • Two Stage: Faster-rcnn Mask-Rcnn系列
    与one-stage 相比,多了一步提取候选框(预选)。

目标检测技术的演进

基础知识和术语


框、边界框(Bounding Box)

框泛指图像上的矩形框,边界横平竖直
描述一个框需要 4 个像素值:
• 方式1:左上右下边界坐标 ,, ,
• 方式2:中心坐标和框的长宽 , , , ℎ
边界框通常指紧密包围感兴趣物体的框
检测任务要求为图中出现的每个物体预测一个边界框

以下这些概念都指某种框,用在不同的上下文中:

  1. 区域(Region):框的同义词
  2. 区域提议(Region Proposal,Proposal)
    指算法预测的可能包含物体的框,某种识别能力不强的算法的初步预测结果
  3. 感兴趣区域(Region of Interest,RoI)
    当我们谈论需要进一步检测这个框中是否有物体时,通常称框为感兴趣区域
  4. 锚框(Anchor Box,Anchor)
    图中预设的一系列基准框,类似滑窗,一些检测算法会基于锚框预测边界框

交并比 ( Intersection Over Union,IOU)
交并比(IoU)定义为两矩形框交集面积与并集面积之比,是矩形框重合程度的衡量指标


置信度(Confidence Score)
置信度(Confidence Score):模型认可自身预测结果的程度,通常需要为每个框预测一个置信度
大部分算法取分类模型预测物体属于特定类别的概率
部分算法让模型独立于分类单独预测一个置信度
我们倾向认可置信度高的预测结果


非极大值抑制(Non-Maximum Suppression,NMS)
滑窗类算法通常会在物体周围给出多个相近的检测框
这些框实际指向同一物体,只需要保留其中置信度最高的。

通过非极大值抑制(NMS)算法实现:


边界框回归 (Bounding Box Regression)
问题:滑窗(或其他方式产生的基准框)与物体精准边界通常有偏差。

处理方法:让模型在预测物体类别同时预测边界框相对于滑窗的偏移量。


边界框编码(Bbox Coding)
边界框的绝对偏移量在数值上通常较大,不利于神经网络训练,通常需要对偏移量进行编码,作为回归
模型的预测目标


感受野
是特征图上的点能看到原始图像多大区域

感受野越大,越能感受全局的物体。
堆叠两个 3 ∗ 3 33 3∗3的卷积层,感受野是 5 ∗ 5 55 5∗5。
堆叠三个 3 ∗ 3 33 3∗3的卷积层,感受野是 7 ∗ 7 77 7∗7。

为什么采用小卷积核的堆叠而不是直接采用一个大的卷积核来扩大感受野呢?


准确度和召回率

TP: 被正确(true)的判为正样本(positive)的数目 (原来是正样本)
FP: 被错误(false)的判为正样本(positive)的数目(原来是负样本)
FN: 被错误(true)的判为负样本(negative)的数目 (原来是正样本)
TN: 被正确(true)的判为负样本(negative)的数目 (原来是负样本)

Precision: 描述的是找对的概率
Recall: 描述的是找全的概率

一个比方:
假设在做一个多选题,一共6个选项分别是A~F,正确答案是ABCDE, 你选ABF。 答案中只有AB是对的,准确率是2/3。但还有CDE没有选,找全的比例是2/5.


AP 和mAP

一般来说,准确率和找回率不能同时兼顾,一个高另一个就相对变低。
改变阈值(IOU大于一定的阈值,就被判为正样本),可以得到不同的precision和recall, 然后做出presion – recall 的图(一般叫做PR图)

去上限求出与x轴围成的阴影的面积就是AP的值。如上图就是长方形A1,A2,A3,A4的面积之和。
对每个类别都计算出AP,求均值得到mAP


单阶段和双阶段算法

  • 单阶段算法
  • 双阶段算法

YOLOv1

论文:《You Only Look Once: Unified, Real-Time Object Detection》


概述

  • 经典的one-stage方法
  • You Only Look Once,检测速度很快
  • YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框) 的位置及其所属的类别。

处理流程

  • 输入数据 一张图片
  • 然后把图片分割成7*7的网格
  • 然后每个格子对应两个候选框(长宽是根据经验得到
  • 真实值与候选框得到IOU
  • 选择IOU大的那个候选框
  • 对选出来的候选框的长宽进行微调
  • 预测的框的中心点坐标(x,y),长宽w, h, 还有置信度(是物体的概率)

网络架构
主干网络(GoogleLeNet):输入图像resize到 448 ∗ 448 ∗ 3 4484483 448∗448∗3,经过多次卷积得到 7 ∗ 7 ∗ 1024 771024 7∗7∗1024的特征图。
检测头:然后全连接展开,第一个全连接得到4096个特征,第二个全连接得到1470个特征
再通过reshape 得到 7 ∗ 7 ∗ 30 7730 7∗7∗30。(每张图片的网格数是7*7的,每个格子对应30个特征值,其中30个特征值的前10个是两个候选框的值x,y,w,h,c,后面的20代表的是20个分类,即属于每个类别的概率)

x,y,w,h表示的是归一化后的值,是相对位置和大小



损失函数:


优缺点
(1)优点:

  1. YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像;YOLO的极速版本每秒可以处理150帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟,实时地处理视频。对于欠实时系统,在准确率保证的情况下,YOLO速度快于其他方法。
  2. YOLO 实时检测的平均精度是其他实时监测系统的两倍。
  3. 迁移能力强,能运用到其他的新的领域(比如艺术品目标检测)。

(2)局限:

  1. YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网格只预测了2个框,并且都只属于同一类。
  2. 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。(因为对于小的bounding boxes,small error影响更大)
    YOLO对不常见的角度的目标泛化性能偏弱。

YOLOv2

论文:《YOLO9000: Better, Faster, Stronger》


概述
YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000
文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。
YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。


改进细节

  • 引入 Batch Normalizatioin
    批量归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLOv2不再使用dropout),从而能够获得更好的收敛速度和收敛效果
    使用Batch Normalization对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对YOLOv2的每一个卷积层增加Batch Normalization,最终使得mAP提高了2%,同时还使model正则化。使用Batch Normalization可以从model中去掉Dropout,而不会产生过拟合。
  • 更大的分辨率
    用于图像分类的训练样本很多,而标注了边框的用于训练目标检测的样本相比而言就少了很多,因为标注边框的人工成本比较高。所以目标检测模型通常都先用图像分类样本训练卷积层,提取图像特征,但这引出另一个问题,就是图像分类样本的分辨率不是很高。所以YOLOv1使用ImageNet的图像分类样本采用 224 ∗ 224 224224 224∗224 作为输入,来训练CNN卷积层。然后在训练目标检测时,检测用的图像样本采用更高分辨率的 448 ∗ 448 448448 448∗448 像素图像作为输入,但这样不一致的输入分辨率肯定会对模型性能有一定影响。
    所以YOLOv2在采用 224 ∗ 224 224*224 224∗224 图像进行分类模型预训练后,再采用 448 ∗ 448 448*448 448∗448 高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448 ∗ 448 448448 448∗448 的分辨率。然后再使用 448 ∗ 448 448448 448∗448 的检测样本进行训练,缓解了分辨率突然切换造成的影响,最终通过使用高分辨率,mAP提升了4%。
  • 采用先验框
    YOLOv1包含有全连接层,从而能直接预测Bounding Boxes的坐标值。Faster R-CNN算法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值,YOLOv2作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
    借鉴Faster RCNN的做法,YOLOv2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
    之前YOLOv1并没有采用先验框,并且每个grid只预测两个bounding box,也就是整个图像只有98个bounding box。YOLOv2如果每个grid采用9个先验框,总共有13139=1521个先验框。所以最终YOLOv2去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。作者去掉了网络中一个Pooling层,这让卷积层的输出能有更高的分辨率,同时对网络结构进行收缩让其运行在 416 ∗ 416 416416 416∗416而不是 448 ∗ 448 448448 448∗448。
    由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLOv2的卷积层采用32这个值来下采样图片,所以通过选择 416 ∗ 416 416416 416∗416用作输入尺寸最终能输出一个 13 ∗ 13 1313 13∗13的Feature Map。使用Anchor Box会让精确度稍微下降,但用了它能让YOLOv2能预测出大于一千个框,同时recall达到88%,mAP达到69.2%。
  • Dimension clusters
    之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。YOLOv2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLOv2的做法是对训练集中标注的边框进行K-means聚类分析,以寻找尽可能匹配样本的边框尺寸。如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:

    其中,centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”,IOU越大,“距离”越近。YOLOv2给出的聚类分析结果如下图所示,通过分析实验结果(Figure 2),在model复杂性与high recall之间权衡之后,选择聚类分类数K=5。
  • Direct location prediction
    用Anchor Box的方法,会让model变得不稳定,尤其是在最开始几次迭代的时候。大多数不稳定因素产生自预测Box的(x,y)位置的时候。按照之前YOLOv1的方法,网络不会预测偏移量,而是根据YOLOv1中的网格单元的位置来直接预测坐标,这就让Ground Truth的值介于0到1之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation来对于网络预测结果进行限制,让结果介于0到1之间。 Yolov2网络在每一个网格单元中预测出5个Bounding Boxes,每个Bounding Boxes有五个坐标值tx,ty,tw,th,t0,他们的关系见下图。假设一个网格单元对于图片左上角的偏移量是cx,cy,Bounding Boxes Prior的宽度和高度是pw,ph,那么预测的结果见下图右面的公式:
  • Fine-Grained Features
    目标检测面临的一个问题是图像中的需要检测的目标会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLOv2中输入416416经过卷积网络下采样最后输出是1313),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。于是YOLOv2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是2626512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

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

网络结构

  • 主干网络采用的是DarkNet19,实际输入为 416 ∗ 416 416*416 416∗416
  • 没有FC层,5次降采样(MaxPool),19个卷积层
  • 使用Batch Normilazation来让训练更稳定,加速收敛,使model规范化。
  • 使用Global Average Pooling


训练策略

  • 分类的训练策略
    网络训练在 ImageNet 1000类分类数据集上训练了160epochs,使用随机梯度下降,初始学习率为0.1, polynomial rate decay with a power of 4, weight decay of 0.0005 and momentum of 0.9 。训练期间使用标准的数据扩大方法:随机裁剪、旋转、变换颜色(hue)、变换饱和度(saturation), 变换曝光度(exposure shifts)。在训练时,把整个网络在更大的448*448分辨率上Fine Turnning 10个 epoches,初始学习率设置为0.001,这种网络达到达到76.5%top-1精确度,93.3%top-5精确度。
  • 检测的训练策略
    网络去掉了最后一个卷积层,而加上了三个 3 ∗ 3 33 3∗3卷积层,每个卷积层有1024个Filters,每个卷积层紧接着一个 1 ∗ 1 11 1∗1卷积层。对于VOC数据,网络预测出每个网格单元预测五个Bounding Boxes,每个Bounding Boxes预测5个坐标和20类,所以一共125个Filters,增加了Passthough层来获取前面层的细粒度信息,网络训练了160epoches,初始学习率0.001,数据扩大方法相同,对COCO与VOC数据集的训练对策相同。

YOLOv3

论文:《YOLOv3: An Incremental Improvement》


简介
V3最大的改进就是网络结构,使其更适合小目标检测
特征做的更细致,融入多持续特征图信息来预测不同规格物体
先验框更丰富了,3种scale,每种3个规格,一共9种
softmax改进,预测多标签任务


改进之处:

  • 多尺度预测
    为了能够预测多尺度的目标,YOLOv3 选择了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors。
  • 特征金字塔网络(feature parymid network,FPN)

    如上图,物体检测算法可以分为三步:
    Backbone : 主干网络提起特征
    基于常用预训练的Backbone,生成抽象的语义特征,再进行特定任务微调。
    Backbone生成的特征,一般按stage划分,分别记作C1、C2、C3、C4、C5、C6、C7等,其中的数字与stage的编号相同,代表的是分辨率减半的次数,如C2代表stage2输出的特征图,分辨率为输入图片的1/4,C5代表,stage5输出的特征图,分辨率为输入图片的1/32。
    Neck : 颈部利用FPN进行特征融合
    FPN一般将上一步生成的不同分辨率特征作为输入,输出经过融合后的特征。输出的特征一般以P作为编号标记。如FPN的输入是 C3、C4、C5、C6,经过融合后,输出为P3、P4、P5、P6。
    Head检测头利用融合的特征对物体进行检测。
    FPN输出融合后的特征后,就可以输入到检测头做具体的物体检测。

如下,左图是制作图像金字塔,分别对于不同大小的图片进行预测。但速度较慢。
右图是通过上采样,不同大小的特征图进行融合。

借鉴特征金字塔网的思想,YOLOv3设计了3种不同尺度的网络输出Y1、Y2、Y3,目的是预测不同尺度的目标。由于在每一个尺度网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是: N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N ×N ×[3∗(4 + 1 + 80)] N×N×[3∗(4+1+80)]。由下采样次数不同,得到的N不同,最终Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。可见参见原文:

  • 残差连接
    思想: 只用好的,不好的舍弃,不比原来差。

  • 先验框的设计
    也是通过聚类得到9个先验框。
    大的先验框交给1313, 中等交给2626,小的交给52*52。

  • 多标签分类
    YOLOv3在类别预测方面将YOLOv2的单标签分类改进为多标签分类,在网络结构中将YOLOv2中用于分类的softmax层修改为逻辑分类器。在YOLOv2中,算法认定一个目标只从属于一个类别,根据网络输出类别的得分最大值,将其归为某一类。然而在一些复杂的场景中,单一目标可能从属于多个类别

比如在一个交通场景中,某目标的种类既属于汽车也属于卡车,如果用softmax进行分类,softmax会假设这个目标只属于一个类别,这个目标只会被认定为汽车或卡车,这种分类方法就称为单标签分类。如果网络输出认定这个目标既是汽车也是卡车,这就被称为多标签分类。

为实现多标签分类就需要用逻辑分类器来对每个类别都进行二分类。逻辑分类器主要用到了sigmoid函数,它可以把输出约束在0到1,如果某一特征图的输出经过该函数处理后的值大于设定阈值,那么就认定该目标框所对应的目标属于该类。

  • 损失函数
    YOLOv3的损失函数表达式:

    对比YOLOv1中的损失函数很容易知道:位置损失部分并没有改变,仍然采用的是sum-square error的损失计算方法。但是置信度损失和类别预测均由原来的sum-square error改为了交叉熵的损失计算方法。对于类别以及置信度的预测,使用交叉熵的效果应该更好

网络结构
借助残差网络的思想,YOLOv3 将原来的 darknet-19 改进为darknet-53

Darknet-53主要由1×1和3×3的卷积层组成,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU,加入这两个部分的目的是为了防止过拟合。卷积层、批量归一化层以及Leaky ReLU共同组成Darknet-53中的基本卷积单元DBL。因为在Darknet-53中共包含53个这样的DBL,所以称其为Darknet-53。

为了更加清晰地了解darknet-53的网络结构,可以看下面这张图:

图上的组合单元的注释如下:
DBL: 一个卷积层、一个批量归一化层和一个Leaky ReLU组成的基本卷积单元。
res unit: 输入通过两个DBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
resn: 其中的n表示n个res unit;所以 resn = Zero Padding + DBL + n × res unit 。
concat: 将darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩充张量的维度,而add直接相加不会导致张量维度的改变。
Y1、Y2、Y3: 分别表示YOLOv3三种尺度的输出。

Darknet53的主要改进

  • 没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
  • 去掉了全连接层
  • 为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。
  • 引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
  • 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。
  • 网格大小有三种
    V1 中网格是 7 ∗ 7 77 7∗7
    V2中网格是 13 ∗ 13 13
    13 13∗13
    V3中网格是 13 ∗ 13 1313 13∗13、 26 ∗ 26 2626 26∗26、 52 ∗ 52 52*52 52∗52

YOLOv4


简介

YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。

YOLOv4的独到之处在于:

  • 是一个高效而强大的目标检测网咯。它使我们每个人都可以使用 GTX 1080Ti 或 2080Ti 的GPU来训练一个超快速和精确的目标检测器。
  • 在论文中,验证了大量先进的技巧对目标检测性能的影响
  • 对当前先进的目标检测方法进行了改进,使之更有效,并且更适合在单GPU上训练;这些改进包括CBN、PAN、SAM等。

改进方法

  • Mosaic 数据增强
    这是作者提出的一种新的数据增强方法,该方法借鉴了CutMix数据增强方式的思想。CutMix数据增强方式利用两张图片进行拼接,但是Mosaic使利用四张图片进行拼接。如下图所示:

    Mosaic数据增强方法有一个优点:拥有丰富检测目标的背景,并且在BN计算的时候一次性会处理四张图片。
  • SAT
    SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。
  • CmBN
    CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:
  • 修改过的SAM
    作者在原SAM(Spatial Attention Module)方法上进行了修改,将SAM从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的feature map,得到两组shape相同的feature map,再将结果输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。

    在YOLOv4中,对原来的SAM方法进行了修改。如下图所示,修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力。作者认为,采用这种方式创建的是点注意力。
  • 修改过的PAN
    作者对原PAN(Path Aggregation Network)方法进行了修改, 使用**张量连接(concat)**代替了原来的快捷连接(shortcut connection)。如下图所示:

Tricks
作者将所有的Tricks可以分为两类:
在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法,作着称之为 “免费包”(Bag of freebies)
只增加少量推理成本但能显著提高目标检测精度的插件模块和后处理方法,称之为特价包(Bag of specials)
下面分别对这两类技巧进行介绍。

  • 免费包
    • 数据增强方法
      随机缩放
      翻转、旋转
      图像扰动、加噪声、遮挡
      改变亮度、对比对、饱和度、色调
      随机裁剪(random crop)
      随机擦除(random erase)
      Cutout
      MixUp
      CutMix
    • 正则化方法有:
      DropOut
      DropConnect
      DropBlock
    • 回归损失
      IOU 会存在梯度消失的问题

      GIOU 引入闭包面积

      DIOU引入中心点距离

      CIOU引入长宽比
  • 特价包
    • 增大感受野技巧:
      SPP
      ASPP
      RFB
    • 注意力机制:
      Squeeze-and-Excitation (SE)
      Spatial Attention Module (SAM)
    • 特征融合集成:
      FPN
      SFAM
      ASFF
      BiFPN (出自于大名鼎鼎的EfficientDet)
    • 更好的激活函数:
      ReLU
      LReLU
      PReLU
      ReLU6
      SELU
      Swish
      hard-Swish
    • 后处理非极大值抑制算法:
      soft-NMS
      DIoU NMS

网络结构
YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)

(1)CSPDarknet53

CSPNet来源于这篇论文:《CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING
CAPABILITY OF CNN》
CSPNet全称是Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用来解决以往网络结构需要大量推理计算的问题。作者将问题归结于网络优化中的重复梯度信息。CSPNet在ImageNet dataset和MS COCO数据集上有很好的测试效果,同时它易于实现,在ResNet、ResNeXt和DenseNet网络结构上都能通用。

CSPNet的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。
每一个block按照特征图的channel维度拆分成两部分 一份正常走网络,另一份直接concat到这个block的输出

而在YOLOv4中,将原来的Darknet53结构换为了CSPDarknet53,这在原来的基础上主要进行了两项改变:

  • 将原来的Darknet53与CSPNet进行结合。在前面的YOLOv3中,我们已经了解了Darknet53的结构,它是由一系列残差结构组成。进行结合后,CSPnet的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。
  • 使用MIsh激活函数代替了原来的Leaky ReLU。在YOLOv3中,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU。而在YOLOv4的主干网络CSPDarknet53中,使用Mish代替了原来的Leaky ReLU。Leaky ReLU和Mish激活函数的公式与图像如下:

(2)SPP
SPP来源于这篇论文:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

SPP结构又被称为空间金字塔池化能将任意大小的特征图转换成固定大小的特征向量
SPP主要解决两个问题:
1)有效避免了对图像区域裁剪、缩放操作导致的图像失真等问题;
2)解决了卷积神经网络对图相关重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。

输入层:首先我们现在有一张任意大小的图片,其大小为w * h
输出层:21个神经元 ,即我们待会希望提取到21个特征。
分析如下图所示:分别对1 * 1分块,2 * 2分块和4 * 4子图里分别取每一个框内的max值(即取蓝框框内的最大值),这一步就是作最大池化,这样最后提取出来的特征值(即取出来的最大值)一共有1 * 1 + 2 * 2 + 4 * 4 = 21个。得出的特征再concat在一起。

在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。
在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化对上层输出的feature map进行处理。最大池化的池化核大小分别为13×13、9×9、5×5、1×1,其中1×1就相当于不处理。
(3)PANet
PANet源自论文:《Path Aggregation Network for Instance Segmentation》

下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。

  • FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
  • Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
  • Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
  • Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。

在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。

(4) Yolov3 Head
在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。YOLOv3的完整结构在上文已经详细介绍,下面我们截取了YOLOv3的Head进行分析:

YOLOv4学习了YOLOv3的方式,采用三个不同层级的特征图进行融合,并且继承了YOLOv3的Head。从上图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值, 所以有:3 x(80+5)=255 。

YOLOv5

yolov5源码-github


简介
YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:

  • 输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;
  • 基准网络:融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构;
  • Neck网络:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov5中添加了FPN+PAN结构;
  • Head输出层:输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms。

网络架构

上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck网络与Head输出端,对应于上图中的4个红色模块。YOLOv5算法具有4个版本,具体包括:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四种,本文重点讲解YOLOv5s,其它的版本都在该版本的基础上对网络进行加深与加宽。

  • 输入端-输入端表示输入的图片。该网络的输入图像大小为 608 ∗ 608 608*608 608∗608,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度;并提出了一种自适应锚框计算与自适应图片缩放方法。
  • Neck网络-Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP模块、FPN+PAN模块,但是实现的细节有些不同
  • Head输出端-Head用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv5利用GIOU_Loss来代替Smooth L1 Loss函数,从而进一步提升算法的检测精度。

YOLOv5的基础组件

  • CBL-CBL模块由Conv+BN+Leaky_relu激活函数组成,如上图中的模块1所示。
  • Res unit 借鉴ResNet网络中的残差结构,用来构建深层网络,CBM是残差模块中的子模块,如上图中的模块2所示。
  • CSP1_X借鉴CSPNet网络结构,该模块由CBL模块、Res unint模块以及卷积层、Concate组成而成,如上图中的模块3所示。
  • CSP2_X借鉴CSPNet网络结构,该模块由卷积层和X个Res unint模块Concate组成而成,如上图中的模块4所示。
  • Focus如上图中的模块5所示,Focus结构首先将多个slice结果Concat起来,然后将其送入CBL模块中。
    SPP-采用1×1、5×5、9×9和13×13的最大池化方式,进行多尺度特征融合,如上图中的模块6所示。

输入端细节详解

  • Mosaic数据增强 YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法,该算法是在CutMix数据增强方法的基础上改进而来的。CutMix仅仅利用了两张图片进行拼接,而Mosaic数据增强方法则采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成,具体的效果如下图所示。这种增强方法可以将几张图片组合成一张,这样不仅可以丰富数据集的同时极大的提升网络的训练速度,而且可以降低模型的内存需求。
  • 自适应锚框计算-在YOLOv5系列算法中,针对不同的数据集,都需要设定特定长宽的锚点框。在网络训练阶段,模型在初始锚点框的基础上输出对应的预测框,计算其与GT框之间的差距,并执行反向更新操作,从而更新整个网络的参数,因此设定初始锚点框也是比较关键的一环。在YOLOv3和YOLOv4检测算法中,训练不同的数据集时,都是通过单独的程序运行来获得初始锚点框。YOLOv5中将此功能嵌入到代码中,每次训练时,根据数据集的名称自适应的计算出最佳的锚点框,用户可以根据自己的需求将功能关闭或者打开,具体的指令为parser.add_argument(’–noautoanchor’, action=‘store_ true’, help=‘disable autoanchor check’),如果需要打开,只需要在训练代码时增加–noautoanch or选项即可。
  • 自适应图片缩放-针对不同的目标检测算法而言,我们通常需要执行图片缩放操作,即将原始的输入图片缩放到一个固定的尺寸,再将其送入检测网络中。YOLO系列算法中常用的尺寸包括416*416,608 *608等尺寸。原始的缩放方法存在着一些问题,由于在实际的使用中的很多图片的长宽比不同,因此缩放填充之后,两端的黑边大小都不相同,然而如果填充的过多,则会存在大量的信息冗余,从而影响整个算法的推理速度。为了进一步提升YOLOv5算法的推理速度,该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中
    为了应对输入图片尺寸 不一的问题,通常做法是将原图直接resize成统一大小,但是这样会造成目标变形,如下图所示:

    为了避免这种情况的发生,YOLOv5采用了灰度填充的方式统一输入尺寸,避免了目标变形的问题。灰度填充的核心思想就是将原图的长宽等比缩放对应统一尺寸,然后对于空白部分用灰色填充。如下图所示:

基准网络详解

  • Focus结构-该结构的主要思想是通过slice操作来对输入图片进行裁剪。如下图所示,原始输入图片大小为6086083,经过Slice与Concat操作之后输出一个30430412的特征映射;接着经过一个通道个数为32的Conv层(该通道个数仅仅针对的是YOLOv5s结构,其它结构会有相应的变化),输出一个30430432大小的特征映射。
  • CSP结构-YOLOv4网络结构中,借鉴了CSPNet的设计思路,仅仅在主干网络中设计了CSP结构。而YOLOv5中设计了两种CSP结构,以YOLOv5s网络为例,CSP1_X结构应用于Backbone主干网络中,另一种CSP2_X结构则应用于Neck网络中

Neck网络细节详解

FPN+PAN-YOLOv5的Neck网络仍然使用了FPN+PAN结构,但是在它的基础上做了一些改进操作,YOLOv4的Neck结构中,采用的都是普通的卷积操作。而YOLOv5的Neck网络中,采用借鉴CSPnet设计的CSP2结构,从而加强网络特征融合能力。下图展示了YOLOv4与YOLOv5的Neck网络的具体细节,通过比较我们可以发现:
(1)灰色区域表示第1个不同点,YOLOv5不仅利用CSP2_1结构代替部分CBL模块,而且去掉了下方的CBL模块;
(2)绿色区域表示第2个不同点,YOLOv5不仅将Concat操作之后的CBL模块更换为CSP2_1模块,而且更换了另外一个CBL模块的位置;
(3)蓝色区域表示第3个不同点,YOLOv5中将原始的CBL模块更换为CSP2_1模块。

YOLOx


简介
YOLOx是由旷视提出,主要有如下几个改进点:

  • Decoupled Head:以前版本的Yolo所用的解耦头是一起的,也就是分类和回归在一个1X1卷积里实现,YoloX认为这给网络的识别带来了不利影响。在YoloX中,Yolo Head被分为了两部分,分别实现,最后预测的时候才整合在一起。
  • Anchor Free:不使用先验框。
  • SimOTA :为不同大小的目标动态匹配正样本。

YOLOx的网络结构
在设计算法时,为了对比改进trick的好坏,常常需要选择基准的模型算法。在选择Yolox的基准模型时,作者考虑到:Yolov4和Yolov5系列,从基于锚框的算法角度来说,可能有一些过度优化 ,因此最终选择了Yolov3系列。
不过也并没有直接选择Yolov3系列中标准的Yolov3算法,而是选择添加了spp组件,性能更优的Yolov3_spp版本 。我们在前面知道,当得到Yolov3 baseline后,作者又添加了一系列的trick,最终改进为Yolox-Darknet53网络结构

为了便于分析改进点,我们对Yolox-Darknet53网络结构进行拆分,变为四个板块:
① 输入端 :Strong augmentation数据增强
② BackBone主干网络 :Darknet53。
③ Neck :Yolov3 baseline的Neck层还是FPN结构。
④ Prediction :Decoupled Head、End-to-End YOLO、Anchor-free、Multi positives。


解耦头(Decoupled Head)

  • 为什么采用解耦头?
    论文作者在实验中发现,不单单是精度上的提高,替换为Decoupled Head后,网络的收敛速度也加快了
    因此可以得到一个非常关键的结论:目前Yolo系列使用的检测头,表达能力可能有所欠缺,没有Decoupled Head的表达能力更好。
    但是需要注意的是:将检测头解耦,虽然可以加快模型的收敛速度,但同时会增加运算的复杂度。
    因此作者经过速度和性能上的权衡,最终使用 1个1×1 的卷积先进行降维,并在后面两个分支里,各使用了 2个3×3 卷积,最终调整到仅仅增加一点点的网络参数。
  • 解耦头的设计细节

    我们将Yolox-Darknet53中,Decoupled Head①提取出来,经过前面的Neck层,这里Decouple Head①输入的长宽为2020。
    从图上可以看出,Concat前总共有三个分支 :
    (1)cls_output:主要对目标框的类别,预测分数 。因为COCO数据集总共有80个类别,且主要是N个二分类判断,因此经过Sigmoid激活函数处理后,变为20
    2080大小。
    (2)obj_output:主要判断目标框是前景还是背景 ,因此经过Sigmoid处理好,变为20
    201大小。
    (3)reg_output:主要对目标框的坐标信息(x,y,w,h)进行预测 ,因此大小为20
    204。
    最后三个output,经过Concat融合到一起,得到20
    20*85的特征信息。
    当然,这只是Decoupled Head①的信息,再对Decoupled Head②和③进行处理。

Anchor-Free
Yolox 将 Anchor free 的方式引入到Yolo系列中,使用anchor free方法有如下好处:
(1) 降低了计算量,不涉及IoU计算,另外产生的预测框数量也更少。
假设 feature map的尺度为 80 × 80,anchor based 方法在Feature Map上,每个单元格一般设置三个不同尺寸大小的锚框,因此产生 3 × 80 × 80 = 19200 个预测框。而使用anchor free的方法,则仅产生 80 × 80 = 6400个预测框,降低了计算量。
(2) 缓解了正负样本不平衡问题
anchor free方法的预测框只有anchor based方法的1/3,而预测框中大部分是负样本,因此anchor free方法可以减少负样本数,进一步缓解了正负样本不平衡问题。
(3) 避免了anchor的调参
anchor based方法的anchor box的尺度是一个超参数,不同的超参设置会影响模型性能,anchor free方法避免了这一点。


损失计算


正负样本匹配策略SimOTA

YOLOv6


简介
YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。本框架同时专注于检测的精度和推理效率,在工业界常用的尺寸模型中:YOLOv6-nano 在 COCO 上精度可达 35.0% AP,在 T4 上推理速度可达 1242 FPS;YOLOv6-s 在 COCO 上精度可达 43.1% AP,在 T4 上推理速度可达 520 FPS。在部署方面,YOLOv6 支持 GPU(TensorRT)、CPU(OPENVINO)、ARM(MNN、TNN、NCNN)等不同平台的部署,极大地简化工程部署时的适配工作。

YOLOv6 主要在 Backbone、Neck、Head 以及训练策略等方面进行了诸多的改进:

  • 统一设计了更高效的 Backbone 和 Neck :受到硬件感知神经网络设计思想的启发,基于 RepVGG style设计了可重参数化、更高效的骨干网络 EfficientRep Backbone 和 Rep-PAN Neck
  • 优化设计了更简洁有效的 Efficient Decoupled Head,在维持精度的同时,进一步降低了一般解耦头带来的额外延时开销。
  • 在训练策略上,我们采用Anchor-free 无锚范式,同时辅以 SimOTA标签分配策略以及 SIoU边界框回归损失来进一步提高检测精度。

Hardware-friendly 骨干网络设计
YOLOv5/YOLOX 使用的 Backbone 和 Neck 都基于 CSPNet搭建,采用了多分支的方式和残差结构。对于 GPU 等硬件来说,这种结构会一定程度上增加延时,同时减小内存带宽利用率。下图为计算机体系结构领域中的 Roofline Model介绍图,显示了硬件中计算能力和内存带宽之间的关联关系

于是,我们基于硬件感知神经网络设计的思想,对 Backbone 和 Neck 进行了重新设计和优化。该思想基于硬件的特性、推理框架/编译框架的特点,以硬件和编译友好的结构作为设计原则,在网络构建时,综合考虑硬件计算能力、内存带宽、编译优化特性、网络表征能力等,进而获得又快又好的网络结构。对上述重新设计的两个检测部件,我们在 YOLOv6 中分别称为 EfficientRep BackboneRep-PAN Neck,其主要贡献点在于:

  • 引入了 RepVGG style 结构。基于硬件感知思想重新设计了 Backbone 和 Neck。
  • 基于硬件感知思想重新设计了 Backbone 和 Neck。

RepVGG Style 结构是一种在训练时具有多分支拓扑,而在实际部署时可以等效融合为单个 3×3 卷积的一种可重参数化的结构(融合过程如下图所示)。通过融合成的 3×3 卷积结构,可以有效利用计算密集型硬件计算能力(比如 GPU),同时也可获得 GPU/CPU 上已经高度优化的 NVIDIA cuDNN 和 Intel MKL 编译框架的帮助。

实验表明,通过上述策略,YOLOv6 减少了在硬件上的延时,并显著提升了算法的精度,让检测网络更快更强。以 nano 尺寸模型为例,对比 YOLOv5-nano 采用的网络结构,本方法在速度上提升了21%,同时精度提升 3.6% AP。

EfficientRep Backbone:在 Backbone 设计方面,我们基于以上 Rep 算子设计了一个高效的Backbone。相比于 YOLOv5 采用的 CSP-Backbone,该 Backbone 能够高效利用硬件(如 GPU)算力的同时,还具有较强的表征能力。
下图为 EfficientRep Backbone 具体设计结构图,我们将 Backbone 中 stride=2 的普通 Conv 层替换成了 stride=2 的 RepConv层。同时,将原始的 CSP-Block 都重新设计为 RepBlock,其中 RepBlock 的第一个 RepConv 会做 channel 维度的变换和对齐。另外,我们还将原始的 SPPF 优化设计为更加高效的 SimSPPF。

Rep-PAN:在 Neck 设计方面,为了让其在硬件上推理更加高效,以达到更好的精度与速度的平衡,我们基于硬件感知神经网络设计思想,为 YOLOv6 设计了一个更有效的特征融合网络结构。
Rep-PAN 基于 PAN拓扑方式,用 RepBlock 替换了 YOLOv5 中使用的 CSP-Block,同时对整体 Neck 中的算子进行了调整,目的是在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力(Rep-PAN 结构图如下图所示)。


解耦检测头(Decoupled Head)
在 YOLOv6 中,我们采用了解耦检测头(Decoupled Head)结构,并对其进行了精简设计。原始 YOLOv5 的检测头是通过分类和回归分支融合共享的方式来实现的,而 YOLOX 的检测头则是将分类和回归分支进行解耦,同时新增了两个额外的 3×3 的卷积层,虽然提升了检测精度,但一定程度上增加了网络延时。
因此,我们对解耦头进行了精简设计,同时综合考虑到相关算子表征能力和硬件上计算开销这两者的平衡,采用 Hybrid Channels 策略重新设计了一个更高效的解耦头结构,在维持精度的同时降低了延时,缓解了解耦头中 3×3 卷积带来的额外延时开销。通过在 nano 尺寸模型上进行消融实验,对比相同通道数的解耦头结构,精度提升 0.2% AP 的同时,速度提升6.8%。


训练策略
为了进一步提升检测精度,我们吸收借鉴了学术界和业界其他检测框架的先进研究进展:Anchor-free 无锚范式 、SimOTA 标签分配策略以及 SIoU 边界框回归损失。

  • Anchor-free 无锚范式
    YOLOv6 采用了更简洁的 Anchor-free 检测方法。由于 Anchor-based检测器需要在训练之前进行聚类分析以确定最佳 Anchor 集合,这会一定程度提高检测器的复杂度;同时,在一些边缘端的应用中,需要在硬件之间搬运大量检测结果的步骤,也会带来额外的延时。而 Anchor-free 无锚范式因其泛化能力强,解码逻辑更简单,在近几年中应用比较广泛。经过对 Anchor-free 的实验调研,我们发现,相较于Anchor-based 检测器的复杂度而带来的额外延时,Anchor-free 检测器在速度上有51%的提升。
  • SimOTA 标签分配策略
    为了获得更多高质量的正样本,YOLOv6 引入了 SimOTA算法动态分配正样本,进一步提高检测精度。YOLOv5 的标签分配策略是基于 Shape 匹配,并通过跨网格匹配策略增加正样本数量,从而使得网络快速收敛,但是该方法属于静态分配方法,并不会随着网络训练的过程而调整。
    近年来,也出现不少基于动态标签分配的方法,此类方法会根据训练过程中的网络输出来分配正样本,从而可以产生更多高质量的正样本,继而又促进网络的正向优化。例如,OTA通过将样本匹配建模成最佳传输问题,求得全局信息下的最佳样本匹配策略以提升精度,但 OTA 由于使用了Sinkhorn-Knopp 算法导致训练时间加长,而 SimOTA算法使用 Top-K 近似策略来得到样本最佳匹配,大大加快了训练速度。故 YOLOv6 采用了SimOTA 动态分配策略,并结合无锚范式,在 nano 尺寸模型上平均检测精度提升 1.3% AP。
  • SIoU 边界框回归损失
    为了进一步提升回归精度,YOLOv6 采用了 SIoU边界框回归损失函数来监督网络的学习。目标检测网络的训练一般需要至少定义两个损失函数:分类损失和边界框回归损失,而损失函数的定义往往对检测精度以及训练速度产生较大的影响。
    近年来,常用的边界框回归损失包括IoU、GIoU、CIoU、DIoU loss等等,这些损失函数通过考虑预测框与目标框之前的重叠程度、中心点距离、纵横比等因素来衡量两者之间的差距,从而指导网络最小化损失以提升回归精度,但是这些方法都没有考虑到预测框与目标框之间方向的匹配性。SIoU 损失函数通过引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,加快网络收敛,进一步提升了回归精度。通过在 YOLOv6s 上采用 SIoU loss 进行实验,对比 CIoU loss,平均检测精度提升 0.3% AP。

YOLOv7


简介
我们先整体来看下 YOLOV7,首先对输入的图片 resize 为 640×640 大小,输入到 backbone 网络中,然后经 head 层网络输出三层不同 size 大小的 feature map,经过 Rep 和 conv输出预测结果,这里以 coco 为例子,输出为 80 个类别,然后每个输出(x ,y, w, h, o) 即坐标位置和前后背景,3 是指的 anchor 数量,因此每一层的输出为 (80+5)x3 = 255再乘上 feature map 的大小就是最终的输出了。


主干网络
YOLOV7 的 backbone 如下图所示,总共有50层。

首先是经过 4 层卷积层,如下图,CBS 主要是 Conv + BN + SiLU 构成,我在图中用不同的颜色表示不同的 size 和 stride, 如 (3, 2) 表示卷积核大小为 3 ,步长为 2。 在 config 中的配置如图。

经过 4个 CBS 后,特征图变为 160 ∗ 160 ∗ 128 160 * 160 * 128 160∗160∗128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。

MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化。

backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80 * 80 * 512 , 40 * 40 * 1024, 20 * 20 * 1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为 4 + 8 + 13 * 3 = 51 层, 从 0 开始的话,最后一层就是第 50 层。


检测头

YOLOV7 head 其实就是一个 PaFPN 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 CSP 模块换成了 ELAN-H 模块, 同时下采样变为了 MP2 层
ELAN-H模块和 backbone 中的 ELAN 稍微有点区别就是 cat 的数量不同。


对于 pafpn 输出的 P3、P4 和 P5 , 经过 RepConv 调整通道数,最后使用 1×1 卷积去预测 objectness、class 和 bbox 三部分。

RepConv 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上


Loss Function

主要分带和不带辅助训练头两种,对应的训练脚本是train.py 和 train_aux.py。
不带辅助训练头(分损失函数和匹配策略两部分讨论)。
损失函数
整体和YOLOV5 保持一致,分为坐标损失、目标置信度损失(GT就是训练阶段的普通iou)和分类损失三部分。其中目标置信度损失和分类损失采用BCEWithLogitsLoss(带log的二值交叉熵损失),坐标损失采用CIoU损失。详细参见utils/loss.py 里面的 ComputeLossOTA 函数 配合 配置文件里的各部分的权重设置。

  • 匹配策略
    主要是参考了YOLOV5 和YOLOV6使用的当下比较火的simOTA.
    S1.训练前,会基于训练集中gt框,通过k-means聚类算法,先验获得9个从小到大排列的anchor框。(可选)
    S2.将每个gt与9个anchor匹配:Yolov5为分别计算它与9种anchor的宽与宽的比值(较大的宽除以较小的宽,比值大于1,下面的高同样操作)、高与高的比值,在宽比值、高比值这2个比值中,取最大的一个比值,若这个比值小于设定的比值阈值,这个anchor的预测框就被称为正样本。一个gt可能与几个anchor均能匹配上(此时最大9个)。所以一个gt可能在不同的网络层上做预测训练,大大增加了正样本的数量,当然也会出现gt与所有anchor都匹配不上的情况,这样gt就会被当成背景,不参与训练,说明anchor框尺寸设计的不好。
    S3.扩充正样本。根据gt框的中心位置,将最近的2个邻域网格也作为预测网格,也即一个groundtruth框可以由3个网格来预测;可以发现粗略估计正样本数相比前yolo系列,增加了三倍(此时最大27个匹配)。图下图浅黄色区域,其中实线是YOLO的真实网格,虚线是将一个网格四等分,如这个例子中,GT的中心在右下虚线网格,则扩充右和下真实网格也作为正样本。
    S4.获取与当前gt有top10最大iou的prediction结果。将这top10 (5-15之间均可,并不敏感)iou进行sum,就为当前gt的k。k最小取1。
    S5.根据损失函数计算每个GT和候选anchor损失(前期会加大分类损失权重,后面减低分类损失权重,如1:5->1:3),并保留损失最小的前K个。
    S6.去掉同一个anchor被分配到多个GT的情况。
  • 带辅助训练头(分损失函数和匹配策略两部分讨论)
    将负责最终输出的Head为lead Head,将用于辅助训练的Head称为auxiliary Head。

一些细节:其loss函数和不带辅助头相同,加权系数不能过大(aux head loss 和lead head loss 按照0.25:1的比例),否则会导致lead head出来的结果精度变低。匹配策略和上面的不带辅助头(只有lead head)只有很少不同,其中辅助头:
*lead head中每个网格与gt如果匹配上,附加周边两个网格,而aux head附加4个网格(如上面导数第二幅图,匹配到浅黄+橘黄共5个网格)。
*lead head中将top10个样本iou求和取整,而aux head中取top20。
aux head更关注于recall,而lead head从aux head中精准筛选出样本。
需要注意依照yolov5中的中心点回归方式,仅能将图中红色特征grid,预测在图中红色+蓝色区域(实线组成的网格代表着特征图grid,虚线代表着一个grid分成了4个象限),是根本无法将中心点预测到gt处(蓝色点)!而该红色特征grid在训练时是会作为正样本的。在aux head中,模型也并没有针对这种情况对回归方式作出更改。所以其实在aux head中,即使被分配为正样本的区域,经过不断的学习,可能仍然无法完全拟合至效果特别好。

YOLOv8

YOLOv8详解 【网络结构+代码+实操】

对比