本文均来自网站各大佬的文章总结,便于本人后期进一步学习与总结,若有侵权,本人立即删除,已将涉及内容置于最后 Reference 部分,在此对各位大佬表示深深的感谢!!!
R-CNN算法的检测效果很好,但是检测速度很慢,因此总体效率不高。其主要原因在于:
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都还达不到实时的效果。
区域推荐网络(RPN),该区域推荐网络与检测网络共享整张图的卷积特征,使得区域推荐基本不消耗任何计算时间,RPN是一个完全卷积网络,可以同时预测每个位置的目标边界和目标得分。RPN是一种全卷积网络可以专门针对生成推荐区域的检测任务进行端到端训练。
第一个是,用于生成推荐区域的深度全卷积网络(deep fully convolutional network)。第二个是,使用该推荐区域的Fast R-CNN检测器
Faster R-CNN算法流程主要有以下4个步骤:
YOLO 统一为一个回归问题,而 Faster R-CNN 将检测结果分为两部分求解:物体类别(分类问题)、物体位置即 bounding box(回归问题)。
~~~~~~ 每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值。这个 confidence 代表了所预测的 box 中含有 object 的置信度和这个 box 预测的有多准两重信息,其值是这样计算的:
该表达式含义:如果有 object 落在一个 grid cell 里,则第一项取 1,否则取 0。 第二项是预测的 bounding box 和实际的 groundtruth 之间的 IoU 值。
~~~~~~ 注意:class 信息是针对每个网格的,confidence 信息是针对每个bounding box 的。
~~~~~~ 在 test 的时候,每个网格预测的 class 信息和 bounding box 预测的 confidence 信息相乘,就得到每个 bounding box 的 class-specific confidence score,得到每个 box 的 class-specific confidence score 以后,设置阈值,滤掉得分低的 boxes,对保留的 boxes 进行 NMS 处理,就得到最终的检测结果。
~~~~~~ 该表达式含义:等式左边第一项就是每个网格预测的类别信息,第二三项就是每个 bounding bo x预测的 confidence。这个乘积即 encode 了预测的 box 属于某一类的概率,也有该 box 准确度的信息。
总结:
~~~~~~ 每个 grid 有 30 维,这 30 维中,8 维是回归 box 的坐标,2 维是 box 的 confidence,还有 20 维是类别。其中坐标的 x,y 用对应网格的 offset 归一化到 0-1 之间,w,h 用图像的 width 和 height 归一化到 0-1 之间。在实现中,最主要的就是怎么设计损失函数,让这个三个方面得到很好的平衡。简单粗暴的全部采用了 sum-squared error loss 来做这件事我们先看下带来的后果。
这种做法存在以下几个问题:
解决方法:
在 YOLOv1 的损失函数中:
注:
YOLO 的缺点:
~~~~~~ YOLOv2 相对 v1 版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger) 这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测 9000 种不同对象,称之为 YOLO9000。
~~~~~~ 文章提出了一种新的训练方法–联合训练算法,这种算法可以把这两种的数据集混合到一起。使用一种分层的观点对物体进行分类,用巨量的分类数据集数据来扩充检测数据集,从而把两种不同的数据集混合起来。联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性。
~~~~~~ YOLO9000 就是使用联合训练算法训练出来的,他拥有 9000 类的分类信息,这些分类信息学习自 ImageNet 分类数据集,而物体位置检测则学习自 COCO 检测数据集。
~~~~~~ YOLOv1 有很多缺点,作者希望改进的方向是:改善 recall,提升定位的准确度,同时保持分类的准确度。目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种 model 综合到一起,但是 YOLOv2 则着力于简化网络。
~~~~~~ 批量归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个 batch 分别进行归一化的时候,起到了一定的正则化效果(YOLOv2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。
~~~~~~ 用于图像分类的训练样本很多,而标注了边框的用于训练目标检测的样本相比而言就少了很多,因为标注边框的人工成本比较高。所以目标检测模型通常都先用图像分类样本训练卷积层,提取图像特征,但这引出另一个问题,就是图像分类样本的分辨率不是很高。所以 YOLOv1 使用 ImageNet 的图像分类样本采用 224 * 224 作为输入,来训练 CNN 卷积层。然后在训练目标检测时,检测用的图像样本采用更高分辨率的 448 * 448 像素图像作为输入,但这样不一致的输入分辨率肯定会对模型性能有一定影响。
~~~~~~ 所以 YOLOv2 在采用 224 * 224 图像进行分类模型预训练后,再采用 448 * 448 高分辨率样本对分类模型进行微调(10 个 epoch),使网络特征逐渐适应 448 * 448 的分辨率。然后再使用 448 * 448 的检测样本进行训练,缓解了分辨率突然切换造成的影响,最终通过使用高分辨率,mAP 提升了 4%。
~~~~~~ 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%。
~~~~~~ 之前 Anchor Box 的尺寸是手动选择的,所以尺寸还有优化的余地。YOLOv2 尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLOv2 的做法是对训练集中标注的边框进行 K-means 聚类分析,以寻找尽可能匹配样本的边框尺寸。如果我们用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,这依赖于 Box 的大小,所以距离度量的使用:
~~~~~~ 其中,centroid 是聚类时被选作中心的边框,box 就是其它边框,d 就是两者间的“距离”,IOU 越大,“距离”越近。
~~~~~~ YOLOv2 给出的聚类分析结果如下图所示,通过分析实验结果(Figure 2),在 model复杂性 与 high recall 之间权衡之后,选择聚类分类数 K=5。
~~~~~~ 用 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,那么预测的结果见下图右面的公式:
~~~~~~ 目标检测面临的一个问题是图像中的需要检测的目标会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如 YOLOv2 中输入 416 * 416 经过卷积网络下采样最后输出是13 * 13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。于是 YOLOv2 引入一种称为 passthrough 层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个 pooling 之前,特征图的大小是 26 * 26 * 512,将其 1 拆 4,直接传递(passthrough)到 pooling 后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
~~~~~~ 具体怎样将 1 个特征图拆成 4 个特征图,见下图,图中示例的是 1 个 4 * 4 拆成 4 个 2 * 2,因为深度不变,所以没有画出来。
~~~~~~ 作者希望 YOLOv2 能健壮的运行于不同尺寸的图片之上,所以把这一想法用于训练 model 中。区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是 32,所以不同的尺寸大小也选择为 32 的倍数 {320,352……608},最小 320 * 320,最大 608 * 608,网络会自动改变尺寸,并继续训练的过程。这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以可以在 YOLOv2 的速度和精度上进行权衡。
~~~~~~ YOLOv1 的 backbone 使用的是 GoogleLeNet,速度比 VGG-16 快,YOLOv1 完成一次前向过程只用 8.52 billion 运算,而 VGG-16 要 30.69billion,但是 YOLOv1 精度稍低于 VGG-16。
~~~~~~ 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 精确度。
~~~~~~ 网络训练在 ImageNet 1000 类分类数据集上训练了 160 epochs,使用随机梯度下降,初始学习率为 0.1, polynomial rate decay with a power of 4, weight decay of 0.0005 and momentum of 0.9 。训练期间使用标准的数据扩大方法:随机裁剪、旋转、变换颜色(hue)、变换饱和度(saturation), 变换曝光度(exposure shifts)。在训练时,把整个网络在更大的 44 8* 448 分辨率上 Fine Turnning 10个 epoches,初始学习率设置为 0.001,这种网络达到达到 76.5%top-1精确度,93.3%top-5精确度。
~~~~~~ 网络去掉了最后一个卷积层,而加上了三个 3 * 3 卷积层,每个卷积层有 1024 个Filters,每个卷积层紧接着一个 1 * 1 卷积层。对于 VOC 数据,网络预测出每个网格单元预测五个 Bounding Boxes,每个 Bounding Boxes 预测 5 个坐标和 20 类,所以一共 125 个 Filters,增加了 Passthough 层来获取前面层的细粒度信息,网络训练了 160epoches,初始学习率 0.001,数据扩大方法相同,对 COCO 与 VOC 数据集的训练对策相同。
DBL: 代码中的 Darknetconv2d_BN_Leaky,是 YOLOv3 的基本组件,就是卷积 + BN + Leaky relu。
resn: n 代表数字,有 res1,res2, … ,res8 等等,表示这个 res_block 里含有多少个 res_unit。
concat: 张量拼接;将 darknet 中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层 add 的操作是不一样的,拼接会扩充张量的维度,而 add 只是直接相加不会导致张量维度的改变。
~~~~~~ 为了达到更好的分类效果,作者自己设计训练了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 条预测之路,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是如何而来的
~~~~~~ 网络中作者进行了三次检测,分别是在 32 倍降采样,16 倍降采样,8 倍降采样时进行检测,这样在多尺度的 feature map 上检测跟 SSD 有点像。在网络中使用 up-sample(上采样)的原因:网络越深的特征表达效果越好,比如在进行 16 倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就使用了浅层特征,这样效果一般并不好。如果想使用 32 倍降采样后的特征,但深层特征的大小太小,因此 YOLOv3 使用了步长为 2 的 up-sample(上采样),把 32 倍降采样得到的 feature map 的大小提升一倍,也就成了 16 倍降采样后的维度。同理 8 倍采样也是对 16 倍降采样的特征进行步长为 2 的上采样,这样就可以使用深层特征进行 detection。
~~~~~~ 作者通过上采样将深层特征提取,其维度是与将要融合的特征层维度相同的(channel不同)。如下图所示,85 层将 13 × 13 × 256 的特征上采样得到 26 × 26 × 256,再将其与 61 层的特征拼接起来得到 26 × 26 × 768。为了得到 channel255,还需要进行一系列的 3 × 3,1 × 1 卷积操作,这样既可以提高非线性程度增加泛化性能提高网络精度,又能减少参数提高实时性。52 × 52 × 255 的特征也是类似的过程。
~~~~~~ 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 类。
~~~~~~ 三次检测,每次对应的感受野不同,32 倍降采样的感受野最大,适合检测大的目标,所以在输入为 416 × 416 时,每个 cell 的三个 anchor box 为 (116 ,90); (156 ,198); (373 ,326)。16 倍适合一般大小的物体,anchor box 为(30,61); (62,45); (59,119)。8 倍的感受野最小,适合检测小目标,因此 anchor box 为(10,13); (16,30); (33,23)。所以当输入为416×416 时,实际总共有(52×52+26×26+13×13)×3 = 10647个proposal box。
~~~~~~ 感受一下 9 种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
这里注意bounding box 与 anchor box 的区别:
Bounding box 它输出的是框的位置(中心坐标与宽高),confidence 以及 N 个类别。
anchor box 只是一个尺度即只有宽高。
~~~~~~ YOLOv3重要改变之一:No more softmaxing the classes。YOLOv3 现在对图像中检测到的对象执行多标签分类。
~~~~~~ logistic 回归用于对 anchor 包围的部分进行一个目标性评分 (objectness score),即这块位置是目标的可能性有多大。这一步是在 predict 之前进行的,可以去掉不必要 anchor,可以减少计算量。
~~~~~~ 如果模板框不是最佳的即使它超过我们设定的阈值,我们还是不会对它进行 predict。不同于 Faster R-CNN 的是,YOLOv3 只会对 1 个 prior 进行操作,也就是那个最佳 prior。而 logistic 回归就是用来从 9 个 anchor priors 中找到 objectness score (目标存在可能性得分)最高的那一个。logistic 回归就是用曲线对 prior 相对于 objectness score 映射关系的线性建模。
~~~~~~ YOLOv4 其实是一个结合了大量前人研究技术,加以组合并进行适当创新的算法,实现了速度和精度的完美平衡。可以说有许多技巧可以提高卷积神经网络 (CNN) 的准确性,但是某些技巧仅适合在某些模型上运行,或者仅在某些问题上运行,或者仅在小型数据集上运行;我们来码一码这篇文章里作者都用了哪些调优手段:加权残差连接 (WRC),跨阶段部分连接(CSP),跨小批量标准化(CmBN),自对抗训练(SAT),Mish 激活,马赛克数据增强,CmBN,DropBlock 正则化,CIoU Loss 等等。经过一系列的堆料,终于实现了目前最优的实验结果:43.5%的AP(在Tesla V100上,MS COCO数据集的实时速度约为 65 FPS)。
~~~~~~ 我们前面知道在 YOLOv3 中,特征提取网络使用的是 Darknet53,而在 YOLOv4 中,对 Darknet53 做了一点改进,借鉴了 CSPNet,CSPNet 全称是 Cross Stage Partial Networks,也就是跨阶段局部网络。CSPNet 解决了其他大型卷积神经网络框架 Backbone 中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和 FLOPS 数值,既保证了推理速度和准确率,又减小了模型尺寸。如下图:
~~~~~~ CSPNet 实际上是基于 Densnet 的思想,复制基础层的特征映射图,通过dense block 发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。CSPNet 思想可以和 ResNet、ResNeXt 和 DenseNet 结合,目前主要有 CSPResNext50 和 CSPDarknet53 两种改造 Backbone 网络。
考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
这样最终的 CSPDarknet53 结构就如下图:
为了增大感受野,作者还使用了 SPP-block,使用 PANet 代替 FPN 进行参数聚合以适用于不同 level 的目标检测。
~~~~~~ SPP-Net 结构我们之前也有学过,SPP-Net 全称 Spatial Pyramid Pooling Networks,当时主要是用来解决不同尺寸的特征图如何进入全连接层的,直接看下图,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。
~~~~~~ 如上图,以 3 个尺寸的池化为例,对特征图进行一个最大值池化,即一张特征图得取其最大值,得到 1 * d (d 是特征图的维度)个特征;对特征图进行网格划分为 2 x 2 的网格,然后对每个网格进行最大值池化,那么得到 4 * d 个特征;同样,对特征图进行网格划分为 4 x 4 个网格,对每个网格进行最大值池化,得到 16 * d 个特征。 接着将每个池化得到的特征合起来即得到固定长度的特征个数(特征图的维度是固定的),接着就可以输入到全连接层中进行训练网络了。用到这里是为了增加感受野。
~~~~~~ YOLOv4 使用 PANet (Path Aggregation Network)代替 FPN 进行参数聚合以适用于不同 level 的目标检测, PANet 论文中融合的时候使用的方法是 Addition,YOLOv4 算法将融合的方法由加法改为 Concatenation。如下图:
这里我们主要从数据增强,DropBlock 正则化,类标签平滑方面来学习下 BackBone 训练策略。
1、CutMix
~~~~~~ YOLOv4 选择用 CutMix 的增强方式,CutMix 的处理方式也比较简单,同样也是对一对图片做操作,简单讲就是随机生成一个裁剪框 Box,裁剪掉 A 图的相应位置,然后用 B 图片相应位置的 ROI 放到 A 图中被裁剪的区域形成新的样本,ground truth 标签会根据 patch 的面积按比例进行调整,比如 0.6 像狗,0.4 像猫,计算损失时同样采用加权求和的方式进行求解。这里借 CutMix 的地方顺带说下几种类似的增强方式:
~~~~~~ 上图是 CutMix 论文中作者对几种增强方式做的对比,结果显而易见,CutMix的增强方式在三个数据集上的表现都是最优的。其中 Mixup 是直接求和两张图,如同附身,鬼影一样,模型很难学到准确的特征图响应分布。Cutout 是直接去除图像的一个区域,这迫使模型在进行分类时不能对特定的特征过于自信。然而,图像的一部分充满了无用的信息,这是一种浪费。在 CutMix 中,将图像的一部分剪切并粘贴到另一个图像上,使得模型更容易区分异类。
CutMix论文: https://arxiv.org/pdf/1905.04899v2.pdf
2、Mosaic
~~~~~~ Yolov4 的 Mosaic 数据增强是参考 CutMix 数据增强,理论上类似。区别在于Mosaic 是一种将 4 张训练图像合并成一张进行训练的数据增强方法(而不是 CutMix 中的 2 张)。这增强了对正常背景 (context) 之外的对象的检测,丰富检测物体的背景。此外,每个小批包含一个大的变化图像(4倍),因此,减少了估计均值和方差的时需要大 mini-batch 的要求,降低了训练成本。如下图:
~~~~~~ 正则化技术有助于避免数据科学专业人员面临的最常见的问题,即过拟合。对于正则化,已经提出了几种方法,如 L1 和 L2 正则化、Dropout、Early Stopping 和数据增强。这里 YOLOv4 用了 DropBlock 正则化的方法。
DropBlock 方法的引入是为了克服 Dropout 随机丢弃特征的主要缺点,Dropout 被证明是全连接网络的有效策略,但在特征空间相关的卷积层中效果不佳。DropBlock 技术在称为块的相邻相关区域中丢弃特征。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。如下图:
DropBlock 论文中作者最终在 ImageNet 分类任务上,使用 Resnet-50 结构,将精度提升1.6%个点,在 COCO 检测任务上,精度提升1.6%个点。
~~~~~~ 对于分类问题,特别是多分类问题,常常把向量转换成 one-hot-vector,而one-hot 带来的问题: 对于损失函数,我们需要用预测概率去拟合真实概率,而拟合 one-hot 的真实概率函数会带来两个问题:
~~~~~~ 对预测有 100% 的信心可能表明模型是在记忆数据,而不是在学习。标签平滑调整预测的目标上限为一个较低的值,比如 0.9。它将使用这个值而不是1.0来计算损失。这个概念缓解了过度拟合。说白了,这个平滑就是一定程度缩小 label 中 min 和 max 的差距,label 平滑可以减小过拟合。所以,适当调整 label,让两端的极值往中间凑凑,可以增加泛化性能。
~~~~~~ 对激活函数的研究一直没有停止过,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 放到整个整个网络的连接中如下图:
~~~~~~ 上图采用 EfficientNet 作为骨干网络,BiFPN 作为特征网络,共享 class/box 预测网络。 基于不同的资源约束,BiFPN 层和类/盒网层都被重复多次。
~~~~~~ 损失函数给出了如何调整权重以降低 loss。所以在我们做出错误预测的情况下,我们期望它能给我们指明前进的方向。但如果使用 IoU,考虑两个预测都不与 ground truth 重叠,那么 IoU 损失函数不能告诉哪一个是更好的,或者哪个更接近 ground truth。这里顺带看下常用的几种 loss 的形式,如下:
经典IoU loss:
IoU算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
可以看到 IOU 的 loss 其实很简单,主要是交集/并集,但其实也存在两个问题:
因此2019年出现了GIOU_Loss来进行改进。
GIoU:Generalized IoU
~~~~~~ GIoU 考虑到,当检测框和真实框没有出现重叠的时候 IoU 的 loss 都是一样的,因此 GIoU 就加入了 C 检测框(C 检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。其中,C 是指能包含 predict box 和 Ground Truth box 的最小box。
可以看到上图 GIOU_Loss 中,增加了相交尺度的衡量方式,缓解了单纯 IOU_Loss 时的尴尬。但为什么仅仅说缓解呢?因为还存在一种不足:
基于这个问题,2020年的 AAAI 又提出了 DIOU_Loss。
3、DIoU:Distance IoU
好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。针对IOU 和 GIOU 存在的问题,作者从两个方面进行考虑
如何最小化预测框和目标框之间的归一化距离?
如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,提出了 DIOU_Loss(Distance_IOU_Loss)
DIOU_Loss 考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量 2 个框的距离,因此 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 的回归方式,使得预测框回归的速度和精度更高一些。
~~~~~~ BN 就是仅仅利用当前迭代时刻信息进行 norm,而 CBN 在计算当前时刻统计量时候会考虑前 k 个时刻统计量,从而实现扩大 batch size 操作。同时作者指出 CBN 操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些,比 GN 还慢。
~~~~~~ CmBN 是 CBN 的改进版本,其把大 batch 内部的 4 个 mini batch 当做一个整体,对外隔离。CBN 在第 t 时刻,也会考虑前 3 个时刻的统计量进行汇合,而 CmBN 操作不会,不再滑动 cross,其仅仅在 mini batch 内部进行汇合操作,保持 BN 一个 batch 更新一次可训练参数。
~~~~~~ BN:无论每个 batch 被分割为多少个 mini batch,其算法就是在每个 mini batch前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行 Nomalization,BN 数据与其他 mini batch 的数据无关。CBN:每次 iteration 中的 BN 数据是其之前 n 次数据和当前数据的和(对非当前 batch 统计的数据进行了补偿再参与计算),用该累加值对当前的 batch 进行 Nomalization。好处在于每个 batch 可以设置较小的 size。CmBN:只在每个 Batch 内部使用 CBN 的方法,个人理解如果每个 Batch 被分割为一个 mini batch,则其效果与 BN 一致;若分割为多个 mini batch,则与 CBN 类似,只是把 mini batch 当作 batch 进行计算,其区别在于权重更新时间点不同,同一个batch 内权重参数一样,因此计算不需要进行补偿。
~~~~~~ SAT 为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。
~~~~~~ Self-Adversarial Training 是在一定程度上抵抗对抗攻击的数据增强技术。CNN 计算出 Loss, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在 SAT 的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。
对于 bx = cx 和 bx = cx + 1 的情况,我们需要分别具有很大的负值和正值。但我们可以将与一个比例因子(>1.0)相乘,从而更轻松地实现这一目标
余弦调度会根据一个余弦函数来调整学习率。首先,较大的学习率会以较慢的速度减小。然后在中途时,学习的减小速度会变快,最后学习率的减小速度又会变得很慢。
这张图展示了学习率衰减的方式(下图中还应用了学习率预热)及其对mAP的影响。可能看起来并不明显,这种新的调度方法的进展更为稳定,而不是在停滞一段时间后又取得进展。
注意力机制在 DL 设计中被广泛采用。在 SAM 中,最大值池化和平均池化分别用于输入 feature map,创建两组 feature map。结果被输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将空间注意掩模应用于输入特征,输出精细的特征图。
在YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化。
在YOLOv4中,FPN概念逐渐被实现/替换为经过修改的SPP、PAN和PAN。
NMS 过滤掉预测相同对象的其他边界框,并保留具有最高可信度的边界框。
DIoU (前面讨论过的) 被用作非最大值抑制(NMS)的一个因素。该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离。这使得它在有遮挡的情况下更加健壮。
~~~~~~ YOLOv4 出现之后不久,YOLOv5 横空出世。YOLOv5 在 YOLOv4 算法的基础上做了进一步的改进,检测性能得到进一步的提升。虽然 YOLOv5 算法并没有与 YOLOv4 算法进行性能比较与分析,但是 YOLOv5 在 COCO 数据集上面的测试效果还是挺不错的。大家对 YOLOv5 算法的创新性半信半疑,有的人对其持肯定态度,有的人对其持否定态度。在我看来,YOLOv5 检测算法中还是存在很多可以学习的地方,虽然这些改进思路看来比较简单或者创新点不足,但是它们确定可以提升检测算法的性能。其实工业界往往更喜欢使用这些方法,而不是利用一个超级复杂的算法来获得较高的检测精度。
~~~~~~ YOLOv5 是一种单阶段目标检测算法,该算法在 YOLOv4 的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:
~~~~~~ 上图展示了 YOLOv5 目标检测算法的整体框图。对于一个目标检测算法而言,我们通常可以将其划分为4个通用的模块,具体包括:输入端、基准网络、Neck 网络与 Head 输出端,对应于上图中的 4 个红色模块。YOLOv5 算法具有 4 个版本,具体包括:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 四种,本文重点讲解 YOLOv5s,其它的版本都在该版本的基础上对网络进行加深与加宽。
~~~~~~ Mosaic数据增强-YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法,该算法是在CutMix数据增强方法的基础上改进而来的。CutMix仅仅利用了两张图片进行拼接,而Mosaic数据增强方法则采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成,具体的效果如下图所示。这种增强方法可以将几张图片组合成一张,这样不仅可以丰富数据集的同时极大的提升网络的训练速度,而且可以降低模型的内存需求。
1. YOLO系列算法精讲:从yolov1至yolov5的进阶之路(2万字超全整理) 强推 ☆☆☆
2. YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
3. yolo系列之yolo v3【深度解析】
4. 目标检测算法YOLOv4详解
5. 目标检测(九)–YOLO v1,v2,v3