文章目录
- 声明
- 一、R-CNN 系列
- 1. R-CNN
- 2. Fast R-CNN
- 3. Faster R-CNN
- 二、YOLO 系列
- 1. YOLOv1
- 1.1 核心思想
- 1.2 实现方法
- 1.3. 举例说明:
- 1.4 损失函数
- 2. YOLOv2
- 2.1 YOLOv2的改进点
- 2.1.1 Batch Normalization(批归一化)
- 2.1.2 High resolution classifier(高分辨率)
- 2.1.3 Convolution with anchor boxes (采用 anchor boxes )
- 2.1.4 Dimension clusters(聚类边界框)
- 2.1.5 Direct location prediction
- 2.1.6 Fine-Grained Features
- 2.1.7 Multi-ScaleTraining
- 2.2 YOLOv2 Faster
- 2.2.1 Draknet19
- 2.2.2 Training for classification
- 2.2.3 Training for detection
- 3. YOLOv3
- 3.1 网络结构
- 3.1.1 Backbone:darknet-53
- 3.1.2 output
- 3.1.3 Bounding Box
- 3.1.4 LOSS Function
- 4. YOLOv4
- 4.1 YOLOv4框架原理
- 4.1.1 CSPDarknet53
- 4.1.2 SPP结构
- 4.1.3 PAN结构
- 4.2 BackBone 训练策略
- 4.2.1 数据增强
- 4.2.2 DropBlock正则化
- 4.2.3 DropBlock正则化
- 4.3 BackBone 推理策略
- 5.3.1 Mish 激活函数
- 4.4 检测头训练策略
- 4.4.1 CIoU-loss
- 4.4.2 CmBN 策略
- 4.4.3 自对抗训练(SAT)
- 4.4.4 消除网格敏感度
- 4.4.5 余弦模拟退火
- 4.5 检测头推理策略
- 4.5.1 SAM模块
- 4.5.2 DIoU-NMS
- 5. YOLOv5
- 5.1 YOLOv5算法简介
- 5.2 YOLOv5算法详解
- 5.2.1 YOLOv5网络架构
- 5.2.2 YOLOv5基础组件
- 5.2.3 输入端细节详解
- 5.2.4 基准网络细节详解
- 5.2.5 Neck网络细节详解
- Reference
声明
本文均来自网站各大佬的文章总结,便于本人后期进一步学习与总结,若有侵权,本人立即删除,已将涉及内容置于最后 Reference 部分,在此对各位大佬表示深深的感谢!!!
一、R-CNN 系列
1. R-CNN
R-CNN目标检测算法流程主要分四个步骤:
- 采用SS(Selective Search)方法,使一张图片生成1000~2000个候选区域(region proposals)。
- 对每一个候选区域,都使用深度神经网络(AlexNet)提取特征,得到1*4096的特征向量。
- 将每一个特征向量送入每一类的SVM分类器,判断是否属于该类。
- 对已分类的推荐框进行线性回归,对这些框进行精细地调整,得到更加准确的边界框坐标。
R-CNN算法的检测效果很好,但是检测速度很慢,因此总体效率不高。其主要原因在于:
- 提取特征操作非常冗余。 检测时,需要将每个推荐区域都送入训练好的模型(AlexNet)进行前向传播,因此每张图片大约要进行1000~2000次前向传播。
- 训练速度慢,过程繁琐。 要单独分别训练三个不同的模型:CNN用来提取图像特征、SVM分类器用来预测类别、回归器精细修正建议框的位置。分开训练,耗时耗力。
- 使用Selective Search算法生成推荐区域,这个过程大约耗时2s,也是它不能达到实时性检测的一个重要原因。
2. Fast R-CNN
Fast R-CNN算法的流程主要分为下面三个步骤:
- 依然先使用SS(Selective Search)方法,使一张图片生成1000~2000个候选区域。
- 将图像输入到一个CNN(VGG-16)得到相应的特征图,然后将已经生成的候选框投影到特征图上获得相应的特征矩阵。
- 将每个特征矩阵通过ROI Pooling层缩放到7*7大小,然后将特征图展平,在通过一系列全连接层得到预测的类别信息和目标边界框信息。
Fast R-CNN的改进点:
- ROI Pooling层。 这个方法是针对 R-CNN 的第一个问题提出来的,用来解决提取特征操作冗余的问题,避免每个推荐区域都要送入 CNN 进行前向计算。核心思路是:将图像只输入 CNN 提取特征,只进行一次前向计算。得到的特征图由全部推荐区域共享。然后再将推荐区域(SS算法得到)投影到特征图上,获得每个推荐区域对应的特征图区域。最后使用 ROI Pooling 层将每个特征图区域下采样到7*7大小。
- 将原来三个模型整合到一个网络,易与训练。R-CNN算法使用三个不同的模型,需要分别训练,训练过程非常复杂。在Fast R-CNN中,直接将CNN、分类器、边界框回归器整合到一个网络,便于训练,极大地提高了训练的速度。
缺点: 不能实时,采用SS算法生成推荐区域的方法很耗时,处理每张图像大约需要消耗2秒,大大限制了目标检测的速度。
注:在R-CNN和Fast R-CNN中,一般采用的是Selective Search算法生成推荐区域,这个过程大概耗时2s左右,因此R-CNN和Fast R-CNN都还达不到实时的效果。
3. Faster R-CNN
区域推荐网络(RPN),该区域推荐网络与检测网络共享整张图的卷积特征,使得区域推荐基本不消耗任何计算时间,RPN是一个完全卷积网络,可以同时预测每个位置的目标边界和目标得分。RPN是一种全卷积网络可以专门针对生成推荐区域的检测任务进行端到端训练。
第一个是,用于生成推荐区域的深度全卷积网络(deep fully convolutional network)。第二个是,使用该推荐区域的Fast R-CNN检测器
Faster R-CNN算法流程主要有以下4个步骤:
- Conv layers。 首先将图像输入到 CNN(VGG-16)提取图像特征,得到的 feature maps 将被共享用于后面的 RPN 和 ROI Pooling。
- Region Proposal Networks。 RPN用于生成推荐区域。该网络通过 softmax 判断 anchors 属于 positive 还是 negative,再利用边界框回归修正 anchors 获得精确的推荐框 proposals。
- ROI Pooling。 该层以 feature maps 和 proposals 同时作为输入,综合这些信息后提取 proposal feature maps,送入后续全连接层判定目标类别。
- Classifer。 将 proposal feature maps 输入全连接层与预测 proposals 的类别;同时再次进行边界框回归,获得检测框最终的精确位置。
YOLO 统一为一个回归问题,而 Faster R-CNN 将检测结果分为两部分求解:物体类别(分类问题)、物体位置即 bounding box(回归问题)。
二、YOLO 系列
1. YOLOv1
1.1 核心思想
- YOLOv1 的核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box 的位置和 bounding box 所属的类别。
- Faster RCNN 中也直接用整张图作为输入,但是 Faster-RCNN 整体还是采用了 RCNN 那种 proposal+classifier 的思想,只不过是将提取 proposal 的步骤放在 CNN 中实现了,而 YOLOv1 则采用直接回归的思路。
1.2 实现方法
- 将一幅图像分成 SxS 个网格 (grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。
每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值。这个 confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准两重信息,其值是这样计算的:
该表达式含义:如果有 object 落在一个 grid cell 里,则第一项取 1,否则取 0。 第二项是预测的 bounding box 和实际的 groundtruth 之间的 IoU 值。
- 每个 bounding box 要预测 (x, y, w, h) 和 confidence 共5个值,每个网格还要预测一个类别信息,记为 C 类。则 SxS 个网格,每个网格要预测 B 个 bounding box还要预测 C 个 categories。输出就是 S x S x (5*B+C) 的一个 tensor。
注意:class 信息是针对每个网格的,confidence 信息是针对每个bounding box 的。
1.3. 举例说明:
- 在 PASCAL VOC 中,图像输入为 448x448 像素,取 S=7,B=2,一共有 20 个类别 (C=20)。则输出就是 7x7x(2x5+20) 的一个 tensor。整个网络结构如下图所示:
在 test 的时候,每个网格预测的 class 信息和 bounding box 预测的 confidence 信息相乘,就得到每个 bounding box 的 class-specific confidence score,得到每个 box 的 class-specific confidence score 以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行 NMS 处理,就得到最终的检测结果。
- 1.由于输出层为全连接层,因此在检测时,YOLOv1 模型的输入只支持与训练图像相同的输入分辨率。
- 2.虽然每个格子可以预测 B 个bounding box,但是最终只选择 IOU 最高的 bounding
box 作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。
总结:
- 给个一个输入图像,首先将图像划分成 7 * 7 的网格;
- 对于每个网格,我们都预测 2 个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率);
- 根据上一步可以预测出 7 * 7 * 2 个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。
1.4 损失函数
每个 grid 有 30 维,这 30 维中,8 维是回归 box 的坐标,2 维是 box 的 confidence,还有 20 维是类别。其中坐标的 x,y 用对应网格的 offset 归一化到 0-1 之间,w,h 用图像的 width 和 height 归一化到 0-1 之间。在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。简单粗暴的全部采用了 sum-squared error loss 来做这件事我们先看下带来的后果。
这种做法存在以下几个问题:
- 8 维的 localization error 和 20 维的 classification error 同等重要显然是不合理的;
- 如果一个网格中没有 object(一幅图中这种网格很多),那么就会将这些网格中的 box 的 confidence push 到 0,相比于较少的有 object 的网格,这种做法是 overpowering 的,这会导致网络不稳定甚至发散。
解决方法:
- 更重视 8 维的坐标预测,给这些损失前面赋予更大的 loss weight;
- 对没有 object 的 box 的 confidence loss,赋予小的 loss weight;
- 有 object 的 box 的 confidence loss 和有类别的 loss 的 loss weight 正常取1。
在 YOLOv1 的损失函数中:
- 只有当某个网格中有 object 的时候才对 classification error 进行惩罚。
- 只有当某个box predictor 对某个 ground truth box 负责的时候,才会对 box 的coordinate error 进行惩罚,而对哪个 ground truth box 负责就看其预测值和 ground truth box 的 IoU 是不是在那个 cell 的所有 box 中最大。
注:
- YOLOv1 方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLOv1 的检测效果并不理想。
- YOLOv1 采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。
- YOLOv1 的 loss 函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。
YOLO 的缺点:
- YOLO对相互靠的很近的物体和很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类;
- 同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱;
- 由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
2. YOLOv2
YOLOv2 相对 v1 版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger) 这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测 9000 种不同对象,称之为 YOLO9000。
文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。
YOLOv1 有很多缺点,作者希望改进的方向是:改善 recall,提升定位的准确度,同时保持分类的准确度。目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种 model 综合到一起,但是 YOLOv2 则着力于简化网络。
2.1 YOLOv2的改进点
2.1.1 Batch Normalization(批归一化)
2.1.2 High resolution classifier(高分辨率)
2.1.3 Convolution with anchor boxes (采用 anchor boxes )
YOLOv1 包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。Faster R-CNN 算法只用卷积层与 Region Proposal Network 来预测 Anchor Box 的偏移值与置信度,而不是直接预测坐标值,YOLOv2 作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。
借鉴 Faster RCNN 的做法,YOLOv2 也尝试采用先验框(anchor box)。在每个 grid 预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
之前 YOLOv1 并没有采用先验框,并且每个 grid 只预测两个 bounding box,也就是整个图像只有 98 个 bounding box。YOLOv2 如果每个 grid 采用 9 个先验框,总共有 13 * 13 * 9 = 1521 个先验框。所以最终 YOLOv2 去掉了全连接层,使用 Anchor Boxes 来预测 Bounding Boxes。作者去掉了网络中一个 Pooling 层,这让卷积层的输出能有更高的分辨率,同时对网络结构进行收缩让其运行在 416 * 416 而不是 448 * 448。
由于图片中的物体都倾向于出现在图片的中心位置,特别是那种比较大的物体,所以有一个单独位于物体中心的位置用于预测这些物体。YOLOv2 的卷积层采用 32 这个值来下采样图片,所以通过选择 416 * 41 6用作输入尺寸最终能输出一个 13 * 13 的 Feature Map。使用 Anchor Box 会让精确度稍微下降,但用了它能让 YOLOv2 能预测出大于一千个框,同时 recall 达到 88%,mAP 达到 69.2%。
2.1.4 Dimension clusters(聚类边界框)
之前 Anchor Box 的尺寸是手动选择的,所以尺寸还有优化的余地。YOLOv2 尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLOv2 的做法是对训练集中标注的边框进行 K-means 聚类分析,以寻找尽可能匹配样本的边框尺寸。如果我们用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,这依赖于 Box 的大小,所以距离度量的使用:
其中,centroid 是聚类时被选作中心的边框,box 就是其它边框,d 就是两者间的“距离”,IOU 越大,“距离”越近。
YOLOv2 给出的聚类分析结果如下图所示,通过分析实验结果(Figure 2),在 model复杂性 与 high recall 之间权衡之后,选择聚类分类数 K=5。
2.1.5 Direct location prediction
用 Anchor Box 的方法,会让 model 变得不稳定,尤其是在最开始几次迭代的时候。大多数不稳定因素产生自预测 Box 的 (x,y) 位置的时候。按照之前 YOLOv1 的方法,网络不会预测偏移量,而是根据 YOLOv1 中的网格单元的位置来直接预测坐标,这就让 Ground Truth 的值介于 0 到 1 之间。而为了让网络的结果能落在这一范围内,网络使用一个 Logistic Activation 来对于网络预测结果进行限制,让结果介于 0 到 1 之间。 网络在每一个网格单元中预测出 5 个 Bounding Boxes,每个 Bounding Boxes 有五个坐标值 tx,ty,tw,th,t0,它们的关系见下图。假设一个网格单元对于图片左上角的偏移量是 cx,cy,Bounding Boxes Prior 的宽度和高度是 pw,ph,那么预测的结果见下图右面的公式:
2.1.6 Fine-Grained Features
目标检测面临的一个问题是图像中的需要检测的目标会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如 YOLOv2 中输入 416 * 416 经过卷积网络下采样最后输出是13 * 13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。于是 YOLOv2 引入一种称为 passthrough 层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个 pooling 之前,特征图的大小是 26 * 26 * 512,将其 1 拆 4,直接传递(passthrough)到 pooling 后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
具体怎样将 1 个特征图拆成 4 个特征图,见下图,图中示例的是 1 个 4 * 4 拆成 4 个 2 * 2,因为深度不变,所以没有画出来。
2.1.7 Multi-ScaleTraining
2.2 YOLOv2 Faster
2.2.1 Draknet19
YOLOv2 基于一个新的分类 model,有点类似与 VGG。YOLOv2 使用 3 * 3 filter,每次 Pooling 之后都增加一倍 Channels 的数量。YOLOv2 使用 Global Average Pooling,使用 Batch Normilazation 来让训练更稳定,加速收敛,使 model 规范化。最终的 model–Darknet19,有 19 个卷积层和 5 个 maxpooling 层,处理一张图片只需要5.58 billion次运算,在 ImageNet 上达到 72.9%top-1 精确度,91.2%top-5 精确度。
2.2.2 Training for classification
2.2.3 Training for detection
3. YOLOv3
3.1 网络结构
- 这张图很好的总结了YOLOv3的结构,让我们对YOLO有更加直观的理解。
DBL: 代码中的 Darknetconv2d_BN_Leaky,是 YOLOv3 的基本组件,就是卷积 + BN + Leaky relu。
resn: n 代表数字,有 res1,res2, … ,res8 等等,表示这个 res_block 里含有多少个 res_unit。
concat: 张量拼接;将 darknet 中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层 add 的操作是不一样的,拼接会扩充张量的维度,而 add 只是直接相加不会导致张量维度的改变。
3.1.1 Backbone:darknet-53
为了达到更好的分类效果,作者自己设计训练了darknet-53,在 ImageNet 数据集上实验发现这个 darknet-53 的确很强,相对于 ResNet-152 和 ResNet-101,darknet-53 不仅在分类精度上差不多,计算速度还比 ResNet-152 和 ResNet-101 强多了,网络层数也比他们少,测试结果如图所示。
darknet-53 的网络结构如下图所示。YOLOv3 使用了 darknet-53 的前面的 52层(没有全连接层),YOLOv3 这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了 POOLing,用 conv 的 stride 来实现降采样。在这个网络结构中,使用的是步长为 2 的卷积来进行降采样。
为了加强算法对小目标检测的精确度,YOLOv3 中采用类似 FPN 的 upsample 和融合做法(最后融合了3个 scale,其他两个 scale 的大小分别是 26 × 26 和 52 × 52),在多个 scale 的 feature map上做检测。
作者在3条预测支路采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是 255,是针对 COCO 数据集的 80 类:3 * (80+4+1) = 255,3 表示一个 grid cell 包含 3 个 bounding box,4 表示框的 4 个坐标信息,1 表示 objectness score。
3.1.2 output
所谓的多尺度就是来自这 3 条预测之路,y1,y2 和 y3 的深度都是 255,边长的规律是13 : 26 : 52。YOLOv3 设定的是每个网格单元预测 3 个 box,所以每个 box 需要有(x, y, w, h, confidence)五个基本参数,然后还要有 80 个类别的概率。所以 3 × (5 + 80) = 255,这个 255 就是这么来的。
具体看看y1,y2,y3是如何而来的
作者通过上采样将深层特征提取,其维度是与将要融合的特征层维度相同的(channel不同)。如下图所示,85 层将 13 × 13 × 256 的特征上采样得到 26 × 26 × 256,再将其与 61 层的特征拼接起来得到 26 × 26 × 768。为了得到 channel255,还需要进行一系列的 3 × 3,1 × 1 卷积操作,这样既可以提高非线性程度增加泛化性能提高网络精度,又能减少参数提高实时性。52 × 52 × 255 的特征也是类似的过程。
3.1.3 Bounding Box
YOLOv3 的 Bounding Box 由 YOLOv2 又做出了更好的改进。 在 YOLOv2 和 YOLOv3 中,都采用了对图像中的 object 采用 k-means 聚类。feature map 中的每一个 cell 都会预测 3 个边界框(bounding box) ,每个 bounding box 都会预测三个东西:(1)每个框的位置(4个值,中心坐标 tx 和 ty,框的高度 bh 和宽度 bw),(2)一个 objectness prediction ,(3)N 个类别,coco 数据集 80 类,voc 20 类。
这里注意bounding box 与 anchor box 的区别:
Bounding box 它输出的是框的位置(中心坐标与宽高),confidence 以及 N 个类别。
anchor box 只是一个尺度即只有宽高。
3.1.4 LOSS Function
YOLOv3重要改变之一:No more softmaxing the classes。YOLOv3 现在对图像中检测到的对象执行多标签分类。
4. YOLOv4
YOLOv4 其实是一个结合了大量前人研究技术,加以组合并进行适当创新的算法,实现了速度和精度的完美平衡。可以说有许多技巧可以提高卷积神经网络 (CNN) 的准确性,但是某些技巧仅适合在某些模型上运行,或者仅在某些问题上运行,或者仅在小型数据集上运行;我们来码一码这篇文章里作者都用了哪些调优手段:加权残差连接 (WRC),跨阶段部分连接(CSP),跨小批量标准化(CmBN),自对抗训练(SAT),Mish 激活,马赛克数据增强,CmBN,DropBlock 正则化,CIoU Loss 等等。经过一系列的堆料,终于实现了目前最优的实验结果:43.5%的AP(在Tesla V100上,MS COCO数据集的实时速度约为 65 FPS)。
4.1 YOLOv4框架原理
4.1.1 CSPDarknet53
我们前面知道在 YOLOv3 中,特征提取网络使用的是 Darknet53,而在 YOLOv4 中,对 Darknet53 做了一点改进,借鉴了 CSPNet,CSPNet 全称是 Cross Stage Partial Networks,也就是跨阶段局部网络。CSPNet 解决了其他大型卷积神经网络框架 Backbone 中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和 FLOPS 数值,既保证了推理速度和准确率,又减小了模型尺寸。如下图:
考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
- 更大的网络输入分辨率——用于检测小目标
- 更深的网络层——能够覆盖更大面积的感受野
- 更多的参数——更好的检测同一图像内不同size的目标
这样最终的 CSPDarknet53 结构就如下图:
为了增大感受野,作者还使用了 SPP-block,使用 PANet 代替 FPN 进行参数聚合以适用于不同 level 的目标检测。
4.1.2 SPP结构
SPP-Net 结构我们之前也有学过,SPP-Net 全称 Spatial Pyramid Pooling Networks,当时主要是用来解决不同尺寸的特征图如何进入全连接层的,直接看下图,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。
4.1.3 PAN结构
YOLOv4 使用 PANet (Path Aggregation Network)代替 FPN 进行参数聚合以适用于不同 level 的目标检测, PANet 论文中融合的时候使用的方法是 Addition,YOLOv4 算法将融合的方法由加法改为 Concatenation。如下图:
4.2 BackBone 训练策略
这里我们主要从数据增强,DropBlock 正则化,类标签平滑方面来学习下 BackBone 训练策略。
4.2.1 数据增强
1、CutMix
YOLOv4 选择用 CutMix 的增强方式,CutMix 的处理方式也比较简单,同样也是对一对图片做操作,简单讲就是随机生成一个裁剪框 Box,裁剪掉 A 图的相应位置,然后用 B 图片相应位置的 ROI 放到 A 图中被裁剪的区域形成新的样本,ground truth 标签会根据 patch 的面积按比例进行调整,比如 0.6 像狗,0.4 像猫,计算损失时同样采用加权求和的方式进行求解。这里借 CutMix 的地方顺带说下几种类似的增强方式:
CutMix论文: https://arxiv.org/pdf/1905.04899v2.pdf
2、Mosaic
Yolov4 的 Mosaic 数据增强是参考 CutMix 数据增强,理论上类似。区别在于Mosaic 是一种将 4 张训练图像合并成一张进行训练的数据增强方法(而不是 CutMix 中的 2 张)。这增强了对正常背景 (context) 之外的对象的检测,丰富检测物体的背景。此外,每个小批包含一个大的变化图像(4倍),因此,减少了估计均值和方差的时需要大 mini-batch 的要求,降低了训练成本。如下图:
4.2.2 DropBlock正则化
DropBlock 方法的引入是为了克服 Dropout 随机丢弃特征的主要缺点,Dropout 被证明是全连接网络的有效策略,但在特征空间相关的卷积层中效果不佳。DropBlock 技术在称为块的相邻相关区域中丢弃特征。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。如下图:
DropBlock 论文中作者最终在 ImageNet 分类任务上,使用 Resnet-50 结构,将精度提升1.6%个点,在 COCO 检测任务上,精度提升1.6%个点。
4.2.3 DropBlock正则化
- 无法保证模型的泛化能力,容易造成过拟合;
- 全概率和 0 概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应。会造成模型过于相信预测的类别。
4.3 BackBone 推理策略
5.3.1 Mish 激活函数
对激活函数的研究一直没有停止过,ReLU 还是统治着深度学习的激活函数,不过,这种情况有可能会被 Mish 改变。Mish 是另一个与 ReLU 和 Swish 非常相似的激活函数。正如论文所宣称的那样,Mish 可以在不同数据集的许多深度网络中胜过它们。公式如下:
Mish 是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU 激活函数精度迅速下降,而 Mish 激活函数在训练稳定性、平均准确率(1%-2.8%)、峰值准确率(1.2% - 3.6%)等方面都有全面的提高。如下图:
4.3.2 MiWRC 策略
MiWRC 是 Multi-input weighted residual connections 的简称, 在 BiFPN 中,提出了用MiWRC 来执行标尺度级重加权,添加不同尺度的特征映射。我们已经讨论了 FPN 和 PAN 作为例子。下面的图(d)显示了另一种被称为 BiFPN 的 neck 设计,根据 BiFPN 的论文,该设计具有更好的准确性和效率权衡。
上图中 (a)FPN 引入自顶向下的路径,将多尺度特征从 3 级融合到 7 级 (P3-P7);(b)PANET 在 FPN 之上增加一个额外的自下而上的路径;©NAS-FPN 使用神经网络搜索找到一个不规则的特征拓扑网络,然后重复应用同一块拓扑结构;(d)是这里的BiFPN,具有更好的准确性和效率权衡。将该 neck 放到整个整个网络的连接中如下图:
4.4 检测头训练策略
4.4.1 CIoU-loss
经典IoU loss:
IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
可以看到 IOU 的 loss 其实很简单,主要是交集/并集,但其实也存在两个问题:
- 问题1: 即状态 1 的情况,当预测框和目标框不相交时,IOU = 0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss 无法优化两个框不相交的情况。
- 问题2: 即状态 2 和状态 3 的情况,当两个预测框大小相同,两个 IOU 也相同, IOU_Loss 无法区分两者相交情况的不同。
因此2019年出现了GIOU_Loss来进行改进。
GIoU:Generalized IoU
可以看到上图 GIOU_Loss 中,增加了相交尺度的衡量方式,缓解了单纯 IOU_Loss 时的尴尬。但为什么仅仅说缓解呢?因为还存在一种不足:
- 问题:状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的 GIOU 值也都是相同的,这时 GIOU 退化成了 IOU,无法区分相对位置关系。
基于这个问题,2020年的 AAAI 又提出了 DIOU_Loss。
3、DIoU:Distance IoU
好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。针对IOU 和 GIOU 存在的问题,作者从两个方面进行考虑
- 如何最小化预测框和目标框之间的归一化距离?
- 如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,提出了 DIOU_Loss(Distance_IOU_Loss)
DIOU_Loss 考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量 2 个框的距离,因此 DIOU_Loss 收敛的更快。但就像前面好的目标框回归函数所说的,没有考虑到长宽比。
- 比如上面三种情况,目标框包裹预测框,本来 DIOU_Loss 可以起作用。但预测框的中心点的位置都是一样的,因此按照 DIOU_Loss 的计算公式,三者的值都是相同的。
针对这个问题,又提出了CIOU_Loss,不得不说,科学总是在解决问题中,不断进步!!
4、CIOU_Loss
CIOU_Loss 和 DIOU_Loss 前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。
其中 v 是衡量长宽比一致性的参数,我们也可以定义为:
这样 CIOU_Loss 就将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了。
再来综合的看下各个 Loss 函数的不同点:
IOU_Loss: 主要考虑检测框和目标框重叠面积。
GIOU_Loss: 在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss: 在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss: 在DIOU的基础上,考虑边界框宽高比的尺度信息。
YOLOv4 中采用了 CIOU_Loss 的回归方式,使得预测框回归的速度和精度更高一些。
4.4.2 CmBN 策略
CmBN 是 CBN 的改进版本,其把大 batch 内部的 4 个 mini batch 当做一个整体,对外隔离。CBN 在第 t 时刻,也会考虑前 3 个时刻的统计量进行汇合,而 CmBN 操作不会,不再滑动 cross,其仅仅在 mini batch 内部进行汇合操作,保持 BN 一个 batch 更新一次可训练参数。
4.4.3 自对抗训练(SAT)
SAT 为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。
4.4.4 消除网格敏感度
对于 bx = cx 和 bx = cx + 1 的情况,我们需要分别具有很大的负值和正值。但我们可以将与一个比例因子(>1.0)相乘,从而更轻松地实现这一目标
4.4.5 余弦模拟退火
余弦调度会根据一个余弦函数来调整学习率。首先,较大的学习率会以较慢的速度减小。然后在中途时,学习的减小速度会变快,最后学习率的减小速度又会变得很慢。
这张图展示了学习率衰减的方式(下图中还应用了学习率预热)及其对mAP的影响。可能看起来并不明显,这种新的调度方法的进展更为稳定,而不是在停滞一段时间后又取得进展。
4.5 检测头推理策略
4.5.1 SAM模块
注意力机制在 DL 设计中被广泛采用。在 SAM 中,最大值池化和平均池化分别用于输入 feature map,创建两组 feature map。结果被输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将空间注意掩模应用于输入特征,输出精细的特征图。
在YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化。
在YOLOv4中,FPN概念逐渐被实现/替换为经过修改的SPP、PAN和PAN。
4.5.2 DIoU-NMS
NMS 过滤掉预测相同对象的其他边界框,并保留具有最高可信度的边界框。
DIoU (前面讨论过的) 被用作非最大值抑制(NMS)的一个因素。该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离。这使得它在有遮挡的情况下更加健壮。
5. YOLOv5
5.1 YOLOv5算法简介
- 输入端:在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;
- 基准网络:融合其它检测算法中的一些新思路,主要包括:Focus 结构与 CSP 结构;
- Neck 网络:目标检测网络在 BackBone 与最后的 Head 输出层之间往往会插入一些层,Yolov5 中添加了 FPN+PAN 结构;
- Head 输出层:输出层的锚框机制与 YOLOv4 相同,主要改进的是训练时的损失函数 GIOU_Loss,以及预测框筛选的 DIOU_nms。
5.2 YOLOv5算法详解
5.2.1 YOLOv5网络架构
- 输入端-输入端表示输入的图片。该网络的输入图像大小为608*608,该阶段通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度;并提出了一种自适应锚框计算与自适应图片缩放方法。
- 基准网络-基准网络通常是一些性能优异的分类器种的网络,该模块用来提取一些通用的特征表示。YOLOv5中不仅使用了CSPDarknet53结构,而且使用了Focus结构作为基准网络。
- Neck网络-Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP模块、FPN+PAN模块,但是实现的细节有些不同。
- Head输出端-Head用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv4利用GIOU_Loss来代替Smooth L1 Loss函数,从而进一步提升算法的检测精度。
5.2.2 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所示。
5.2.3 输入端细节详解
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算法的推理速度,该算法提出一种方法能够自适应的添加最少的黑边到缩放之后的图片中。
5.2.4 基准网络细节详解
- Focus结构-该结构的主要思想是通过slice操作来对输入图片进行裁剪。如下图所示,原始输入图片大小为6086083,经过Slice与Concat操作之后输出一个30430412的特征映射;接着经过一个通道个数为32的Conv层(该通道个数仅仅针对的是YOLOv5s结构,其它结构会有相应的变化),输出一个30430432大小的特征映射。
- CSP结构-YOLOv4网络结构中,借鉴了CSPNet的设计思路,仅仅在主干网络中设计了CSP结构。而YOLOv5中设计了两种CSP结构,以YOLOv5s网络为例,CSP1_X结构应用于Backbone主干网络中,另一种CSP2_X结构则应用于Neck网络中。CSP1_X与CSP2_X模块的实现细节如3.1所示。
5.2.5 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模块。