一文读懂EfficientDet.
今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测器的统称, 其精度与速度全面领先于YOLO V3, MaskRCNN, RentinaNet, NAS-FPN这些常见目标检测模型. EfficientDet-D7 的性能更是非常的惊人, 在 326B FLOPS, 参数量 52 M的情况下, COCO 2017 validation 数据集上取得了 51.0的 mAP, 当下最强. EfficientDet更重要的贡献是将EfficientNet复合缩放的思路进行延伸, 把架构决策明确化为可扩展的框架, 并且为不同的应用场景提供了 D0 到 D7 七种 “丹方”,实现了速度和精度之间的均衡, 使用者无需复杂调参, 便能轻松应用于对象检测中的其他用例.
EfficientDet Architecture
EfficientDet由 EfficientNet Backbone, BiFPN layer, Class 和 Box prediction net 四部分组成.
EfficientDet和SSD, RetinaNet一样都属于single-shot detectors . 主干网中的3-7级{P3, P4, P5, P6, P7}特征会传递给特征网络, 并反复应用BiFPN(自上而下&自下而上)的双向特征融合. 这些融合的特征被馈送到类预测和边界框预测网络, 以分别生成对象类和边界框位置. 类和边界框网络权重在所有级别的功能之间共享.
本文将结合复合缩放依次对这几部分进行介绍.
EfficientNet
2019 年, Google Brain团队发布了名为EfficientNet的ConvNet模型.
EfficientNet的结构来源于神经体系结构搜索, 在给定一定数量的FLOPS的情况下, 神经体系结构搜索针对准确性进行了优化, 最终创建了EfficientNet的Baseline ConvNet B0 . 通过缩放搜索, 可以将EfficientNet-B0缩放到EfficientNet-B1-7.
EfficientNet是EfficientDet架构的主干, 因此在继续介绍EfficientDet之前, 我将首先介绍EfficientNet baseline B0的结构设计, 之后会在复合缩放章节介绍EfficientNet的扩展性.
EfficientNet几个重要的操作分别是DWConv depthwise conv 深度可分离卷积, MBConv mobile inverted Bottlenneck conv 移动倒置瓶颈. k3x3/5x5分别代表卷积核大小, BN是 batch norm, HxWxF代表tensor的height, width和 depth.
DWConv depthwise conv
深度可分离卷积由depthwise(DW)和pointwise(PW)两个部分组成, 通过将乘法运算变为加法运算, 在能够保证同样卷积精度的情况下, 极大的降低计算成本.
如在上图中一张10x10像素、三通道彩色输入图片(shape为3x10x10), Depthwise Convolution首先经过第一次逐通道卷积运算(shape为3x3x3), 然后再进行逐点卷积(shape 为3x1x1x16), 那么总的参数量为27+48 =75, 相比于常规卷积(3x3x3x16) 减少了83%的参数量.
Inverted residual block
Inverted residual block来源于Mobilenet, 传统的残差模块, 先用1x1卷积将输入的feature map的维度降低, 然后进行3x3的卷积操作, 最后再用1x1的卷积将维度变大. 而倒置残差模块先用1x1卷积将输入的feature map维度变大, 然后用3x3 depthwise convolution方式做卷积运算, 最后使用1x1的卷积运算将其维度缩小. 注意, 在Mobilenet V2中, 1x1卷积运算后, 不再使用ReLU6激活函数, 而是使用线性激活函数, 以保留更多特征信息, 保证模型的表达能力.
EfficientNet-B0最终的网络结构如下图所示, 其中Resolution是输入tensor的Height x Width, #Channels是输出tensor的channel, #Layers是block重复的次数.
MBConv的网络结构和MobileNetV2的Inverted residual block相同, 其中MBConv6, k3×3代表卷积核的数目为6, 深度卷积的卷积核尺寸为3×3.
不同之处在于, EfficientNet-B0将ReLU6激活函数换成了Swish激活函数.
Swish激活函数公式为:
β默认为1.0
BiFPN
BiFPN是EfficientDet的核心, 全称是"bidirectional feature network ", 也就是加权双向特征网络, 可轻松快速地进行多尺度特征融合.
在讨论BiFPN之前,我们先来讨论特征网络设计的几种方式, 探索特征网络是如何从FPN演化到BiFPN的?
FPN
FPN是我们最熟悉的特征网络, 在此之前人们普遍通过图像金字塔(featurized Image Pyramids)来构建不同尺度的特征金字塔, 从而解决不同场景图像中对象尺度差异很大的问题.
传统的特征化图像金字塔(图a)的比例是不变的, 此属性使模型可以通过在位置和金字塔等级上扫描模型来检测大范围的对象, 即对象的比例更改可以通过在金字塔中移动其级别来抵消.
尽管此方法效果很好, 但在计算方面却非常昂贵, 不仅推理时间会大幅增加, 而且内存的占用也是巨大的, 往往只能在测试时使用, 但是网络只是针对某一特点的分辨率进行训练, 如果只是在测试和推理阶段使用图像金字塔的话, 可能导致训练和测试推理过程不匹配, 因此用图像金字塔的方式是无法训练端对端的网络模型的.
随后人们开始使用CNN提取不同层在不同级别和比例下的特征图, 获取特征金字塔信息, 如Faster R-CNN中的RPN层就是利用单个高层特征图进行物体的分类和bounding box的回归(图b-single feature map), SSD从网络高层开始构建特征金字塔(图c-pyramidal fearure hierarchy).
尽管在SSD中我们已经使用了特征金字塔, 但该金字塔中的所有要素都处于不同的比例, 并且由于网络中层的深度不同而存在巨大的语义鸿沟. 高分辨率地图具有低级语义特征, 而低分辨率地图具有较高的语义特征, 这会损害其对象识别的表示能力. 那如何才能同时使用这两种特征, 从而在不同规模下进行快速可靠的检测?
为了解决这一问题, 何恺明在2017年推出了更快更准的Feature Pyramid Networks.
这一技术随后被运用在YOLO V3中,从而被广泛认知. FPN通过横向连接将自下而上的路径与自上而下的路径进行组合来实现高低层级特征的融合. 即首先对高阶特征进行上采样, 然后使用横向连接将其与低阶特征进行组合, 该横向连接基本上是1x1卷积, 然后进行求和, 然后在各个级别独立进行预测.
Fully connected FPN and NAS-FPN
在2019年的"Learning Spatial Fusion for Single-Shot Object Detection" 这篇论文中Fully conneted FPN, 即使用全连接层神经网络训练的特征网络被首次应用. 与此同时, 谷歌大脑也提出了一种类似的神经架构搜索方法 NAS-FPN. 谷歌大脑借助神经架构搜索的优势, 使用增强学习选择最佳的交叉连接方式, 学习更好的目标检测特征金字塔网络架构 . NAS-FPN具有很高的准确率和延迟权衡. 但是问题在于这两种方式都难以解释或修改, 并且计算成本高, 对于NAS-FPN这种方式, 往往需要1000个小时的GPU / TPU小时才能确定最佳连接, 只有谷歌等少数计算资源很丰富的实验室才能做到.
PANet
FPN在实际应用中会面临高层级特征和较低层级特征之间的路径长的问题. 如在大型Backbone 如Resnet-152中, FPN低层信息经过多层网络到高层的时候, 由于路径过长导致部分低层级特征丢失, 然而低层级的特征对于大型实例的识别其实是很有用的. 我们需要一个能缩短低层级信息到高层级通过路径的方法.
PANet(Path Aggregation Network)为我们提供了解决这一问题的方式. PANet路径聚合网络首先被用在实例分割中, 随后YOLO V4也使用了PANET作为特征网络, 该网络添加自下而上的路径以增强FPN中的自上而下的路径, 缩短了低层级信息传输到高层级的路径, 并使用自适应功能池来捕获所有级别的信息, 将高层级丰富的语义特征与位于较低层的高分辨率特征图中的准确定位信息相结合. 除此之外,它使用上采样层与原始Backbone中的特征图横向连接, 以产生语义丰富的特征, 保留空间信息.
Simplified FPN and BiFPN
根据研究表明, PANET实际上在准确性上强于NAS-NET, 因此在应用领域, 更多人使用PANET, 但是PANET也有个问题, 它的计算成本也有点高, 为了实现优化的交叉链接, Efficient的作者对原始的PANET做了修改(图e/f).
Efficient的作者在研究中发现:
如果一个节点只有一个输入边并且没有特征融合, 那么它对特征网络的融合贡献较小, 这个节点可以删除(Simplified PANET)
如果原始输入与输出节点处于同一级别, 则在它们之间添加一条额外的连接路径, 以便在不增加成本的情况下融合更多功能(BiFPN). 这点其实跟skip connection很相似.
将每个双向(自上而下&自下而上)路径作为一个特征网络层, 并且重复叠加相同的特征网络层多次, 以实现更高层次的特征融合(BiFPN Layers). 具体重复几次是速度和精度之间的权衡, 因此会在下面的复合缩放部分介绍.
上图最右侧便是最终优化过后的特征网络BiFPN.
Weighted BiFPN
多尺度特征融合旨在聚合不同分辨率的特征. 尽管我们获得了优化的特征网络, 但是我们同样面临一个和之前的FPN, PANET一样的困境, 那就是特征融合阶段所有的节点输入权重都是均等的, 我们做的仅仅是简单的相加. 但实际上, 由于不同特征的分辨率不同, 这些特征对最终融合后输出特征的贡献通常是不相等的, 我们需要对不同特征节点的输入有所偏重, 然而手动分配权重繁琐且无法泛化, 因此我们可以用神经网络去训练权重的分配, 让网络自己学习最佳值.
EfficientDet的作者分析了三种加权特征融合方式.
1.无限融合
wᵢ是可学习的权重, 可以是特征标量也可以是通道矢量, 亦或是像素的多维张量. 但是由于这些权重是无界的, 因此可能导致训练不稳定.
2.基于Softmax的融合
在分类网络中我们了解到, 如果希望权重值在0-1的有界范围内, 最好的办法之一就是通过Softmax将这些值转换为概率分布, 其中的概率值代表权重的重要性. 但是Softmax的计算成本是高昂的, 那有没有更好的方式呢?
3.快速归一化融合
Relu是我们常用的激活函数, Relu的输出永远≥ 0, 再通过简单的正则化我们就可以将输出权重值控制在在0-1范围内. 这种方式相对前两种方式, 更加简单和高效, 因此EfficientDet中使用快速归一化融合特征网络. 下图是快速归一化融合的计算路径.
Compound Scaling
不同于Resnet系列只缩放Backbone网络, EfficientDet对EfficientNet, BiFPN,类和边界框预测网络这些模块同时进行复合缩放.
复合缩放是EfficientDet体系的核心, 很多人对这个概念有点空洞, 因此下文我会详细介绍这一块.
EfficientNet优化问题
复合缩放的目标是在任何给定的资源约束下最大化模型精度, 因此可以表述为优化问题.
我们使用resnet-34作为例子, 卷积层 i 可以用公式 )定义,
代表卷积操作,
表示输出张量,
表示输入张量,
表示输入张量的形状,
是feature map的尺寸,
是feature map的输入通道数。ConvNet层经常被划分为多个stages, 并且每个stage的所有层共享相同的结构.
因此ConvNet的结果Ñ可以表示为多个卷积模块的连续卷积:
我们最大化模型精度, 其实就是在有限的内存和算力限制下找出depth, width, resolution 的最佳组合.
那么是否在内存和算力限制内尽可能增大depth, width, resolution 就够了呢?
并不是. EfficientDet的作者通过研究发现, 对网络深度、宽度和分辨率中的任何尺度进行缩放都可以提高精度, 但是当模型足够大时, 这种放大的收益会减弱。由此可见改变单一维度的所带来的提升是有限的.
因此为了追求更好的准确性和效率, 在ConvNet缩放过程中平衡网络宽度, 深度和分辨率的所有维度至关重要.
EfficientNet复合缩放公式
与图像分类模型相比, 目标检测器的缩放比例要大得多, 因此对所有尺寸进行网格搜索非常昂贵.
过去目标检测模型的主干在有限资源下提高检测精度的方法, 要么如ResNet可以通过调整深度(ResNet18-ResNet 200), 要么如WideResNet和MobileNets通过对宽度(#channels)进行缩放实现. 当然提高更大的输入图像尺寸同样有利于提高精度. 对于机器学习研究人员来说, 探索所有这些可能性可能非常繁琐.
EfficientNet作者创新性提出了一种新的启发式复合缩放方法, 该方法使用复合系数φ对网络宽度, 深度和分辨率进行均匀缩放. 其中α, β, γ是可以通过小网格搜索确定的常数. φ是用户指定的系数, 控制用于模型缩放的资源数量.
FLOPS是floating point operations per second的缩写, 意指每秒浮点运算次数, 理解为计算速度. 是一个衡量硬件性能的指标. 我们假设我们能使用的FLOPS是2.
a. 对于网络模型depth来说, 加倍深度会使得FLOPS加倍.
b. 对于网络模型width来说, 由于width(#channel)的增加导致卷积计算的路径平方级增加, 因此加倍宽度会使得FLOPS加4倍.
c. 对于网络模型resolution来说, 和width的情况一样, 由于resolution的增加会导致feather map呈现平方级扩张, 因此加倍图像分辨率也会使得FLOPS加4倍.
综合a, b, c中的理论我们可以得到复合缩放公式: 缩放ConvNet将使总FLOPS大约增加
在此约束下, 我们通过小网格搜索获得α=1.2, β=1.1, γ=1.15.
这仅仅是baseline, 从EfficientNet-B0开始, 我们可以应用复合缩放方法对其进行放大.
ϕ 0-6, EfficientNet从B0扩展到B6, 由于ϕ=7 需要的计算资源过于庞大, 因此EfficientNet-B7 只对resolution进行了增加. 值得注意的是在EfficientDet中需要使用相同的EfficientNet-B0到B6的宽度/深度缩放系数, 从而方便的使用ImageNet预训练的检查点.
其他模块复合缩放公式
我们已经设计了Backbone的缩放模式, 接下来我们需要设计BiFPN, Box/Class prediction和输入图像分辨率的缩放.
a. BiFPN: 像在EfficientNets中一样以指数方式增长BiFPN宽度(channels), 但是由于深度需要四舍五入为小整数, 因此线性增加了深度(layers)
b. Box/Class 预测网络: 宽度保持与BiFPN相同, 但深度(layers)线性增加.
c. 输入图像分辨率: 由于BiFPN中使用了特征级别3–7, 因此输入分辨率必须可除以2⁷= 128, 因此我们使用以下公式线性提高分辨率:
下图是复合缩放的总结图:
通过改变公式a, b, c中的ϕ(0-6), 作者得到了以下不同计算量和参数量的8个模型, 由于ϕ≥7的模型过于庞大, 因此D7相对D6值增加了图像分辨率.
EfficientDet evaluation
EfficientDet的优点
EfficientDet模型在COCO数据集上, 对100000个图像大致170个图像类别进行预测, 实验结果表明, 其精度与速度全面领先于YOLO V3, MaskRCNN, RentinaNet, NAS-FPN这些常见目标检测模型.
下图是EfficientDet以FLOPS为函数的benchmark.
我们可以看到, 在类似的mAP下, EfficientDet 的 FLOPS 仅为 YOLOv3 的 1/28, RetinaNet 的 1/16, NAS-FPN 的 1/9.3. 在都使用单个模型和单一测试时间尺度的前提下, EfficientDet-D7 以 52M 的参数量和 326B FLOPS, 获得了当前最优性能 51.0 mAP, 超出之前最优模型 0.3%, 而且其规模和 FLOPS 分别是之前最优模型的 1/4 和 1/9.3.
此外, EfficientDet 模型在 GPU 和 CPU 上的计算速度分别是之前检测器的 2-3 倍和 5-8 倍.
EfficientDet的不足
EfficientDet使用神经网络搜索最优架构的优势, 同样使它的不足. 因为EfficientDet的预训练成本是巨大的, EfficientDet的作者使用 32 个V3 TPU 在batch_size为128的数据集上训练, 才达到各项SOTA的成绩. 而普通人拥有的硬件资源是有限的, 从0开始训练完整模型需要的时间和硬件成本过高.
当然我们也可以用时间换资源, 用少量的资源通过训练更长的时间来达到相同的精度.
但是实际上根据MegDet的研究表明, 用时间换成本的方式可以接近但是很难达到相似的精度.
上图是"MegDet: A Large Mini-Batch Object Detector"的作者使用16-batch(8 Gpus), 256-batch(128 Gpus) 两种不同的硬件资源在COCO数据集上训练的同一FPN对象检测器的测试. 结果显示GPU用的越多, 会让目标检测器训练的更快更准, 相比于少量GPU甚至单GPU的训练资源, 其训练速度快了近一个数量级.
Conclusion
EfficientDet除了在速度和精度的提升, 还探索了Backbone, BiFPN, Box/Class prediction和input image resolution的最佳参数组合, 提供了在不同资源约束下的最佳目标检测器选项, 帮机器学习研究人员省了很多"炼丹"的时间, 虽然在有限的算力下要达到论文相同的精度很难, 但是基于官方提供的预训练的权重可以很方便的迁移学习到其他的目标检测实例, 真的很值得推荐.
Email: williamhyin@outlook.com
知乎专栏自动驾驶全栈工程师:https://zhuanlan.zhihu.com/williamhyin
重磅!DLer-计算机视觉交流2群已成立!
大家好,这是DLer-计算机视觉微信交流2群!首先非常感谢大家的支持和鼓励,我们的计算机视觉交流群正在不断扩大人员规模!希望以后能提供更多的资源福利给到大家!欢迎各位Cver加入DLer-计算机视觉微信交流大家庭 。
本群旨在学习交流图像分类、目标检测、目标跟踪、点云与语义分割、GAN、超分辨率、人脸检测与识别、动作行为与时空运动、模型压缩和量化剪枝、迁移学习、人体姿态估计等内容。希望能给大家提供一个更精准的研讨交流平台!!!
进群请备注:研究方向+学校/公司+昵称(如图像分类+上交+小明)
???? 长按识别添加,即可进群!