暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

图像分类网络演化-SENet(四)

OnekeyAI 2021-08-26
1027

图像分类网络作为计算机视觉的最基础任务,在过去的10年中被广泛的研究,像3X3的小核、残差结构,Inception模块,BN、Depthwise卷积等屡试不爽的经典算法都是在这个时间段被提出的。所以了解图像分类模型的演化史可以帮助大家更好的进行后续任务的迭代。

另外图像分类的模型结构,作为Backbone也被后面很多的任务吸取进去作为基础的视觉特征提取器。因此对于后续的目标检测、分割算法也有很大的指导意义。

4. SENet GENet SKNet GCNet

4.1  SENet

这里就简单把官方对于 SENet 的解析搬过来了

A convolutional filter is expected to be an informatiive combination
• Fusing channel-wise and spatial information
• Within local receptive fields

图18: Normal Convolution.

我们从最基本的卷积操作开始说起。近些年来,卷积神经网络在很多领域上都取得了巨大的突破。而卷积核作为卷积神经网络的核心,通常被看作是在局部感受野上,将空间上(spatial) 的信息和通道上(channel-wise) 的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

Exploration on Spatial Enhancement

然而去学习一个性能非常强劲的网络是相当困难的,其难点来自于很多方面。有很多工作被提出来从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合了多种不同大小的感受野的特征来获得性能增益;在 Inside-outside Network 中考虑了空间中的上下文信息;还有将 Attention 机制引入到空间维度上等等。这些工作都获得了相当不错的成果。

Squeeze-and-Excitation (SE) Networks

If a network can be enhanced from the aspect of channel relationship?
• Motivation
– Explicitly model channel-interdependencies within modules
– Feature recalibration
   * Selectively enhance useful features and suppress less useful ones

已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?我们的工作就是基于这一点并提出了 SENet,在我们提出的结构中,Squeeze 和 Excitation 是两个非常关键的操作,所以我们以此来命名。我们的动机是希望显式地建模特征通道之间的相互依赖关系。另外,我们并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的“特征重标定”策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

图20: A Squeeze-and-Excitation block

上图是我们提出的 SE 模块的示意图。给定一个输入 𝑋, 其特征通道数为 𝐶′,通过一系列卷积等一般变换后得到一个特征通道数为 𝐶的特征 𝑈,接下来我们将通过三个操作来重标定前面的到特征 𝑈。

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 𝑊来为每个特征通道生成权重,其中参数 𝑊 被学习用来显式地建模特征通道间的相关性。

最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定

上左图是将 SE 模块嵌入到 Inception 结构的一个示例。方框旁边的维度信息代表该层的输出。这里我们使用 global average pooling 作为 Squeeze 操作。紧接着两个 Fully Connected 层组成一个 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个  Sigmoid 的门获得0~1之间归一化的权重,最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。

除此之外,SE 模块还可以嵌入到含有 skip-connections 的模块中。上右图是将 SE 嵌入到 ResNet 模块中的一个例子,操作过程基本和 SE-Inception 一样,只不过是在 Addition 前对分支上 Residual 的特征进行了特征重标定。如果对 Addition 后主支上的特征进行重标定,由于在主干上存在 0~1的 scale 操作,在网络较深 BP 优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。
论文中还讨论了一些训练策略、耗时和性能分析,这里就不详细描述了。总体来说就是 SENet 结构实现简单,在耗时增加较低的情况下可以作用于不同的 building block 单元中并提升性能。

4.2 GENet

GENet 这篇文章则是从空间角度出发,首先利用 Gather Operator 操作,将输入的 feature map 𝑥 利用卷积或者池化操作降维得到 𝑥̃ ; 然后执行 Excite Operator 操作:使用 Nearest Neighbor Interpolation 操作将其 resize 到和 𝑥 相同 shape,最后经过 sigmoid 后和 𝑥x 做点积运算 𝑥⊙𝑓(𝑥̃ )。

对于 Gather Operator 操作,论文中实验表明,使用 Global Average Pooling 或者 Global Conv 时结果最好。。。和 SENet 一样。。。 

4.3 SKNet

图24: Selective Kernel Convolution.

 

SKNet 可以算是 SENet 的递进版本了,这个网络主要分为 Split,Fuse,Select 三个操作。

Split 操作是指对特征向量 X 进行不同卷积核大小的卷积操作(包括 efficient group/depthwise conv, BN, ReLU,不同卷积核大小可考虑使用空洞卷积)得到输出 \hat U\widetilde{U}

Fuse: 先进行Eltwise

为全局平均池化操作,𝐹𝑓𝑐 是先降维再升维的两层全连接层(实际上可以用 PW 卷积实现),需要注意的是输出的两个矩阵 𝑎 和 𝑏,其中矩阵 𝑏b 为冗余矩阵,在如图两个分支的情况下 𝑏=1−𝑎(具体操作为先经过 Softmax 层,再经过 Slice)。

Select 操作对应于 SE 模块中的 Scale, 区别是 Select 使用 𝑎 和 𝑏 两个权重矩阵对 \hat U\widetilde{U}进行加权操作,然后求和得到最终的输出向量 𝑉。



关注「OnekeyAI」公众号,后台回复「视觉模型」,获取相关代码和测试数据。保持联系,及时了解更多后续内容。

好消息:相关代码、数据已集成在Onekey平台,如需购买Onekey移动AI平台「长按QR码识别」,案例需要单独购买,可以通过关注公众号后,在底导购买。

文章转载自OnekeyAI,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论