这篇文章是2018年的ECCV,作者主要是为了介绍注意力机制在超分领域的应用以及基于注意力机制的这个SR网络——Residual Channel Attention Networks
(后文简称RCAN)。RCAN是一种基于Residual In Residual
(后文简称RIR)结构的深度网络,他利用残差网络的特性来加深网络;RIR由多个Residual Groups
(后文简称RG)组成,每个RG由多个Residual Channel Attention Blocks
(后文简称RCAB)组成;而每个RCAB是一个含有通道注意力机制Channel Attention
(后文简称CA)的残差块。
参考列表:
①RCAN-Image Super-Resolution Using Very DeepResidual Channel Attention Networks
②Image Super-Resolution Using Very Deep Residual Channel Attention Networks
③RCAN源码
①想要提升SR的表现力,最直接的方法就是增加模型复杂度,模型复杂度的增加可以通过增加网络宽度实现,比如EDSR就是比较知名的非常宽的SR网络;此外,增加网络深度也是一个重要的方向,为了避免网络深度带来的梯度消失现象,RCAN利用何凯明提出的残差网络来加深SR模型的深度。
②之前的SR方法对于feature map不同通道是一样处理的,但作者提出不同通道它所含的特征信息是不同的,有的通道的feature map含有重要信息,而有的通道所含的可能是无效甚至是不利于图像重建的feature map。
基于上述2点,作者提出了RCAN超分模型,它具有非常深的网络结构以及包含通道注意力机制的特性,我们简要描述下RCAN的网络结构:
Long skip connection
将低层特征信息和高层特征信息进行相加;而RIR由多个RG组成,RG由多个具有注意力机制的残差块组成,而在RG中会继续将低层信息和高层信息通过Short skip connection
相加。RCAN的提出基于前人算法体现的2大问题:
因此作者推出RCAN,其于EDSR一样利用残差块以及skip connection来加深网络。但是不同于较宽的EDSR或较深的MDSR的简单堆积,RCAN使用RIR结构,其使用RG结构和Long Skip Connection
(以下简称LSC)来加深网络从而可以提取 L R LR LR层级更多的低层特征和高层特征信息,其中就包括低频信息和高频信息(低频信息是一些平坦大块的区域,高频信息是边缘、纹理、区域等细节信息)。每个RG模块才使用多个具有注意力机制的残差块(RCAB)和Short Skip Connection
(SSC),而每个残差块内部有short-cut
(短程连接,也可以算skip connection)来进行残差连接。关于每个残差块内部的注意力,对不同通道就不能同等视之,作者在RCAN中引入通道注意力机制(CA),自适应学习一个通道权重来给予不同的注意力。CA的引入增加了SR网络的灵活性以及使得SR网络更加关心有用的通道特征。
RCAN的表现力如下:
Note:
总结一下这篇文章的贡献点:
略
这一节开始介绍RCAN的整体网络模型,其中:
RCAN网络结构如下:
整个RCAN模型包括4部分:
①浅(低)层特征提取。
②RIR深(高)层特征提取。
③上采样层。
④重建层。
Note:
①浅层特征提取:
RCAN使用简单一层卷积层来提取输入 I L R I^{LR} ILR的浅层特征信息(Shallow Feature),设 H S F ( ⋅ ) H_{SF}(\cdot) HSF(⋅)表示浅层特征提取算子, F 0 F_0 F0为该层输出feature map,则表达式为:
F 0 = H S F ( I L R ) (1) F_0 = H_{SF}(I_{LR})\tag{1} F0=HSF(ILR)(1)
②RIR深层特征提取:
深层特征(Deep Feature)提取使用非常深的RIR结构,其包含多个RG块,其算子用 H R I R ( ⋅ ) H_{RIR}(\cdot) HRIR(⋅)表示,作者指出目前来说RIR已经达到了最大的深度以及最大的感受野,具体表达式为:
F D F = H R I R ( F 0 ) (1) F_{DF} = H_{RIR}(F_0)\tag{1} FDF=HRIR(F0)(1)
③上采样层:
SR中的上采样大致有3种方式,比如反卷积(本质也是卷积,或者叫转置卷积)、最近邻上采样、亚像素卷积(ESPCN)等。设 F U P ( ⋅ ) F_{UP}(\cdot) FUP(⋅)表示上采样算子,具体表达式为:
F U P = H U P ( F D F ) (3) F_{UP} = H_{UP}(F_{DF})\tag{3} FUP=HUP(FDF)(3)在实验中,作者采用ESPCN提出的亚像素卷积层。
④重建层:
重建层简单使用一层卷积层来将上采样输出 F U P F_{UP} FUP进行下一步的调整和优化,用 H R E C ( ⋅ ) H_{REC}(\cdot) HREC(⋅)算子来表示该过程,具体表达式为:
I S R = H R E C ( F U P ) = H R C A N ( I L R ) (4) I_{SR} = H_{REC}(F_{UP}) = H_{RCAN}(I_{LR})\tag{4} ISR=HREC(FUP)=HRCAN(ILR)(4)Note:
RCAN使用 L 1 L1 L1损失函数,设 I H R I_{HR} IHR为Ground Truth, Θ \Theta Θ为RCAN的参数,则RCAN优化的目标为:
L ( Θ ) = 1 N ∑ i = 1 N ∣ ∣ H R C A N ( I L R i ) − I H R i ∣ ∣ . (5) L(\Theta) = \frac{1}{N}\sum^N_{i=1}||H_{RCAN}(I_{LR}^i) - I_{HR}^i||.\tag{5} L(Θ)=N1i=1∑N∣∣HRCAN(ILRi)−IHRi∣∣.(5)
由于不同算法主要在深层特征提取不同,因此作者接下来只具体展开介绍RIR深层特征提取部分。
在RIR结构中,包含了 G G G个RG块以及1个LSC来连接2个阶段的特征信息;每个RG块包含 B B B个RCAB块以及1个SSC来连接2个阶段的特征信息,此外RCAB是一个基础的残差块结合通道注意力并使用short-cut连接输入和输出2个阶段特征信息的块。
RCAN基于RIR这样的残差结构,来训练出一个深度超过400层的SR网络并取得了不错的表现力!接下来我们介绍下RIR结构:
之前EDSR使用残差块堆叠的方式取得了不错的表现力,但是如果继续加深深度,则SR的训练就会变得十分困难且无法提升表现力,因此RCAN改变结构,在RIR中使用RG块来取代EDSR中的残差块从而在SR中进一步加深网络深度。
我们用表达式来描述上述过程,设 H g ( ⋅ ) H_g(\cdot) Hg(⋅)表示第 g g g个RG块的映射, F g − 1 、 F g F_{g-1}、F_{g} Fg−1、Fg表示第 g g g个RG块的输入feature map和输出feature map:
F g = H g ( F g − 1 ) = H g ( H g − 1 ( ⋯ H 1 ( F 0 ) ⋯ ) ) . (6) F_g = H_g(F_{g-1}) = H_g(H_{g-1}(\cdots H_1(F_0)\cdots)).\tag{6} Fg=Hg(Fg−1)=Hg(Hg−1(⋯H1(F0)⋯)).(6)
作者指出若简单的堆叠RG块,会使得表现力无法提升,因此增加了LSC来稳定训练以及使得较深的网络结构得以实现。增加了LSC之后,整个RIR结构得表达式如下:
F D F = F 0 + W L S C F G = F 0 + W L S C H g ( H g − 1 ( ⋯ H 1 ( F 0 ) ⋯ ) ) . (7) F_{DF} = F_0 + W_{LSC}F_G = F_0 + W_{LSC}H_g(H_{g-1}(\cdots H_1(F_0)\cdots)).\tag{7} FDF=F0+WLSCFG=F0+WLSCHg(Hg−1(⋯H1(F0)⋯)).(7)其中, W L S C W_{LSC} WLSC是RIR尾巴处的一层卷积层参数,这里省略bias。
小结下LSC的功能:
为了进一步融合更多不同层级的信息,在每个RG内部也同样使用skip connection——SSC,即文中的identity-based skip connection。接下来我们来介绍下RG模块:
RG模块由 B B B个通道注意力残差块RCAB组成,并使用SSC连接RG块内的低层信息和高层信息,设 F g , b − 1 、 F g , b F_{g,b-1}、F_{g, b} Fg,b−1、Fg,b表示第 g g g个RG块中第 b b b个RCAB块的输入与输出, H g , b ( ⋅ ) H_{g,b}(\cdot) Hg,b(⋅)为第 g g g个RG块内第 b b b个RCAB块的映射,则RG的数学表达式为:
F g , b = H g , b ( F g , b − 1 ) = H g , b ( H g , b − 1 ( ⋯ H g , 1 ( F g − 1 ) ⋯ ) ) (8) F_{g,b} = H_{g,b}(F_{g,b-1}) = H_{g,b}(H_{g,b-1}(\cdots H_{g,1}(F_{g-1})\cdots))\tag{8} Fg,b=Hg,b(Fg,b−1)=Hg,b(Hg,b−1(⋯Hg,1(Fg−1)⋯))(8)
和LSC一样,我们在RG内部添加SSC,故整个RG模块的数学表达式为:
F g = F g − 1 + W g F g , B = F g − 1 + W g H g , B ( H g , B − 1 ( ⋯ H g , 1 ( F g − 1 ) ⋯ ) ) (9) F_g = F_{g-1} + W_gF_{g,B} = F_{g-1} + W_g H_{g,B}(H_{g,B-1}(\cdots H_{g, 1}(F_{g-1})\cdots))\tag{9} Fg=Fg−1+WgFg,B=Fg−1+WgHg,B(Hg,B−1(⋯Hg,1(Fg−1)⋯))(9)其中 W g W_{g} Wg为RG块内最后一个卷积层的参数,这里省略bias。
SSC和LSC的功能是一样的,正是有了LSC和SSC,才使得更多不同层级的特征信息得以融合,也使得网络的深度得以变深,让更多的残差信息得以学习。
之前的SR算法对于不同通道的feature map都同等看待,不加区分的用相同的操作去做,但其实不同通道所包含的特征信息是不同的,故需要引入注意力机制,让网络去注意多通道中对重建更有用的信息,这就是多通道注意力机制(CA),CA它实际考虑的是不同通道之间的关系,即不同通道之间根据自身的特性受到不同程度的偏好。
产生不同通道注意力需要一个反应不同通道重要程度的常数权重 w w w以及将权重和通道特征信息相结合的机制。
①:前者作者通过全局平均池化实现,就是将不同通道的feature map映射成一个常数,具体来看:
我们设输入feature map为: X = [ x 1 , ⋯ , x c , ⋯ , x C ] X = [x_1, \cdots, x_c, \cdots,x_C] X=[x1,⋯,xc,⋯,xC],其中 c ∈ { 0 , ⋯ C − 1 } c\in \{0, \cdots C-1\} c∈{0,⋯C−1}是第 c c c个输入通道数, C C C为输入通道总数。池化的结果为 z ∈ R C z \in \mathbb{R}^C z∈RC,即一个一维张量,长度为 C C C,该过程的数学表达式为:
z c = H G P ( x c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W x c ( i , j ) . (10) z_c = H_{GP}(x_c) = \frac{1}{H\times W}\sum_{i=1}^{H}\sum_{j=1}^{W}x_c(i,j).\tag{10} zc=HGP(xc)=H×W1i=1∑Hj=1∑Wxc(i,j).(10)
Note:
②后者通过CNN门控来实现,门控机制如RNN中的门一样,使用激活函数sigmoid/tanh作为开关,以相乘的方式和输入相互结合,具体数学表达如下:
s = f ( W U δ ( W D z ) ) . (11) s = f(W_U\delta(W_D z)).\tag{11} s=f(WUδ(WDz)).(11)
Note:
最后我们按不同通道将权值和feature map进行相乘结合
x c ^ = s c ⋅ x c . (12) \hat{x_c} = s_c \cdot x_c.\tag{12} xc^=sc⋅xc.(12)其中 x c x_c xc为第 c c c个通道的feature map。
CA使用PyTorch可表示为:
class CALayer(nn.Module):
def __init__(self, channel, reduction=16):
super(CALayer, self).__init__()
# global average pooling: feature --> point
self.avg_pool = nn.AdaptiveAvgPool2d(1) # 自适应全局平均池化层
# feature channel downscale and upscale --> channel weight
self.conv_du = nn.Sequential(
nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=True),
nn.ReLU(inplace=True),
nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=True),
nn.Sigmoid()
)
def forward(self, x):
y = self.avg_pool(x)
y = self.conv_du(y)
return x * y # 最后返回不同重要性通道的feature map
x就是 HxWxC 通道 y是权重
y权重通过上面方式求出,然后 和x求乘积
使得重要通道权重更大,不重要通道权重减小
这一节是在RG的残差块中引入通道注意力机制,从而得到一个RCAB块,其网络结构如下所示:
如上图所示,作者在基本残差块的残差 X g , b X_{g,b} Xg,b上再串接一个CA,最后再用short-cut进行连接,具体表达式为:
F g , b = F g , b − 1 + R g , b ( X g , b ) ⋅ X g , b . (13) F_{g,b} = F_{g, b-1} + R_{g,b}(X_{g,b})\cdot X_{g,b}.\tag{13} Fg,b=Fg,b−1+Rg,b(Xg,b)⋅Xg,b.(13)其中 R g , b ( ⋅ ) R_{g,b}(\cdot) Rg,b(⋅)表示第 g g g个RG中第 b b b个RCAB中CA的映射关系, X g , b X_{g,b} Xg,b是残差特征信息,它通过 c o n v 2 d → R e L U → c o n v 2 d conv2d\to ReLU\to conv2d conv2d→ReLU→conv2d的简单CNN层输出得到,具体如下:
X g , b = W g , b 2 δ ( W g , b 1 F g , b − 1 ) . (14) X_{g,b} = W_{g,b}^2 \delta(W^1_{g,b}F_{g,b-1}).\tag{14} Xg,b=Wg,b2δ(Wg,b1Fg,b−1).(14)其中 W g , b 1 、 W g , b 2 W^1_{g,b}、W^2_{g,b} Wg,b1、Wg,b2是卷积层的参数,这里省略bias。
RCAB使用PyTorch可表示为:
class RCAB(nn.Module):
def __init__(
self, conv, n_feat, kernel_size, reduction, bias=True, bn=False, act=nn.ReLU(True), res_scale=1):
super(RCAB, self).__init__()
modules_body = []
for i in range(2):
modules_body.append(conv(n_feat, n_feat, kernel_size, bias=bias))
if bn: modules_body.append(nn.BatchNorm2d(n_feat))
if i == 0: modules_body.append(act)
modules_body.append(CALayer(n_feat, reduction))
self.body = nn.Sequential(*modules_body)
self.res_scale = res_scale
def forward(self, x):
res = self.body(x)
# res = self.body(x).mul(self.res_scale)
res += x
return res
Note:
self.res_scale
表示了Inception-Residual这篇论文的Residual Scaling技巧,用于稳定深度较深的CNN训练,他是注意力机制的特殊情况。还有个有趣的地方,EDSR这篇论文推出了EDSR和MDSR两个超分结构,其中EDSR使用了0.1的residual scaling,MDSR没有使用。而residual scaling使用的位置和CA一摸一样,因此EDSR和MDSR可以看成是RCAN的一种特殊情况,具体来说,当RCAN中RCAB使用 R g , b ( ⋅ ) = 0.1 R_{g,b}(\cdot) = 0.1 Rg,b(⋅)=0.1,那么RCAB模块就相当于EDSR中的残差块;若RCAB中不适用CA或者 R g , b = 0 R_{g,b}=0 Rg,b=0,那么RCAB模块就相当于MDSR的残差块。因此RCAB相对于EDSR和MDSR的残差块更加灵活,它可以利用不同通道的特征信息以及它们之间的关系(获取不同权重)来灵活调整块地输出,让网络除了缩减feature map的值来稳定训练,从而获得更加宽的网络(因为滤波器越多,输出通道越多,网络越不稳定,而网络的宽度是由滤波器的个数决定的)之外,还可以挑选对重建更有用的信息且适当丢弃不好的特征信息,从而提升模型的表现力。
Note:
关于RIR和CA的作用,作者通过去掉LSC和SSC以及CA在Set5测试集上测试,其中残差块个数 B = 200 B=200 B=200。
实验结果如下所示:
本小节作者将RCAN和其余11种超分算法相比较,实验结果如下:
可视化结果如下:
实验结果以及可视化如下:
超分通常作为高级计算机视觉任务,比如目标识别的预处理部分,作者比较了RCAN于几种SR算法在目标识别领域上的性能对比,实验结果如下:
从结果来看,RCAN使得目标识别得到了最低的Top-1、Top-5 error。
上图是RCAN与几种SR算法在模型参数和表现力上的统计图,从图中可知: