题目:《EfficientDet: Scalable and Efficient Object Detection》
论文地址: https://arxiv.org/pdf/1911.09070.pdf
代码地址: https://github.com/bubbliiiing/efficientdet-pytorch
Google Brain团队在CVPR 2020上提出了新架构EfficientDet目标检测模型,结合EfficientNet和新提出的BiFPN,实现新的SOTA结果。EfficientDet更重要的贡献是将EfficientNet复合缩放的思路进行延伸, 把架构决策明确化为可扩展的框架, 并且为不同的应用场景提供了D0-D7种方案, 实现了速度和精度之间的均衡, 使用者无需复杂调参, 便能轻松应用于对象检测中的其他用例。EfficientDet-D7的性能更是非常的惊人,在326B FLOPS,参数量52M的情况下,COCO 2017 validation数据集上取得了51.0的mAP,和AmoebaNet+NAS-FPN相比,FLOPS仅为其十分之一的情况下取得了更好的结果。
贡献:
先来探讨几个特征网络
FPN
通过横向连接将自下而上的路径与自上而下的路径进行组合来实现高低层级特征的融合。
Fully-connected FPN
使用全连接层神经网络训练的特征网络。
NAS-FPN
使用神经架构搜索方法自动设计特征网络的架构,具有很高的准确率和延迟权衡。
Fully-connected FPN和NAS-FPN计算成本高,非常耗时、而且设备要求很高。
PANet
在FPN的自上而下的路径后,添加了自下而上的路径来缩短低层级信息传输到高层级的路径,防止路径过长导致低层特征丢失。并使用自适应功能池来捕获所有级别的信息, 将高层级丰富的语义特征与位于较低层的高分辨率特征图中的准确定位信息相结合。除此之外,它使用上采样层与原始Backbone中的特征图横向连接, 以产生语义丰富的特征,保留空间信息。
PANet实际上在准确性上强于NAS-Net, 因此在应用领域,更多人使用PANet,但是PANet的参数和计算量更多,它的计算成本也有点高。
Simplified PANet
为了实现优化的交叉链接,作者对PANet进行修改:如果一个节点只有一个输入边并且没有特征融合, 那么它对特征网络的融合贡献较小,这个节点就可以删除。
在Simplified PANet基础上,(a)如果原始输入与输出节点处于同一级别,则在它们之间添加一条额外的连接路径,以便在不增加成本的情况下融合更多功能(BiFPN),这点其实跟skip connection很相似。(b)将每个双向(自上而下&自下而上)路径作为一个特征网络层,并且重复叠加相同的特征网络层多次,以实现更高层次的特征融合(BiFPN Layers)。具体重复几次是速度和精度之间的权衡,因此会在下面的Compound scaling复合缩放部分介绍,最终优化后的BiFPN如上图右图所示。
多尺度特征融合旨在聚合不同分辨率的特征。尽管我们获得了优化的特征网络,但是我们同样面临一个和之前的FPN,PANET一样的困境,那就是特征融合阶段所有的节点输入权重都是均等的,我们做的仅仅是简单的相加。但实际上,由于不同特征的分辨率不同,这些特征对最终融合后输出特征的贡献通常是不相等的,我们需要对不同特征节点的输入有所偏重,然而手动分配权重繁琐且无法泛化,因此我们可以用神经网络去训练权重的分配,让网络自己学习最佳值。
作者分析了三种加权特征融合方式:
(1)通过EfficientNet作为backbone提取每一层的特征图,两次下采样获得P6、P7,P3、P4、P5通过1×1卷积调整通道数,这样就得到了P1_in、P2_in、P3_in、P4_in、P5_in、P6_in、P7_in。
注意,在构建BiFPN的第一步时,需要构建两个P4_in和P5_in
(2)对P7_in进行上采样(为了使P7_in与P6_in的shape相等),上采样后与P6_in融合,然后再使用3×3卷积(为了消除上采样的混叠效应),得到P6_td;对P6_td进行上采样,上采样后与P5_in1融合,然后再使用3×3卷积,得到P5_td;对P5_td进行上采样,上采样后与P4_in1融合,然后再使用3×3卷积,得到P4_td;对P4_td进行上采样,上采样后与P3_in融合,然后再使用3×3卷积,得到P3_out。
(3)对P3_out进行下采样,下采样后与P4_td、P4_in2融合,然后再使用3×3卷积,得到P4_out;对P4_out进行下采样,下采样后与P5_td、P5_in2融合,然后再使用3×3卷积,得到P5_out;对P5_out进行下采样,下采样后与P6_td、P6_in融合,然后再使用3×3卷积,得到P6_out;对P6_out进行下采样,下采样后与P7_in融合,然后再使用3×3卷积,得到P7_out。
(4)将获得的P3_out、P4_out、P5_out、P6_out、P7_out作为P3_in、P4_in、P5_in、P6_in、P7_in,重复步骤2、3即可。
注意:此时P4_in1、P4_in2不需要分开,P5同理。对于EffiicientDet B0来讲,还需要重复2次。
使用复合系数φ对网络宽度,深度和分辨率进行均匀缩放。其中α,β,γ是可以通过小网格搜索确定的常数。φ是用户指定的系数,控制用于模型缩放的资源数量。下图是不同模块的复合缩放的总结图:
通过改变公式a,b,c中的ϕ(0-6),作者得到了以下不同计算量和参数量的8个模型,如下表所示。由于ϕ≥7的模型过于庞大, 因此D7相对D6值只是增加了图像分辨率。
下图展示了整个EfficientDet网络结构,很大程度遵循了one stage。使用ImageNet数据集的预训练网络EfficientNets作为backbone;提出的BiFPN作为特征网络,它从backbone的第3-7层获取特征(P3、P4、P5、P6、P7)并且重复使用自上而下和自下而上的双向特征融合;这些融合后的特征被送入了分类和边界框回归网络来生成目标类别和预测的boundingbox。分类和边界框回归网络权重在所有层的特征之间共享。
相关内容参考up主:Bubbliiiing的博客,以EfficientNet-B0和EfficientDet-D0为例,进行EfficientDet的解析。
主干网络
EfficientDet采用EfficientNet作为主干特征提取网络。EfficientNet-B0对应EfficientDet-D0;EfficientNet-B1对应EfficientDet-D1;以此类推。由复合缩放表格可知,以EfficientNet-B0作为backbone时,EfficientDet-D0的输入图像大小是512×512×3。
BiFPN加强特征提取
根据3.3BiFPN的构建过程,我们获得了P3_out、P4_out、P5_out、P6_out、P7_out,为了和普通层区分我们称之为有效特征层。
从特征层获取预测结果
将获得五个有效特征层通过ClassNet+BoxNet就可以获得预测结果。对于EfficientDet-D0来说:
后处理
得到最终的预测结果还要进行得分排序与非极大抑制筛选(这部分基本是所有目标检测通用的部分)
(1)正负样本匹配:
把和真实框重合程度在0.5以上的作为正样本,在0.4以下的作为负样本,在0.4和0.5之间的作为忽略样本。
(2)计算损失Loss(Loss分为两个部分):
参考原论文或者博文:https://blog.csdn.net/williamhyin/article/details/108331279?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166028482916781667868960%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166028482916781667868960&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-2-108331279-null-null.142v40pc_search_integral,185v2control&utm_term=EfficientDet&spm=1018.2226.3001.4187