盘点⽬标检测中的特征融合技巧(根据YOLOv4总结)
来源|AI算法修炼营
在深度学习的很多⼯作中(例如⽬标检测、图像分割),融合不同尺度的特征是提⾼性能的⼀
个重要⼿段。低层特征分辨率更⾼,包含更多位置、细节信息,但是由于经过的卷积更少,其
语义性更低,噪声更多。⾼层特征具有更强的语义信息,但是分辨率很低,对细节的感知能⼒
较差。如何将两者⾼效融合,取其长处,弃之糟粕,是改善分割模型的关键。
特征融合分类
很多⼯作通过融合多层来提升检测和分割的性能,按照融合与预测的先后顺序,分类为早融合
(Early fusion)和晚融合(Late fusion)。
早融合(Early fusion): 先融合多层的特征,然后在融合后的特征上训练预测器(只在完全融合之
后,才统⼀进⾏检测)。这类⽅法也被称为skip connection,即采⽤concat、add操作。这⼀思
路的代表是Inside-Outside Net(ION)和HyperNet。两个经典的特征融合⽅法:
(1)concat:系列特征融合,直接将两个特征进⾏连接。两个输⼊特征x和y的维数若为p和q,
输出特征z的维数为p+q;
(2)add:并⾏策略,将这两个特征向量组合成复向量,对于输⼊特征x和y,z = x + iy,其中i
是虚数单位。
晚融合(Late fusion):通过结合不同层的检测结果改进检测性能(尚未完成最终的融合之前,在
部分融合的层上就开始进⾏检测,会有多层的检测,最终将多个检测结果进⾏融合)。这⼀类
瑜伽培训多少钱研究思路的代表有两种:
(1)feature不融合,多尺度的feture分别进⾏预测,然后对预测结果进⾏综合,如Single Shot
MultiBox Detector (SSD) , Multi-scale CNN(MS-CNN)
(2)feature进⾏⾦字塔融合,融合后进⾏预测,如Feature Pyramid Network(FPN)等。
接下来,主要对晚融合⽅法进⾏归纳总结。
Feature Pyramid Network(FPN)
论⽂地址:Feature Pyramid Networks for Object Detectionarxiv
FPN(Feature Pyramid Network)算法同时利⽤低层特征⾼分辨率和⾼层特征的⾼语义信息,
通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进⾏
的,这和常规的特征融合⽅式不同。
FPN将深层信息上采样,与浅层信息逐元素地相加,从⽽构建了尺⼨不同的特征⾦字塔结构,
性能优越,现已成为⽬标检测算法的⼀个标准组件。FPN的结构如下所⽰:
1、⾃下⽽上:最左侧为普通的卷积⽹络,默认使⽤ResNet结构,⽤作提取语义信息。C1代表
了ResNet的前⼏个卷积与池化层,⽽C2⾄C5分别为不同的ResNet卷积组,这些卷积组包含了
多个Bottleneck结构,组内的特征图⼤⼩相同,组间⼤⼩递减。
2、⾃上⽽下:⾸先对C5进⾏1×1卷积降低通道数得到P5,然后依次进⾏上采样得到P4、P3和
P2,⽬的是得到与C4、C3与C2长宽相同的特征,以⽅便下⼀步进⾏逐元素相加。这⾥采⽤2倍
最邻近上采样,即直接对临近元素进⾏复制,⽽⾮线性插值。
3、横向连接(Lateral Connection):⽬的是为了将上采样后的⾼语义特征与浅层的定位细节
特征进⾏融合。⾼语义特征经过上采样后,其长宽与对应的浅层特征相同,⽽通道数固定为
256,因此需要对底层特征C2⾄C4进⾏11卷积使得其通道数变为256,然后两者进⾏逐元素相
加得到P4、P3与P2。由于C1的特征图尺⼨较⼤且语义信息不⾜,因此没有把C1放到横向连接
中。
4、卷积融合:在得到相加后的特征后,利⽤3×3卷积对⽣成的P2⾄P4再进⾏融合,⽬的是消除
上采样过程带来的重叠效应,以⽣成最终的特征图。
FPN对于不同⼤⼩的RoI,使⽤不同的特征图,⼤尺度的RoI在深层的特征图上进⾏提取,如
P5,⼩尺度的RoI在浅层的特征图上进⾏提取,如P2。FPN的代码实现如下:
as functional as Fimport mathclass Bottleneck(nn.Module): expansion = 4 def
__init__(lf, in_planes, planes, stride=1, downsample=None): super(Bottleneck, lf).__init__() lf.bottleneck =
nn.Sequential( nn.Conv2d(in_planes, planes, 1, bias=Fal), nn.BatchNorm2d(planes), nn.ReLU(inplace=True),
nn.Conv2d(planes, planes, 3, stride, 1, bias=Fal), nn.BatchNorm2d(planes), nn.ReLU(inplace=True),
nn.Conv2d(planes, lf.expansion * planes, 1, bias=Fal), nn.pansion * planes), ) lf.relu =
nn.ReLU(inplace=True) lf.downsample = downsample def forward(lf, x): identity = x out = lf.bottleneck(x) if
广州好玩的
lf.downsample is not None: identity = lf.downsample(x) out += identity out = lf.relu(out) return outclass
FPN(nn.Module): def __init__(lf, layers): super(FPN, lf).__init__() lf.inplanes = v1 = nn.Conv2d(3,
64, 7, 2, 3, bias=Fal) lf.bn1 = nn.BatchNorm2d(64) lf.relu = nn.ReLU(inplace=True) lf.maxpool =
nn.MaxPool2d(3, 2, 1) lf.layer1 = lf._make_layer(64, layers[0]) lf.layer2 = lf._make_layer(128, layers[1], 2)
lf.layer3 = lf._make_layer(256, layers[2], 2) lf.layer4 = lf._make_layer(512, layers[3], 2) lf.toplayer =
nn.Conv2d(2048, 256, 1, 1, 0) lf.smooth1 = nn.Conv2d(256, 256, 3, 1, 1) lf.smooth2 = nn.Conv2d(256, 256, 3,
1, 1) lf.smooth3 = nn.Conv2d(256, 256, 3, 1, 1) lf.latlayer1 = nn.Conv2d(1024, 256, 1, 1, 0) lf.latlayer2 =
nn.Conv2d( 512, 256, 1, 1, 0) lf.latlayer3 = nn.Conv2d( 256, 256, 1, 1, 0) def _make_layer(lf, planes, blocks, stride=1): downsample = None if stride != 1 or lf.inplanes != pansion * planes: downsample =
nn.Sequential( nn.Conv2d(lf.inplanes, pansion * planes, 1, stride, bias=Fal),
nn.pansion * planes) ) layers = [] layers.append(Bottleneck(lf.inplanes, planes, stride, downsample)) lf.inplanes = planes * pansion for i in range(1, blocks):
layers.append(Bottleneck(lf.inplanes, planes)) return nn.Sequential(*layers) def _upsample_add(lf, x, y):
_,_,H,W = y.shape return F.upsample(x, size=(H,W), mode='bilinear') + y def forward(lf, x): c1 =
lf.lu(lf.v1(x)))) c2 = lf.layer1(c1) c3 = lf.layer2(c2) c4 = lf.layer3(c3) c5 = lf.layer4(c4) p5 = lf.toplayer(c5) p4 = lf._upsample_add(p5, lf.latlayer1(c4)) p3 = lf._upsample_add(p4, lf.latlayer2(c3)) p2 = lf._upsample_add(p3, lf.latlayer3(c2)) p4 = lf.smooth1(p4) p3 = lf.smooth2(p3) p2 = lf.smooth3(p2) return p2, p3, p4, p5
PANet(Path Aggregation Network)
论⽂地址:Path Aggregation Network for Instance Segmentationarxiv
家规家训手抄报
代码地址:/
1、缩短信息路径和⽤低层级的准确定位信息增强特征⾦字塔,创建了⾃下⽽上的路径增强
2、为了恢复每个建议区域和所有特征层级之间被破坏的信息,作者开发了适应性特征池化(adaptive feature pooling)技术,可以将所有特征层级中的特征整合到每个建议区域中,避免了任意分配的结果。
3、全连接融合层:使⽤⼀个⼩型fc层⽤于补充mask预测
⾃下⽽上的路径增强
Bottom-up Path Augemtation的提出主要是考虑到⽹络的浅层特征对于实例分割⾮常重要,不难想到浅层特征中包含⼤量边缘形状等特征,这对实例分割这种像素级别的分类任务是起到⾄关重要的作⽤的。因此,为了保留更多的浅层特征,论⽂引⼊了Bottom-up Path Augemtation。
红⾊的箭头表⽰在FPN中,因为要⾛⾃底向上的过程,浅层的特征传递到顶层需要经过⼏⼗个甚⾄上百个⽹络层,当然这取决于BackBone⽹络⽤的什么,因此经过这么多层传递之后,浅层的特征信息丢失就会⽐较严重。
绿⾊的箭头表作者添加了⼀个Bottom-up Path Augemtation结构,这个结构本⾝不到10层,这样浅层特征经过原始FPN中的横向连接到P2然后再从P2沿着Bottom-up Path Augemtation传递到顶层,经过的层数不到10层,能较好的保存浅层特征信息。注意,这⾥的N2和P2表⽰同⼀个特征图。但N3,N4,N5和P3,P4,P5不⼀样,实际上N3,N4,N5是P3,P4,P5融合后的结果。Bottom-up Path Augemtation的详细结构如下图所⽰,经过⼀个尺⼨为,步长为的卷积之后,特征图尺⼨减⼩为原来的⼀半然后和这个特征图做add操作,得到的结果再经过⼀个卷积核尺⼨为,的卷积层得到。
Bottom-up Path Augemtation详细结构
适应性特征池化(adaptive feature pooling)
论⽂指出,在Faster-RCNN系列的标检测或分割算法中,RPN⽹络得到的ROI需要经过ROI Pooling或ROI Align提取ROI特征,这⼀步操作中每个ROI所基于的特征都是单层特征,FPN同样也是基于单层特征,因为检测头是分别接在每个尺度上的。
本⽂提出的Adaptive Feature Pooling则是将单层特征换成多层特征,即每个ROI需要和多层特征(论⽂中是4层)做ROI Align的操作,然后将得到的不同层的ROI特征融合在⼀起,这样每个ROI特征就融合了多层特征。
RPN⽹络获得的每个ROI都要分别和特征层做ROI Align操作,这样个ROI就提取到4个不同的特征图,然后将4个不同的特征图融合在⼀起就得到最终的特征,后续的分类和回归都是基于此最终的特征进⾏。
全连接融合层(Fully-Connected Fusion)
全连接融合层对原有的分割⽀路(FCN)引⼊⼀个前景⼆分类的全连接⽀路,通过融合这两条⽀路的输出得到更加精确的分割结果。这个模块的具体实现如图所⽰。
从图中可以看到这个结构主要是在原始的Mask⽀路(即带deconv那条⽀路)的基础上增加了下⾯那个⽀路做融合。增加的这个⽀路包含个的卷积层,然后接⼀个全连接层,再经过reshape操作得到维度和上⾯⽀路相同的前背景Mask,即是说下⾯这个⽀路做的就是前景和背景的⼆分类,输出维度类似于⽂中说的。⽽上⾯的⽀路输出维度类似,其中代表数据集⽬标类别数。最终,这两条⽀路的输出Mask做融合以获得更加精细的最终结果。
MLFPN
MLFPN来⾃《M2det: A single-shot object detector bad on multi-level feature pyramid network》。
论⽂地址:M2Det: A Single-Shot Object Detector bad on Multi-Level Feature Pyramid Networkarxiv
代码地址:/
之前的特征⾦字塔⽬标检测⽹络共有的两个问题是:
1、原本 backbone 是⽤于⽬标分类的⽹络,导致⽤于⽬标检测的语义特征不⾜;
2、每个⽤于⽬标检测的特征层主要或者仅仅是由单级特征层(single-level layers)构成,也就是仅仅包含了单级信息;
这种思想导致⼀个很严重的问题,对分类⼦⽹络来说更深更⾼的层更容易区分,对定位的回归任务来说使⽤更低更浅的层⽐较好。此外,底层特征更适合描述具有简单外观的⽬标,⽽⾼层特征更适合描述具有复杂外观的⽬标。在实际中,具有相似⼤⼩⽬标实例的外观可能⾮常不同。例如⼀个交通灯和⼀个远距离的⼈可能具有可以⽐较的尺⼨,但是⼈的外表更加复杂。因此,⾦字塔中的每个特征图主要或者仅仅由单层特征构成可能会导致次优的检测性能。
为了更好地解决⽬标检测中尺度变化带来的问题,M2det提出⼀种更有效的特征⾦字塔结构MLFPN,其⼤致流程如下图所⽰:⾸先,对主⼲⽹络提取到的特征进⾏融合;然后通过TUM和FFM提取更有代表性的Multi-level&Mutli-scale特征;最后通过SFAM融合多级特征,得到多级特征⾦字塔⽤于最终阶段的预测。M2Det使⽤主⼲⽹络+MLFPN来提取图像特征,然后采⽤类似SSD的⽅式预测密集的包围框和类别得分,通过NMS得到最后的检测结果。
如上图所⽰,MLFPN主要由3个模块组成:
1)特征融合模块FFM;
2)细化U型模块TUM;
3)尺度特征聚合模块SFAM.
⾸先, FFMv1对主⼲⽹络提取到的浅层和深层特征进⾏融合,得到ba feature;
其次,堆叠多个TUM和FFMv2,每个TUM可以产⽣多个不同scale的feature map,每个FFMv2融合ba feature和上⼀个TUM的输出,并给到下⼀个TUM作为输⼊(更⾼level)。
最后,SFAM通过scale-wi拼接和channel-wi attention来聚合multi-level&multi-scale的特征。
霸气的群名称特征融合模块FFM
FFM⽤于融合M2Det中不同级别的特征,先通过1x1卷积压缩通道数,再进⾏拼接。
FFM1 ⽤于融合深层和和浅层特征,为 MLFPN 提供基本输⼊的特征层(Ba Feature);由于M2Det 使⽤了 VGG 作为 backbone,因此 FFM1 取出了 Conv4_3 和 Conv5_3 作为输⼊:FFMv1使⽤两种不同scale的feature map作为输⼊,所以在拼接操作之前加⼊了上采样操作来调整⼤⼩;圣床
FFMv2⽤于融合 MLFPN 的基本输⼊(Ba Feature)和上⼀个 TUM 模块的输出,两个输⼊的scale相同,所以⽐较简单。
细化U型模块TUM
TUM使⽤了⽐FPN和RetinaNet更薄的U型⽹络。在上采样和元素相加操作之后加上1x1卷积来加强学习能⼒和保持特征平滑度。TUM中每个解码器的输出共同构成了该TUM的multi-scale输出。每个TUM的输出共同构成了multi-level&multi-scale特征,前⾯的TUM提供low level feature,后⾯的TUM提供high level feature。
TUM 的编码器(encoder)使⽤ 3×3 ⼤⼩、步长为 2 的卷积层进⾏特征提取,特征图不断缩⼩;解码器(decoder)同过双线性插值的⽅法将特征图放⼤回原⼤⼩。
尺度特征聚合模块SFAM
SFAM旨在聚合TUMs产⽣的多级多尺度特征,以构造⼀个多级特征⾦字塔。在first
stage,SFAM沿着channel维度将拥有相同scale的feature map进⾏拼接,这样得到的每个scale 的特征都包含了多个level的信息。然后在cond stage,借鉴SENet的思想,加⼊channel-wi attention,以更好地捕捉有⽤的特征。SFAM的细节如下图所⽰:
⽹络配置
M2Det的主⼲⽹络采⽤VGG-16和ResNet-101。精益建造
MLFPN的默认配置包含有8个TUM,每个TUM包含5个跨步卷积核5个上采样操作,所以每个TUM的输出包含了6个不同scale的特征。
在检测阶段,为6组⾦字塔特征每组后⾯添加两个卷积层,以分别实现位置回归和分类。
后处理阶段,使⽤soft-NMS来过滤⽆⽤的包围框。
ASFF:⾃适应特征融合⽅式
ASFF来⾃论⽂:《Learning Spatial Fusion for Single-Shot Object Detection》,也就是著名的yolov3-asff。
论⽂地址:arxiv/pdf/1911.09516.pdfarxiv
代码地址:
⾦字塔特征表⽰法(FPN)是解决⽬标检测尺度变化挑战的常⽤⽅法。但是,对于基于FPN的单级检测器来说,不同特征尺度之间的不⼀致是其主要限制。因此这篇论⽂提出了⼀种新的数据驱动的⾦字塔特征融合⽅式,称之为⾃适应空间特征融合(ASFF)。它学习了在空间上过滤冲突信息以抑制梯度反传的时候不⼀致的⽅法,从⽽改善了特征的⽐例不变性,并且推理开销降低。借助ASFF策略和可靠的YOLOV3 BaLine,在COCO数据集上实现了45FPS/42.4%AP以及29FPS/43.9%AP。
ASFF简要思想就是:原来的FPN add⽅式现在变成了add基础上多了⼀个可学习系数,该参数是⾃动学习的,可以实现⾃适应融合效果,类似于全连接参数。
以ASFF-3为例,图中的绿⾊框描述了如何将特征进⾏融合,其中X1,X2,X3分别为来⾃level,level2,level3的特征,与为来⾃不同层的特征乘上权重参数α3,β3和γ3并相加,就能得到新的融合特征ASFF-3,如下⾯公式所⽰:
因为采⽤相加的⽅式,所以需要相加时的level1~3层输出的特征⼤⼩相同,且通道数也要相同,需要对不同层的feature做upsample或downsample并调整通道数。对于需要upsample的层,⽐如想得到ASFF3,需要将level1调整⾄和level3尺⼨⼀致,采⽤的⽅式是先通过1×1卷积调整到与level3通道数⼀致,再⽤插值的⽅式resize到相同⼤⼩;⽽对于需要downsample的层,⽐如想得到ASFF1,此时对于level2到level1只需要⽤⼀个3×3,stride=2的卷积就可以了,如果是level3到level1则需要在3×3卷积的基础上再加⼀个stride=2的maxpooling,这样就能调整level3和level1尺⼨⼀致。
对于权重参数α,β和γ,则是通过resize后的level1~level3的特征图经过1×1的卷积得到的。并且参数α,β和γ经过concat之后通过softmax使得他们的范围都在[0,1]内并且和为1:
具体步骤可以概况为:
1、⾸先对于第l级特征图输出cxhxw,对其余特征图进⾏上下采样操作,得到同样⼤⼩和channel的特征图,⽅便后续融合
2、对处理后的3个层级特征图输出,输⼊到1x1xn的卷积中(n是预先设定的),得到3个空间权重向量,每个⼤⼩是nxhxw
3、然后通道⽅向拼接得到3nxhxw的权重融合图
4、为了得到通道为3的权重图,对上述特征图采⽤1x1x3的卷积,得到3xhxw的权重向量
5、在通道⽅向softmax操作,进⾏归⼀化,将3个向量乘加到3个特征图上⾯,得到融合后的cxhxw特征图
6、采⽤3x3卷积得到输出通道为256的预测输出层
为什么ASFF有效?
⽂章通过梯度和反向传播来解释为什么ASFF会有效。⾸先以最基本的YOLOv3为例,加⼊FPN 后通过链式法则我们知道在backward的时候梯度是这样计算的:
其中因为不同尺度的层之间的尺度变换⽆⾮就是up-sampling或者down-sampling,因此
这⼀项通常为固定值,为了简化表达式我们可以设置为1,,则上⾯的式⼦变成了:
进⼀步的,
这⼀项相当于对输出特征的activation操作,其导数也将为固定值,同理,我们可以将他们的值简化为1,则表达式进⼀步简化成了:
假设level1(i,j)对应位置feature map上刚好有物体并且为正样本,那其他level上对应(i,j)位置上可能刚好为负样本,这样反传过程中梯度既包含了正样本⼜包含了负样本,这种不连续性会对梯度结果造成⼲扰,并且降低训练的效率。⽽通过ASFF的⽅式,反传的梯度表达式就变成了:
我们可以通过权重参数来控制,⽐如刚才那种情况,另α2和α3=0,则负样本的梯度不会结果造成⼲扰。另外这也解释了为什么特征融合的权重参数来源于输出特征+卷积,因为融合的权重参数和特征是息息相关的。
Bi-FPN
BiFPN来⾃论⽂:《EfficientDet: Scalable and efficient object detection 》。BiFPN思想和ASFF⾮常类似,也是可学习参数的⾃适应加权融合,但是⽐ASFF更加复杂。
论⽂地址:Scale-Aware Trident Networks for Object Detectionarxiv
代码地址:
(google官⽅)
(⾼星PyTorch复现)
EfficientDet的⽅法论和创新性围绕两个关键挑战:
1、更好地融合多层特征。这个⽏庸置疑,肯定是从 FPN 发展过来的,⾄于 Bi就是双向,原始的FPN实现的⾃顶向下(top-down)融合,所谓的BiFPN就是两条路线既有top-down也有down-top。在融合过程中,之前的⼀些模型⽅法没有考虑到各级特征对融合后特征的g共享度问题,即之前模型认为各级特征的贡献度相同,⽽本⽂作者认为它们的分辨率不同,其对融合后特征的贡献度不同,因此在特征融合阶段引⼊了weight。
2、模型缩放。这个主要灵感来⾃于 EfficientNet,即在基线⽹络上同时对多个维度进⾏缩放(⼀般都是放⼤),这⾥的维度体现在主⼲⽹络、特征⽹络、以及分类/回归⽹络全流程的整体架构上整体⽹络由主⼲⽹络、特征⽹络以及分类/回归⽹络组成,可以缩放的维度⽐ EfficientNet 多得多,所以⽤⽹络搜索⽅式不合适了,作者提出⼀些启发式⽅法。
BiFPN
BiFPN的思想其实是基于路径增强FPN(PANet)的思想,在⾃顶向下特征融合之后紧接着⾃底向上再融合⼀遍。在图2中⽂章列举了三类FPN以及BiFPN。图2(a) 是传统FPN,图2(b)是PANet,图2(c)是利⽤⽹络⾃动搜索的⽅式⽣成的不规则特征融合模块,且这个模块可以重复叠加使⽤【即堆叠同样的模块,不停地使⽤相同的结构融合多层特征】。可以看到,PANet可以看做⼀个naïve的双向FPN。
BiFPN针对PANet的改进点主要有三个:
1、削减了⼀些边。BiFPN删除了只有⼀个⼊度的节点,因为这个节点和前⼀个节点的信息是相同的【因为没有别的新的信息传进来】,这样就祛除了⼀些冗余计算。
薯片的英语
2、增加了⼀些边。BiFPN增加了⼀些跳跃连接【可以理解为residual连接,图2(d)中横向曲线3个连接】,这些连接由同⼀层的原始特征节点【即没有经历⾃顶向下融合的特征】连接到输出节点【参与⾃底向上特征融合】。
3、将⾃顶向下和⾃底向上融合构造为⼀个模块,使其可以重复堆叠,增强信息融合【有了⼀种递归神经⽹络的赶脚】。PANet只有⼀层⾃顶向下和⼀层⾃底向上。
⽽对于特征融合的计算,BiFPN也做了改进。传统融合计算⼀般就是把输⼊特征图resize到相同尺⼨然后相加【或相乘,或拼接】。但是BiFPN考虑到不同特征的贡献可能不同,所以考虑对输⼊特征加权。⽂章中把作者们对如何加权的探索过程也列了出来。
1、⾸先尝试简单加权相加,对权值不做约束。这样得到的实验结果还可以,但是没有约束的权值会造成训练困难和崩溃。
2、然后为了归⼀化权值,作者尝试了⽤softmax操作把权值归⼀化到[0, 1]。虽然达到了归⼀化效果,
但是softmax极⼤增加了GPU计算负担。
3、最后,回归本质,不整什么指数计算了。直接权值除以所有权值加和(分母加了⼀个极⼩量防⽌除0)来归⼀化【也就是计算权值在整个权值中的⽐例】,同样把权值归⼀化到[0,1],性能并没有下降,还增加了计算速度。
BiFPN介绍的最后,作者还提醒⼤家注意在特征融合模块⾥为了进⼀步提⾼计算效率,卷积使⽤的是逐深度卷积【就是每个通道⾃成⼀个分组】,并在每个卷积之后加了BN和激活函数。EfficientDet
EfficientDet使⽤在imagenet上预训练的EfficientNet作为backbone模型,并对⽹络中第3到第7层特征进⾏了BiFPN特征融合,⽤来检测和分类。
EfficientDet同样对模型进⾏了缩放。与EfficientNet对传统提升模型尺度⽅法的态度⼀样,⽂章认为传统提升模型尺度指⽰简单地针对单⼀维度【深度,宽度或分辨率】进⾏增加,⽽EfficientNet提出的符合缩放才是真⾹。EfficientDet提出了⾃⼰的符合缩放,要联合对backbone,BiFPN,预测模块,和输⼊分辨率进⾏缩放。然⽽仅仅对EfficientNet本⾝缩放的参数进⾏⽹格搜索就已经很贵了,对所有⽹络的所有维度进⾏⽹格搜索显然也是不可承受之重。所以EfficientDet⽤了⼀个“启发式”⽅法【在我看来是对每个⽹络的每个维度⾃定了⼀些简单的规则⽽已】。
Backbone依然遵循EfficientNet。我哭得好无力
BiFPN的深度随系数ϕ线性增长,宽度随ϕ指数增长。⽽对宽度指数的底做了⼀个⽹格搜索,确定底为1.35 。
对预测模块,宽度与BiFPN⼀致。深度随ϕ线性增长。