3.1 神经网络基本组成
3.1.1 卷积层
对于torch.nn.Conv2d()来说,传入的参数含义如下:
- in_channels:输入特征图的通道数,如果是RGB图像,则通道数为3。卷积中的特征图通道数一般是2的整数次幂。
- out_channels:输出特征图的通道数。
- kernel_size:卷积核的尺寸,常见的有1、3、5、7。
- stride:步长,即卷积核在特征图上滑动的步长,一般为1。如果大于1,则输出特征图的尺寸会小于输入特征图的尺寸。
- padding:填充,常见的有零填充、边缘填充等,PyTorch默认为零填充。
- dilation:空洞卷积,当大于1时可以增大感受野的同时保持特征图的尺寸(后面会细讲),默认为1。
- groups:可实现组卷积,即在卷积操作时不是逐点卷积,而是将输入通道分为多个组,稀疏连接达到降低计算量的目的(后续会细讲),默认为1。
- bias:是否需要偏置,默认为True。在实际使用中,特征图的维度通常都不是1,假设输入特征图维度为m×win×hin,输出特征图维度为n×wout×hout,则卷积核的维度为n×m×k×k,在此产生的乘法操作次数为n×wout×hout×m×k×k。
3.1.2 激活函数层
Sigmoid函数将特征压缩到了(0,1)区间,0端对应抑制状态,而1对应激活状态,中间部分梯度较大。Sigmoid函数可以用来做二分类,但其计算量较大,并且容易出现梯度消失现象。
为了缓解梯度消失现象,修正线性单元(Rectified Linear Unit,ReLU)被引入到神经网络中。由于其优越的性能与简单优雅的实现,ReLU已经成为目前卷积神经网络中最为常用的激活函数之一。ReLU函数计算简单,收敛快,并在众多卷积网络中验证了其有效性。
ReLU激活函数虽然高效,但是其将负区间所有的输入都强行置为0,Leaky ReLU函数优化了这一点,在负区间内避免了直接置0,而是赋予很小的权重。虽然从理论上讲,Leaky ReLU函数的使用效果应该要比ReLU函数好,但是从大量实验结果来看并没有看出其效果比ReLU好。此外,对于ReLU函数的变种,除了Leaky ReLU函数之外,还有PReLU和RReLU函数等。
多物体类别较为常用的分类器是Softmax函数。
3.1.3 池化层
在卷积网络中,通常会在卷积层之间增加池化(Pooling)层,以降低特征图的参数量,提升计算速度,增加感受野,是一种降采样操作。
池化是一种较强的先验,可以使模型更关注全局特征而非局部出现的位置,这种降维的过程可以保留一些重要的特征信息,提升容错能力,并且还能在一定程度上起到防止过拟合的作用。
3.1.4 Dropout层
Dropout算法,可以比较有效地缓解过拟合现象的发生,起到一定正则化的效果。
在训练时,每个神经元以概率p保留,即以1-p的概率停止工作,每次前向传播保留下来的神经元都不同,这样可以使得模型不太依赖于某些局部特征,泛化性能更强。在测试时,为了保证相同的输出期望值,每个参数还要乘以p。当然还有另外一种计算方式称为Inverted Dropout,即在训练时将保留下的神经元乘以1/p,这样测试时就不需要再改变权重。
至于Dropout为什么可以防止过拟合,可以从以下3个方面解释。
- 多模型的平均:不同的固定神经网络会有不同的过拟合,多个取平均则有可能让一些相反的拟合抵消掉,而Dropout每次都是不同的神经元失活,可以看做是多个模型的平均,类似于多数投票取胜的策略。
- 减少神经元间的依赖:由于两个神经元不一定同时有效,因此减少了特征之间的依赖,迫使网络学习有更为鲁棒的特征,因为神经网络不应该对特定的特征敏感,而应该从众多特征中学习更为共同的规律,这也起到了正则化的效果。
- 生物进化:Dropout类似于性别在生物进化中的角色,物种为了适应环境变化,在繁衍时取雄性和雌性的各一半基因进行组合,这样可以适应更复杂的新环境,避免了单一基因的过拟合,当环境发生变化时也不至于灭绝。
Dropout被广泛应用到全连接层中,一般保留概率设置为0.5,而在较为稀疏的卷积网络中则一般使用下一节将要介绍的BN层来正则化模型,使得训练更稳定。
3.1.5 BN层
为了追求更高的性能,卷积网络被设计得越来越深,然而网络却变得难以训练收敛与调参。原因在于,浅层参数的微弱变化经过多层线性变换与激活函数后会被放大,改变了每一层的输入分布,造成深层的网络需要不断调整以适应这些分布变化,最终导致模型难以训练收敛。
由于网络中参数变化导致的内部节点数据分布发生变化的现象被称做ICS(Internal Covariate Shift)。ICS现象容易使训练过程陷入饱和区,减慢网络的收敛。前面提到的ReLU从激活函数的角度出发,在一定程度上解决了梯度饱和的现象,而2015年提出的BN层,则从改变数据分布的角度避免了参数陷入饱和区。由于BN层优越的性能,其已经是当前卷积网络中的“标配”。BN层首先对每一个batch的输入特征进行白化操作,即去均值方差过程。
白化操作可以使输入的特征分布具有相同的均值与方差,固定了每一层的输入分布,从而加速网络的收敛。然而,白化操作虽然从一定程度上避免了梯度饱和,但也限制了网络中数据的表达能力,浅层学到的参数信息会被白化操作屏蔽掉,因此,BN层在白化操作后又增加了一个线性变换操作,让数据尽可能地恢复本身的表达能力。
γ与β为新引进的可学习参数,最终的输出为yi。
BN层可以看做是增加了线性变换的白化操作,在实际工程中被证 明了能够缓解神经网络难以训练的问题。BN层的优点主要有以下3点:
- 缓解梯度消失,加速网络收敛。BN层可以让激活函数的输入数据 落在非饱和区,缓解了梯度消失问题。此外,由于每一层数据的均值与 方差都在一定范围内,深层网络不必去不断适应浅层网络输入的变化, 实现了层间解耦,允许每一层独立学习,也加快了网络的收敛。
- 简化调参,网络更稳定。在调参时,学习率调得过大容易出现震 荡与不收敛,BN层则抑制了参数微小变化随网络加深而被放大的问 题,因此对于参数变化的适应能力更强,更容易调参。
- 防止过拟合。BN层将每一个batch的均值与方差引入到网络中,由 于每个batch的这两个值都不相同,可看做为训练过程增加了随机噪音,可以起到一定的正则效果,防止过拟合。
在测试时,由于是对单个样本进行测试,没有batch的均值与方差, 通常做法是在训练时将每一个batch的均值与方差都保留下来,在测试时,使用所有训练样本均值与方差的平均值。
BN层的具体实现:众所周知,BN层的输出Y与输入X之间的关系是:Y = (X – running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。(引用自 https://zhuanlan.zhihu.com/p/102710590)
尽管BN层取得了巨大的成功,但仍有一定的弊端,主要体现在以 下两点:
- 由于是在batch的维度进行归一化,BN层要求较大的batch才能有效地工作,而物体检测等任务由于占用内存较高,限制了batch的大小,这 会限制BN层有效地发挥归一化功能。
- 数据的batch大小在训练与测试时往往不一样。在训练时一般采用滑动来计算平均值与方差,在测试时直接拿训练集的平均值与方差来使用。这种方式会导致测试集依赖于训练集,然而有时训练集与测试集的数据分布并不一致。
因此,我们能不能避开batch来进行归一化呢?答案是可以的,最新的工作GN(Group Normalization)从通道方向计算均值与方差,使用更为灵活有效,避开了batch大小对归一化的影响。
具体来讲,GN先将特征图的通道分为很多个组,对每一个组内的 参数做归一化,而不是batch。GN之所以能够工作的原因,笔者认为是 在特征图中,不同的通道代表了不同的意义,例如形状、边缘和纹理 等,这些不同的通道并不是完全独立地分布,而是可以放到一起进行归 一化分析。
3.1.6 全连接层
然而,随着深度学习算法的发展,全连接层的缺点也逐渐暴露了出 来,最致命的问题在于其参数量的庞大。在此以VGGNet为例说明,其 第一个全连接层的输入特征为7×7×512=25088个节点,输出特征是大小 为4096的一维向量,由于输出层的每一个点都来自于上一层所有点的权 重相加,因此这一层的参数量为25088×4096≈108。相比之下,VGGNet 最后一个卷积层的卷积核大小为3×3×512×512≈2.4×106,全连接层的参数量是这一个卷积层的40多倍。
大量的参数会导致网络模型应用部署困难,并且其中存在着大量的 参数冗余,也容易发生过拟合的现象。在很多场景中,我们可以使用全局平均池化层(Global Average Pooling,GAP)来取代全连接层,这种思想最早见于NIN(Network in Network)网络中,总体上,使用GAP有 如下3点好处:
- 利用池化实现了降维,极大地减少了网络的参数量。
- 将特征提取与分类合二为一,一定程度上可以防止过拟合。
- 由于去除了全连接层,可以实现任意图像尺度的输入。
3.1.7 深入理解感受
卷积层和池化层都会影响感受野,而激活函数层通常对于感受野没有影响。对于一般的卷积神经网络,感受野可由式(3-9)和式(3-10) 计算得出。
其中,RFl+1与RFl分别代表第l+1层与第l层的感受野,k代表第l+1层 卷积核的大小,Sl代表前l层的步长之积。注意,当前层的步长并不影响 当前层的感受野。
通过上述公式求取出的感受野通常很大,而实际的有效感受野 (Effective Receptive Field)往往小于理论感受野。从图3.10也可以看 出,虽然第三层的感受野是7×7,但是输入层中边缘点的使用次数明显比中间点要少,因此做出的贡献不同。经过多层的卷积堆叠之后,输入 层对于特征图点做出的贡献分布呈高斯分布形状。
理解感受野是理解卷积神经网络工作的基础,尤其是对于使用Anchor作为强先验区域的物体检测算法,如Faster RCNN和SSD,如何 设置Anchor的大小,Anchor应该对应在特征图的哪一层,都应当考虑感 受野。通常来讲,Anchor的大小应该与感受野相匹配,尤其是有效的感 受野,过大或过小都不好。
在卷积网络中,有时还需要计算特征图的大小,一般可以按照式 (3-11)进行计算。
其中,nin与nout分别为输入特征图与输出特征图的尺寸,p代表这一 层的padding大小,k代表这一层的卷积核大小,s为步长。
3.1.8 详解空洞卷积(Dilated Convolution)
空洞卷积,顾名思义就是卷积核中间带有一些洞,跳过一些元素进 行卷积。图3.11b代表了空洞数为2的空洞卷积,可以看到,在特征图上每2行或者2列选取元素与卷积核卷积。类似地,图3.11c代表了空洞数为3的空洞卷积。
在代码实现时,空洞卷积有一个额外的超参数dilation rate,表示空洞数,普通卷积dilation rate默认为1,图3.11中的b与c的dilation rate分别 为2与3。
空洞卷积在不增加参数量的前提下,增大了感受野。 假设空洞卷积的卷积核大小为k,空洞数为d,则其等效卷积核大小k’为
在计算感受野时,只需要将原来的卷积核大小k更换为k’即可。
空洞卷积的优点显而易见,在不引入额外参数的前提下可以任意扩 大感受野,同时保持特征图的分辨率不变。这一点在分割与检测任务中 十分有用,感受野的扩大可以检测大物体,而特征图分辨率不变使得物体定位更加精准。
当然,空洞卷积也有自己的一些缺陷,主要表现在以下3个方面:
- 网格效应(Gridding Effect):由于空洞卷积是一种稀疏的采样方式,当多个空洞卷积叠加时,有些像素根本没有被利用到,会损失信息 的连续性与相关性,进而影响分割、检测等要求较高的任务。
- 远距离的信息没有相关性:空洞卷积采取了稀疏的采样方式,导致远距离卷积得到的结果之间缺乏相关性,进而影响分类的结果。
- 不同尺度物体的关系:大的dilation rate对于大物体分割与检测有利,但是对于小物体则有弊无利,如何处理好多尺度问题的检测,是空洞卷积设计的重点。
对于上述问题,有多篇文章提出了不同的解决方法,典型的有图森未来提出的HDC(Hybrid Dilated Convolution)结构。该结构的设计准则是堆叠卷积的dilation rate不能有大于1的公约数,同时将dilation rate设 置为类似于[1,2,5,1,2,5]这样的锯齿类结构。此外各dilation rate之间还需 要满足一个数学公式,这样可以尽可能地覆盖所有空洞,以解决网格效 应与远距离信息的相关性问题,具体细节可参考相关资料。
3.2 走向深度:VGGNet
VGGNet(Visual Geometry Group Network)则将卷积网络进行了改良,探索了网络深度 与性能的关系,用更小的卷积核与更深的网络结构,取得了较好的效果。
VGGNet网络结构组成如图3.12所示,一共有6个不同的版本,最常用的是VGG16。VGGNet采用了五组卷积与三个全连接层,最后使用Softmax做分类。VGGNet有一个显著的特点:每次经过池化层(maxpool)后特征图的尺寸减小一倍,而通道数则增加一 倍(最后一个池化层除外)。
AlexNet中有使用到5×5的卷积核,而在VGGNet中,使用的卷积核 基本都是3×3,而且很多地方出现了多个3×3堆叠的现象,这种结构的优点在于,首先从感受野来看,两个3×3的卷积核与一个5×5的卷积核是一 样的;其次,同等感受野时,3×3卷积核的参数量更少。更为重要的是,两个3×3卷积核的非线性能力要比5×5卷积核强,因为其拥有两个激活函数,可大大提高卷积网络的学习能力。
VGGNet简单灵活,拓展性很强,并且迁移到其他数据集上的泛化能力也很好,因此时至今日有很多检测与分割算法仍采用VGGNet的网络骨架。
3.3 纵横交错:Inception
一般来说,增加网络的深度与宽度可以提升网络的性能,但是这样做也会带来参数量的大幅度增加,同时较深的网络需要较多的数据,否 则容易产生过拟合现象。除此之外,增加神经网络的深度容易带来梯度消失的现象。Inception v1(又 名GoogLeNet)网络较好地解决了这个问题。
Inception v1网络是一个精心设计的22层卷积网络,并提出了具有良好局部特征结构的Inception模块,即对特征并行地执行多个大小不同的卷积运算与池化,最后再拼接到一起。由于1×1、3×3和5×5的卷积运算 对应不同的特征图区域,因此这样做的好处是可以得到更好的图像表征信息。
Inception模块使用了三个不同大小的卷积核进行卷 积运算,同时还有一个最大值池化,然后将这4部分级联起来(通道拼接),送入下一层。
在上述模块的基础上,为进一步降低网络参数量,Inception又增加 了多个1×1的卷积模块。如图3.14所示,这种1×1的模块可以先将特征图降维,再送给3×3和5×5大小的卷积核,由于通道数的降低,参数量也有了较大的减少。值得一提的是,用1×1卷积核实现降维的思想,在后面的多个轻量化网络中都会使用到。
Inception v1网络一共有9个上述堆叠的模块,共有22层,在最后的 Inception模块处使用了全局平均池化。为了避免深层网络训练时带来的梯度消失问题,作者还引入了两个辅助的分类器,在第3个与第6个 Inception模块输出后执行Softmax并计算损失,在训练时和最后的损失一并回传。
Inception v1的参数量是AlexNet的1/12 ,VGGNet的 1/3,适合处理大规 模数据,尤其是对于计算资源有限的平台。
基本思想是 Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
Inception网络框架中会有额外的两个softmadx预测层,这两个预测层分别是从网络框架中间部分引出的分支,用于反向传播更新梯度,这样就避免了因梯度消失导致浅层的网络参数无法更新。注意这两个分支只在训练的时候防止梯度消失会用到,真正做预测的时候需要删除。
在Inception v1网络的基础上,随后又出现了多个Inception版本。 Inception v2进一步通过卷积分解与正则化实现更高效的计算,增加了BN层,同时利用两个级联的3×3卷积取代了Inception v1版本中的5×5卷 积,如图3.15所示,这种方式既减少了卷积参数量,也增加了网络的非线性能力。
更进一步,Inception v2将n×n的卷积运算分解为1×n与n×1两个卷积,如图3.16所示,这种分解的方式可以使计算成本降低33%。
此外,Inception v2还将模块中的卷积核变得更宽而不是更深,形成 第三个模块,以解决表征能力瓶颈的问题。Inception v2网络正是由上述的三种不同类型的模块组成的,其计算也更加高效。
Inception v3在Inception v2的基础上,使用了RMSProp优化器,在辅助的分类器部分增加了7×7的卷积,并且使用了标签平滑技术。
Inception v4则是将Inception的思想与残差网络进行了结合,显著提升了训练速度与模型准确率。
3.4 里程碑:ResNet
VGGNet与Inception出现后,学者们将卷积网络不断加深以寻求更优越的性能,然而随着网络的加深,网络却越发难以训练,一方面会产 生梯度消失现象;另一方面越深的网络返回的梯度相关性会越来越差, 接近于白噪声,导致梯度更新也接近于随机扰动。
ResNet(Residual Network,残差网络)较好地解决了这个问题,并获得了2015年ImageNet分类任务的第一名。此后的分类、检测、分割等 任务也大规模使用ResNet作为网络骨架。
ResNet的思想在于引入了一个深度残差框架来解决梯度消失问题, 即让卷积网络去学习残差映射,而不是期望每一个堆叠层的网络都完整地拟合潜在的映射(拟合函数)。如图3.17所示,对于神经网络,如果我们期望的网络最终映射为H(x),左侧的网络需要直接拟合输出H(x), 而右侧由ResNet提出的子模块,通过引入一个shortcut(捷径)分支,将需要拟合的映射变为残差F(x):H(x)-x。ResNet给出的假设是:相较于直接优化潜在映射H(x),优化残差映射F(x)是更为容易的。
在ResNet中,上述的一个残差模块称为Bottleneck。ResNet有不同 网络层数的版本,如18层、34层、50层、101层和152层,这里以常用的 50层来讲解。ResNet-50的网络架构如图3.18所示,最主要的部分在于中 间经历了4个大的卷积组,而这4个卷积组分别包含了3、4、6这3个 Bottleneck模块。最后经过一个全局平均池化使得特征图大小变为1×1, 然后进行1000维的全连接,最后经过Softmax输出分类得分。
由于F(x)+x是逐通道进行相加,因此根据两者是否通道数相同,存在两种Bottleneck结构。对于通道数不同的情况,比如每个卷积组的第 一个Bottleneck,需要利用1×1卷积对x进行Downsample操作,将通道数变为相同,再进行加操作。对于相同的情况下,两者可以直接进行相加。
ResNet论文翻译:https://www.jianshu.com/p/eae07a953727
3.5 继往开来:DenseNet
上一节的ResNet通过前层与后层的“短路连接”(Shortcuts),加强了前后层之间的信息流通,在一定程度上缓解了梯度消失现象,从而可以将神经网络搭建得很深。更进一步,本节的主角DenseNet最大化了这 种前后层信息交流,通过建立前面所有层与后面层的密集连接,实现了特征在通道维度上的复用,使其可以在参数与计算量更少的情况下实现比ResNet更优的性能。
DenseNet的网络架构如图3.19所示,网络由多个Dense Block与中间的卷积池化组成,核心就在Dense Block中。Dense Block中的黑点代表 一个卷积层,其中的多条黑线代表数据的流动,每一层的输入由前面的所有卷积层的输出组成。注意这里使用了通道拼接(Concatnate)操作,而非ResNet的逐元素相加操作。
DenseNet的结构有如下两个特性:
- 神经网络一般需要使用池化等操作缩小特征图尺寸来提取语义特征,而Dense Block需要保持每一个Block内的特征图尺寸一致来直接进行Concatnate操作,因此DenseNet被分成了多个Block。Block的数量一 般为4。
- 两个相邻的Dense Block之间的部分被称为Transition层,具体包括 BN、ReLU、1×1卷积、2×2平均池化操作。1×1卷积的作用是降维,起到压缩模型的作用,而平均池化则是降低特征图的尺寸,
具体的Block实现细节如图3.20所示,每一个Block由若干个 Bottleneck的卷积层组成,对应图3.19中的黑点。Bottleneck由BN、 ReLU、1×1卷积、BN、ReLU、3×3卷积的顺序构成。
关于Block,有以下4个细节需要注意:
- 每一个Bottleneck输出的特征通道数是相同的,例如这里的32。同时可以看到,经过Concatnate操作后的通道数是按32的增长量增加的, 因此这个32也被称为GrowthRate。
- 这里1×1卷积的作用是固定输出通道数,达到降维的作用。当几十个Bottleneck相连接时,Concatnate后的通道数会增加到上千,如果不增加1×1的卷积来降维,后续3×3卷积所需的参数量会急剧增加。1×1卷积的通道数通常是GrowthRate的4倍。
- 图3.20中的特征传递方式是直接将前面所有层的特征Concatnate后传到下一层,这种方式与具体代码实现的方式是一致的,而不像图3.19中,前面层都要有一个箭头指向后面的所有层。
- Block采用了激活函数在前、卷积层在后的顺序,这与一般的网络上是不同的。
DenseNet网络的优势主要体现在以下两个方面:
- 密集连接的特殊网络,使得每一层都会接受其后所有层的梯度, 而不是像普通卷积链式的反传,因此一定程度上解决了梯度消失的问 题。
- 通过Concatnate操作使得大量的特征被复用,每个层独有的特征图的通道是较少的,因此相比ResNet,DenseNet参数更少且计算更高效。
DenseNet的不足在于由于需要进行多次Concatnate操作,数据需要被复制多次,显存容易增加得很快,需要一定的显存优化技术。另外, DenseNet是一种更为特殊的网络,ResNet则相对一般化一些,因此 ResNet的应用范围更广泛。
3.6 特征金字塔:FPN
为了增强语义性,传统的物体检测模型通常只在深度卷积网络的最 后一个特征图上进行后续操作,而这一层对应的下采样率(图像缩小的倍数)通常又比较大,如16、32,造成小物体在特征图上的有效信息较少,小物体的检测性能会急剧下降,这个问题也被称为多尺度问题。
解决多尺度问题的关键在于如何提取多尺度的特征。传统的方法有 图像金字塔(Image Pyramid),主要思路是将输入图片做成多个尺度, 不同尺度的图像生成不同尺度的特征,这种方法简单而有效,大量使用在了COCO等竞赛上,但缺点是非常耗时,计算量也很大。
从前面几节内容可以知道,卷积神经网络不同层的大小与语义信息 不同,本身就类似一个金字塔结构。2017年的FPN(Feature Pyramid Network)方法融合了不同层的特征,较好地改善了多尺度检测问题。FPN的总体架构如图3.21所示,主要包含自下而上网络、自上而下网络、横向连接与卷积融合4个部分。
- 自下而上:最左侧为普通的卷积网络,默认使用 ResNet 结构,用 作提取语义信息。C1代表了ResNet的前几个卷积与池化层,而C2至C5 分别为不同的ResNet卷积组,这些卷积组包含了多个Bottleneck结构, 组内的特征图大小相同,组间大小递减。
- 自上而下:首先对C5进行1×1卷积降低通道数得到P5,然后依次进行上采样得到P4、P3和P2,目的是得到与C4、C3与C2长宽相同的特征,以方便下一步进行逐元素相加。这里采用2倍最邻近上采样,即直接对临近元素进行复制,而非线性插值。
- 横向连接(Lateral Connection):目的是为了将上采样后的高语义 特征与浅层的定位细节特征进行融合。高语义特征经过上采样后,其长宽与对应的浅层特征相同,而通道数固定为256,因此需要对底层特征 C2至C4进行1×1卷积使得其通道数变为256,然后两者进行逐元素相加得到P4、P3与P2。由于C1的特征图尺寸较大且语义信息不足,因此没有把C1放到横向连接中。
- 卷积融合:在得到相加后的特征后,利用3×3卷积对生成的P2至P4 再进行融合,目的是消除上采样过程带来的重叠效应,以生成最终的特征图。
对于实际的物体检测算法,需要在特征图上进行RoI(Region of Interests,感兴趣区域)提取,而FPN有4个输出的特征图,选择哪一个 特征图上面的特征也是个问题。FPN给出的解决方法是,对于不同大小 的RoI,使用不同的特征图,大尺度的RoI在深层的特征图上进行提取, 如P5,小尺度的RoI在浅层的特征图上进行提取,如P2,具体确定方 法,感兴趣的读者可以自行查看。
FPN将深层的语义信息传到底层,来补充浅层的语义信息,从而获得了高分辨率、强语义的特征,在小物体检测、实例分割等领域有着非常不俗的表现。
3.7 为检测而生:DetNet
前面几节的网络骨架,如VGGNet和ResNet等,虽从各个角度出发提升了物体检测性能,但究其根本是为ImageNet的图像分类任务而设计的。而图像分类与物体检测两个任务天然存在着落差,分类任务侧重于全图的特征提取,深层的特征图分辨率很低;而物体检测需要定位出物体位置,特征图分辨率不宜过小,因此造成了以下两种缺陷:
- 大物体难以定位:对于FPN等网络,大物体对应在较深的特征图上检测,由于网络较深时下采样率较大,物体的边缘难以精确预测,增加了回归边界的难度。
- 小物体难以检测:对于传统网络,由于下采样率大造成小物体在较深的特征图上几乎不可见;FPN虽从较浅的特征图来检测小物体,但浅层的语义信息较弱,且融合深层特征时使用的上采样操作也会增加物体检测的难度。
针对以上问题,旷视科技提出了专为物体检测设计的DetNet结构, 引入了空洞卷积,使得模型兼具较大感受野与较高分辨率,同时避免了 3.6节中FPN的多次上采样,实现了较好的检测效果。
DetNet的网络结构如图3.22所示,仍然选择性能优越的ResNet-50作为基础结构,并保持前4个stage与ResNet-50相同,具体的结构细节有以 下3点:
- 引入了一个新的Stage 6,用于物体检测。Stage 5与Stage 6使用了 DetNet提出的Bottleneck结构,最大的特点是利用空洞数为2的3×3卷 取代了步长为2的3×3卷积。
- Stage 5与Stage 6的每一个Bottleneck输出的特征图尺寸都为原图的1/16 ,通道数都为256,而传统的Backbone通常是特征图尺寸递减,通道数递增。
- 在组成特征金字塔时,由于特征图大小完全相同,因此可以直接从右向左传递相加,避免了上一节的上采样操作。为了进一步融合各通道的特征,需要对每一个阶段的输出进行1×1卷积后再与后一Stage传回的特征相加。
DetNet这种精心设计的结构,在增加感受野的同时,获得了较大的特征图尺寸,有利于物体的定位。与此同时,由于各Stage的特征图尺寸相同,避免了上一节的上采样,既一定程度上降低了计算量,又有利于小物体的检测。
DetNet中Bottleneck的细节如图3.23所示,左侧的两个Bottleneck A 与Bottleneck B分别对应图3.22的A与B,右侧的为原始的ResNet残差结构。DetNet与ResNet两者的基本思想都是卷积堆叠层与恒等映射的相加,区别在于DetNet使用了空洞数为2的3×3卷积,这样使得特征图尺寸保持不变,而ResNet是使用了步长为2的3×3卷积。B相比于A,在恒等映射部分增加了一个1×1卷积,这样做可以区分开不同的Stage,并且实验发现这种做法对于特征金字塔式的检测非常重要。