1. 引言
在很多计算机视觉任务中,由于同一张图像中的物体往往会有不一样的尺寸,因此,我们经常需要提取图像中不同尺度的特征来提高模型的效果,在以往的经验中,我们知道可以通过堆叠不同的CNN层、采用不同size的卷积核、残差连接等来实现。在本文中,我们将介绍一种更加细粒度的方法——Res2Net,该方法是2019年由程明明等人提出来的一种新模块,通过简单修改ResNet中的Bottleneck block,就可以实现对图像进行多尺度特征提取,该方法由于是对Bottleneck block进行修改,因此,对于以往很多模型结构,只需要替换其block就可以应用该方法,因此,其适用性和便利性更强,作者通过实验也发现该方法在很多视觉任务上都达到了SOTA。论文地址如下:
2. Res2Net模块介绍
如下图所示,我们知道,Bottleneck block的结构采用 1 × 1 、 3 × 3 、 1 × 1 1 \times 1、3 \times 3、1 \times 1 1×1、3×3、1×1三层卷积层,这里每一层都带有relu激活函数,最后一层在relu之前带有残差连接,Res2Net的block结构与该结构非常相似,只是修改了中间 3 × 3 3 \times 3 3×3的卷积层,具体的修改步骤如下:
- 首先,引入一个新的参数scale,表示将feature map分为多少组,简记为 s s s;
- 接着,对于第一层 1 × 1 1 \times 1 1×1卷积层的输出特征,假设其通道数为 n n n,Res2Net将其按照通道数均分为 s s s组特征,每一组特征的通道数为 w w w,即 n = s × w n=s \times w n=s×w,比如下图中分为4组,记均分后每一组特征为 x i x_{i} xi,其中 i ∈ { 1 , 2 , … , s } i \in\{1,2, \ldots, s\} i∈{ 1,2,…,s};
- 接着,对于原来Bottleneck block第二层的卷积核,也类似2步骤,将其分为 s s s组,每一组的输出通道为 w w w,记每一组的卷积操作为 K i ( ) \mathbf{K}_{i}( ) Ki();
- 对于分组后的每一组特征 x i x_{i} xi,除了第一个组不带有卷积操作外,其他组都对应卷积操作 K i ( ) \mathbf{K}_{i}( ) Ki(),其中 i ∈ { 2 , … , s } i \in\{2, \ldots, s\} i∈{ 2,…,s},记 y i y_{i} yi为卷积操作 K i ( ) \mathbf{K}_{i}( ) Ki()的输出,则从第二组开始,每一次卷积操作 K i ( ) \mathbf{K}_{i}( ) Ki()前,都会将上一组的输出 y i − 1 y_{i-1} yi−1