EfficientDet(2019/11/20) ResneSt(2020/4/19) YOLOV4(2020/4/23)
论文:(https://arxiv.org/pdf/1911.09070.pdf)
代码:(https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch)
什么检测器能够兼顾准确率和模型效率?如何才能实现?谷歌大脑 Mingxing Tan、Ruoming Pang 和 Quoc V. Le 提出新架构 EfficientDet,结合 EfficientNet(同样来自该团队)和新提出的 BiFPN,实现新的 SOTA 结果。
在计算机视觉领域,模型效率的重要性越来越高。近日,谷歌大脑团队 Quoc V. Le 等人系统研究了多种目标检测神经网络架构设计,提出了能够提升模型效率的两项关键优化。
1、提出加权双向特征金字塔网络(weighted bi-directional feature pyramid network,BiFPN),从而轻松、快速地实现多尺度特征融合;
2、提出一种复合缩放(compound scaling)方法,同时对所有主干网络、特征网络和边界框/类别预测网络的分辨率、深度和宽度执行统一缩放。
这个工作可以看做是EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks的扩展,从分类任务扩展到检测任务(Object Detection)。众所周知,神经网络的速度和精度之间存在权衡,而 EfficientDet 是一个总称,可以分为 EfficientDet D1 ~ EfficientDet D7,速度逐渐变慢,但是精度也逐渐提高。
如图,EfficientDet实现了最新的53.7%COCO AP,其参数量和FLOP比以前的目标检测方案要少得多
接下来主要从三个方面介绍EfficientDet:
1、网络基础结构EfficientNet;
2、复合缩放(compound scaling)
3、BiFPN(weighted bi-directional feature pyramid network);
1.1 EfficientNet
ResNet可以增加层数从ResNet18扩展到ResNet200。而EfficientNet,就是一种标准化的模型扩展结果,通过下面的图,我们可以直观的体会到EfficientNet b0-b7在ImageNet上的效果:对于ImageNet历史上的各种网络而言,可以说EfficientNet在效果上实现了碾压:
我们在扩展网络的时候,一般通过调整输入图像的大小、网络的深度和宽度(卷积通道数,也就是channel数)进行。在EfficientNet之前,研究工作只是针对这三个维度中的某一个维度进行调整,因为有限的计算能力,很少有研究对这三个维度进行综合调整的。
1.1.1 EfficientNet复合缩放方法(compound scaling method)
EfficientNet的设想就是能否设计一个标准化的卷积网络扩展方法,既可以实现较高的准确率,又可以充分的节省算力资源。因而问题可以描述成,如何平衡分辨率、深度和宽度这三个维度,来实现网络在效率和准确率上的优化。
实验一:
分辨率、深度和宽度这三个维度之间有内在联系,比如更高分辨率的图片就需要更深的网络来增大感受野捕捉特征。因此作者做了两个实验(实际应该多得多)来验证,第一个实验,对三个维度固定两个,只放大其中一个,得到结果如下:
w、d、r 分别是网络宽度,网络高度,分辨率的倍率。
图中从左至右分别是只放大网络宽度(width, w 为放大倍率)、网络深度(depth, d 为放大倍率)、图像分辨率(resolution, r 为放大倍率) 的结果,可以观察到单个维度的放大最高精度只在 80 左右。本次实验作者得出一个观点:三个维度中任一维度的放大都可以带来精度的提升,但随着倍率越来越大,提升却越来越小。
实验二:
尝试在不同的 d, r 组合下变动 w
从实验结果可以看出最高精度比之前已经有所提升,且不同的组合效果还不一样,最高可以到 82 左右。作者又得到一个观点,得到更高的精度以及效率的关键是平衡网络宽度,网络深度,图像分辨率三个维度的放缩倍率(d, r, w)
因此,作者提出了一种混合维度放大法(compound scaling method),该方法使用一个混合系数Φ来决定三个维度的放大倍率
其中,α、β、γ均为常数(不是无限大的因为三者对应了计算量),可通过网格搜索获得。混合系数Φ可以人工调节。考虑到如果网络深度翻番那么对应计算量会翻番,而网络宽度或者图像分辨率翻番对应计算量会翻 4 番,即卷积操作的计算量(FLOPS) 与d、w2、r2 成正比,因此上图中的约束条件中有两个平方项。在该约束条件下,指定混合系数Φ之后,网络的计算量大概会是之前的2Φ倍。
1.1.2 EfficientNet基础网络结构
EfficientNet使用了MobileNet V2中的MBCConv作为模型的主干网络,同时也是用了SENet中的squeeze and excitation方法对网络结构进行了优化。
有了初代的网络结构之后,放大就分为下面两步:
作者选择只在小模型上进行网络搜索,大大减少了计算量。因为在大模型上进行网格搜索的成本实在是太高了。
1.2、BiFPN(有效的双向跨尺度连接和加权特征融合)
CVPR 2017 的FPN指出了不同层之间特征融合的重要性,并且以一种比较简单,启发式的方法把底层的特征乘两倍和浅层相加融合。之后人们也试了各种别的融合方法,比如 PANet先从底向上连,再自顶向下连回去;M2Det 在连的时候加入 skip-connection;Libra-RCNN先把所有feature 都汇聚到中间层,然后再 refine。
总之上述都是一些人工连连看的设计,包含 Conv,Sum,Concatenate,Resize,Skip Connection 等候选操作。很明显使用哪些操作、操作之间的顺序是可以用 NAS 搜的。进入 Auto ML 时代之后,NAS-FPN 珠玉在前,搜到了一个更好的 neck 部分的结构。
本文的作者基于下面的观察结果/假设,进一步进行了优化:
1.作者观察到PANet的效果比FPN,NAS-FPN要好,就是计算量更大;
2.作者从PANet出发,移除掉了只有一个输入的节点。这样做是假设只有一个输入的节点相对不太重要。这样把PANet简化,得到了上图 (e) Simplified PANet 的结果;
3.作者在相同 level 的输入和输出节点之间连了一条边,假设是能融合更多特征,有点 skip-connection 的意味,得到了上图 (f) 的结果;
4.将每个双向(自上而下和自下而上)路径视为一个要素网络层,并重复同一层多次以启用更多高级要素融合。这样就得到了下图的结果(看中间的 BiFPN Layer 部分)。如何确定重复几次呢,这是一个速度和精度之间的权衡,会在下面的Compound Scaling 部分介绍。
1.3 复合缩放(Compound Scaling)
Backbone网络:
直接采用EfficientNet-B0 to B6中的复合系数,并采用 EfficientNet作为backbone。
BiFPN 网络:(对于BiFPN network中width和depth的设置)
Box/class 预测网络:(Box/class prediction network中的depth的设置)
(2)
输入图像的分辨率(必须是 27=128的倍数)(对于Input image resolution的设置)
(3)
如表所示,根据具有不同φ的方程1,2,3,我们开发了EfficientDet-D0(φ= 0)至D7(φ= 7),其中D7与D6相同,但分辨率更高。值得注意的是,我们的缩放是基于启发式的,可能不是最优的,但是我们证明,这种简单的缩放方法比其他一维缩放方法可以显着提高效率。
论文:(https://hangzhang.org/files/resnest.pdf)
代码:(https://github.com/zhanghang1989/ResNeSt)
先说几组数据:
ResNeSt-50 在 ImageNet 上实现了81.13% top-1 准确率
简单地用ResNeSt-50替换ResNet-50,可以将MS-COCO上的Faster R-CNN的mAP从39.25%提高到42.33%!
简单地用ResNeSt-50替换ResNet-50,可以将ADE20K上的DeeplabV3的mIoU从42.1%提高到45.1%!
性能显著提升,参数量并没有显著增加,部分实验结果如下图所示。轻松超越ResNeXt、SENet等前辈(巨人)们。
ResNeSt优于所有现有的ResNet变体,并且具有相同的计算效率,甚至比通过神经结构搜索(NAS)生成的最新的CNN模型更好地实现了速度与精度的平衡,具体表现如下表
ResNeSt 的全称是:Split-Attention Networks,也就是特别引入了Split-Attention模块。,ResNeSt 的S就是 Split。ResNeSt 实际上是站在巨人们上的"集大成者",特别借鉴了:Multi-path和Feature-map Attention思想。
其中:
GoogleNet:采用了Multi-path机制,其中每个网络块均由不同的卷积kernels组成。
ResNeXt:在ResNet bottle模块中采用组卷积,将multi-path结构转换为统一操作。
SE-Net:通过自适应地重新校准通道特征响应来引入通道注意力(channel-attention)机制。
SK-Net:通过两个网络分支引入特征图注意力(feature-map attention)。
ResNeSt 和 SE-Net、SK-Net 的对应图示如下:
其中上图中都包含的 Split Attention模块如下图所示:
这项工作提出了具有新颖的Split-Attention块的ResNeSt体系结构,该块普遍提高了学习到的特征表示,从而提高了图像分类,对象检测,实例分割和语义分割的性能。 在后面的下游任务中,通过简单地将骨干网络切换到我们的ResNeSt所产生的经验改进明显优于应用于标准骨干(例如ResNet)的特定于任务的修改。Split-Attention块易于使用且计算效率高,因此应在视觉任务中广泛应用。
论文:(https://arxiv.org/pdf/2004.10934.pdf)
代码:(https://github.com/rrddcc/YOLOv4_tensorflow)
3.1 介绍
Yolo-V4的主要目的在于设计一个能够应用于实际工作环境中的快速目标检测系统,且能够被并行优化,并没有很刻意的去追求理论上的低计算量(BFLOP)。同时,Yolo-V4的作者希望算法能够很轻易的被训练,也就是说拥有一块常规了GTX-2080ti或者Titan-XP GPU就能够训练Yolo-V4, 同时能够得到一个较好的结果(Yolo-V4 结果如上图)。整个介绍可以总结为以下几点:
a:研究设计了一个简单且高效的目标检测算法,该算法降低了训练门槛,使得普通人员在拥有一块1080TI或者2080TI的情况下就能够训练一个又快又准确的目标检测器;
b:在训练过程中验证了最新的Bag-of-Freebies(不增加训练成本的技巧)和Bag-of-Specials
(增加训练成本的技巧)对Yolo-V4的影响;
c:简化以及优化了一些最新提出的算法,包括(CBN,PAN,SAM),从而使Yolo-V4能够在一块GPU上就可以训练起来。
3.1.1 目标检测算法的发展总结
现代检测器通常由两部分组成,一个是在ImageNet数据上经过预训练的骨干网络,另一个是用来预测物体的类别和边界框的头部。对于在GPU平台上运行的那些检测器,其主干可能是VGG,ResNet,ResNeXt或DenseNet。对于在CPU平台上运行的那些检测器,其主干可以是SqueezeNet,MobileNet 或ShuffleNet。至于头部,通常分为两类,即one-stage目标检测器和two-stage目标检测器。最有代表性的两级对象检测器是R-CNN系列,包括Fast R-CNN,Faster R-CNN,R-FCN和Libra R-CNN。也有可能使two-stage检测器成为无锚对象(anchor-free)检测器,例如RepPoints。对于one-stage目标检测器,最具代表性的模型是YOLO,SSD和RetinaNet。近年来,开发了无锚的one-stage检测器。这种检测器是CenterNet ,CornerNet,FCOS等。近年来开发的对象检测器通常在骨架和头部之间插入一些层,这些层通常用于收集特征图。从不同的阶段。我们可以称其为对象检测器的颈部。通常,颈部由几个自下而上的路径和几个自上而下的路径组成。配备此机制的网络包括特征金字塔(Feature Pyramid Network)[44], Path Aggregation Network (PAN),BiFPN和NAS-FPN。除上述模型外,一些研究人员将重点放在直接构建用于对象检测的新主干(DetNet,DetNAS)或新的整个模型(SpineNet,HitDetector)上。
首先解释一下相关的名词:
Input:算法的输入,包括整个图像,一个patch,或者是image pyramid
Backbone:可以理解为是提取图像特征的部分,由于图像中的浅层特征(low-level)是比较类似的,例如提取边缘,颜色,纹理这些。因此这部分可以很好的借鉴一些设计好并且已经训练好的网络,例如(VGG16,19,ResNet-50, ResNeXt-101, Darknet53), 同时还有一些轻量级的backbone(MobilenetV1,2,3 ShuffleNet1,2)。
Neck:这部分我的理解是特征增强模块,前面的backbone已经提取到了一些相关的浅层特征,由这部分对backbone提取到的浅层特征(low-level feature)进行加工,增强,从而使得模型学到的特征是我想要的特征。这部分典型的有(SPP,ASPP in deeplabV3+,RFB,SAM),还有一些(FPN, PAN, NAS-FPN, BiFPN, ASFF, SFAM)。
Head:检测头。这部分就到了算法最关键的部分,就是来输出你想要的结果,例如想得到一个heatmap,(如在centernet中),那就增加一些反卷积层来一层一层反卷积回去。如果想直接得到bbox,那就可以接conv来输出结果,例如Yolo,ssd这些。亦或是想输出多任务(mask-RCNN)那就输出三个head:classification,regression,segmentation(就是mask那部分)。
因此,一个检测算法可以理解为:Object Detection = Backbone + Neck + Head。
3.2 YOLOV4
基于大量的实验与调研YOLOV4结构如下:
• Backbone: CSPDarknet53
CSPNet 将密集模块的输入特征图分为了两部分。第一部分 x_₀会绕过密集模块,成为下个过渡层的输入的一部分。第二部分 x_₀则会通过密集模块,如下图所示。
YOLOv4 使用了上面的 CSP 与Darknet-53 作为特征提取的骨干。相比于基于 ResNet 的设计,CSPDarknet53 模型的目标检测准确度更高,不过 ResNet 的分类性能更好一些。但是,借助后边的 Mish激活函数和其它技术,CSPDarknet53 的分类准确度可以得到提升。因此,YOLOv4 最终选择了 CSPDarknet53。
• Neck: SPP , PAN
SPP显著特点
1) 不管输入尺寸是怎样,SPP 可以产生固定大小的输出
2) 使用多个窗口(pooling window)
3) SPP 可以使用同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征。
其它特点
1) 由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变(scale-invariance)和降低了过拟合(over-fitting)
2) 实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛(convergence)
3) SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层)
4) 不仅可以用于图像分类而且可以用来目标检测
• Head: YOLOv3
YOLO v4 使用的技巧
Bag of Freebies(不增加训练成本的技巧)for backbone:
a.CutMix和Mosaic数据增强;
b.DropBlock正则化:相邻的位置可能高度相关。所以即使丢弃一些像素,仍然可以检测出空间信息。DropBlock 正则化基于类似的概念,但适用于卷积层。不过 DropBlock 丢弃的不是各个像素,而是大小为 block_size × block_size 的一个像素块。
c.类标签平滑: 每当你觉得自己完全正确时,你可能只是想错了。如果一个预测结果的置信度为 100%,可能只是说明模型记忆了这个数据,而非学习了什么东西。标签平滑化将预测结果的目标上界调整至了一个更低的值,比如0.9。然后在计算损失时,模型会以这个值为目标,而不是1.0。这一方法可缓解过拟合问题
Bag of Specials (增加训练成本的技巧) for backbone:
a.Mish activation;Tensorflow:x = x *tf.math.tanh(F.softplus(x))
b.Cross-stage partial connections (CSP) 交叉阶段部分连接;
c.Multiinput weighted residual connections (MiWRC),多输入加权的残差连接
Bag of Freebies (BoF) for detector:
a.CIoU-loss;
一个好的 bbox 回归损失应该考虑三个重要的集合度量:重叠面积、中心点距离和高宽比。
d 和 c 分别代表检测框和真实框的中心点,且 d代表的是计算两个中心点之间的欧氏距离,c 则代表 GIoU 中提到的 smallest convex shapes 的对角线距离,v 用来衡量高宽比的一致性,α 是一个 positive trade-off parameter, 是不参与求导的。
b.CmBN;
c.DropBlock regularization;
d.Mosaic data augmentation;
e.Self-Adversarial Training;
f.Eliminate grid sensitivity;
g.Using multiple anchors for a single ground truth;
h.Cosine annealing scheduler:余弦调度会根据一个余弦函数来调整学习率。首先,较大的学习率会以较慢的速度减小。然后在中途时,学习的减小速度会变快,最后学习率的减小速度又会变得很慢。
i.Optimal hyperparameters:进化算法是一种有根据的猜测方法。其遵循「适者生存」的概念。举个例子,如果我们随机选择 100 组超参数。然后使用它们训练 100 个模型。之后,我们从中选出表现最好的 10 个模型。对于每个被选中的模型,都根据原始版本创建 10 个超参数略有不同的变体版本。再使用这些新的超参数重新训练模型,再次选出其中表现最好的。随着我们不断迭代,我们应该可以找到超参数的最佳集合
j.Random training shapes:许多单阶段目标检测器都是用固定的输入图像形状进行训练的。为了提升泛化能力,我们可以使用不同的图像大小训练模型
Bag of Specials (BoS) for detector:
Mish activation, SPP-block;
SAM-block;
PAN path-aggregation block;
DIoU-NMS。
3.3 本文独有的改进
为了使设计的检测器更适合在单个GPU上进行训练,进行了以下附加设计和改进:
1、一种新的数据增强Mosaic, and Self-Adversarial Training (SAT)方法
2、用遗传算法的同时选择了最佳超参数
3、改了一些现有方法,使我们的设计适合进行有效的训练和检测-改进的SAM,改进的PAN和Cross mini-Batch Normalization(CmBN)
3.3.1 Mosaic
Mosaic表示一种新的数据增强方法,该方法混合了4个训练图像。因此,有4种不同的上下文混合,而CutMix仅混合2个输入图像。这样可以检测正常上下文之外的对象。此外,批量归一化从每层上的4张不同图像计算激活统计信息。这大大减少了对大批量生产的需求
Self-Adversarial Training (SAT)也代表了一项新的数据增强技术,该技术可在2个向前和向后的阶段进行操作。在第一阶段,神经网络会更改原始图像,而不是网络权重。以这种方式,神经网络对其自身执行对抗攻击,从而改变原始图像以产生对图像上没有期望物体的欺骗。在第二阶段,训练神经网络以正常方式检测此修改图像上的对象。
3.3.2 改进SAM,改进PAN,CmBN
注意力已经在深度学习设计中得到了广泛的应用。SAM(空间注意力模块)会为输入特征图分别应用最大池化和平均池化,从而得到两个特征图集合。其结果会被送入一个卷积层,之后再由一个 sigmoid 函数创建出空间注意力。
SAM从空间注意改为点注意,并将PAN的快捷连接替换为串联,分别如下图所示:
CmBN表示CBN修改版本,如图所示,定义为交叉微型批处理规范化(CmBN)。这仅收集单个批次中的迷你批次之间的统计信息。
总结一句话速度差不多的精度碾压,速度差不多的精度碾压。