RCAN——Image Super-Resolution Using Very Deep Residual Channel Attention Networks
1. 摘要
在图像超分辨领域,卷积神经网络的深度非常重要,但过深的网络却难以训练。低分辨率的输入以及特征包含丰富的低频信息,但却在通道间被平等对待,因此阻碍了网络的表示能力。
为了解决上述问题,作者提出了一个深度残差通道注意力网络(RCAN)。特别地,作者设计了一个残差中的残差(RIR)结构来构造深层网络,每个 RIR 结构由数个残差组(RG)以及长跳跃连接(LSC)组成,每个 RG 则包含一些残差块和短跳跃连接(SSC)。
RIR 结构允许丰富的低频信息通过多个跳跃连接直接进行传播,使主网络专注于学习高频信息。此外,我们还提出了一种通道注意力机制(CA),通过考虑通道之间的相互依赖性来自适应地重新调整特征。
2. 介绍
网络的深度在许多视觉识别任务中展示了非常重要的作用,特别是在 ResNet 引入残差块之后,最近许多图像超分辨效果的重大提升都是基于网络表示的深度来改进的。
但是,另一方面,现在的大多数 CNN 都平等对待特征的每一个通道,这无疑缺少处理不同类型信息的灵活度。图像超分辨是为了尽可能多地恢复高频信息,而低分辨率的图片却包含着许多可以直接被传播到输出的低频信息,因此,特征的所有通道如果被平等对待则会使网络缺乏辨别学习能力。
基于上面的分析,作者提出了一个 RIR(Residual In Residual)架构,其中 RG(Residual Group)作为基本模块,LSC(Long Skip Connection)则用来进行粗略的残差学习,在每个 RG 内部则叠加数个简单的残差块和 SSC(Short Skip Connection)。LSC、SSC 和残差块内部的短连接可以允许丰富的低频信息直接通过恒等映射向后传播,这可以保证信息的流动,加速网络的训练。
进一步,作者提出了通道注意力(Channel Attention)机制,通过对特征通道之间的相互依赖性建模来自适应地重新缩放每个通道的特征。实验证明,这种机制允许网络专注于更有用的信道并增强辨别学习能力。
3. 网络结构
3.1. CA

如上图所示,输入是一个 H×W×C 的特征,我们先进行一个空间的全局平均池化得到一个 1×1×C 的通道描述。接着,再经过一个下采样层和一个上采样层得到每一个通道的权重系数,将权重系数和原来的特征相乘即可得到缩放后的新特征,整个过程实际上就是对不同通道的特征重新进行了加权分配。
其中,下采样和上采样层都利用 1×1 的卷积来实现,下采样层的通道数减少 r 倍,激活函数为 Relu,上采样层的激活函数为 Sigmoid。在论文中,作者采用的通道数 C=64,r = 16。
3.2. RCAB
RCAB 就是将 CA 和残差思想融合在一起。

输入一个特征 input,我们首先进行一个卷积-Relu-卷积操作得到 f,然后 f 再经过一个 CA 模块进行重新缩放得到 x,最后将 x 和 input 相加得到输出特征。其中,卷积操作都采用 3×3 的卷积核。
RCAB 的一个 TensorFlow 实现如下所示:
def RCAB(input, reduction):
"""
@Image super-resolution using very deep residual channel attention networks
Residual Channel Attention Block
"""
batch, height, width, channel = input.get_shape() # (B, W, H, C)
f = tf.layers.conv2d(input, channel, 3, padding='same', activation=tf.nn.relu) # (B, W, H, C)
f = tf.layers.conv2d(f, channel, 3, padding='same') # (B, W, H, C)
x = tf.reduce_mean(f, axis=(1, 2), keepdims=True) # (B, 1, 1, C)
x = tf.layers.conv2d(x, channel // reduction, 1, activation=tf.nn.relu) # (B, 1, 1, C // r)
x = tf.layers.conv2d(x, channel, 1, activation=tf.nn.sigmoid) # (B, 1, 1, C)
x = tf.multiply(f, x) # (B, W, H, C)
x = tf.add(input, x)
return x
3.3. RG

一个 RG 则由 B 个 RCAB、一个卷积层和一个 SSC 组成,在本文中,B 取 20。
3.4. RCAN

输入一个低分辨率图片,先经过一个 3×3 的卷积提取特征 F,然后经过一个 RIR 模块:包含 10 个 RG、一个 3×3 的卷积和一个 LSC,最后是一个上采样层和一个 3×3 的卷积层,上采样层采取 ESPCNN。网络的损失函数是 L1 损失。
4. 实验结果

可以看到,如果移除 LSC 和 SSC 的话,无论有没有引入 CA 实验结果都很差,而添加这些跳跃连接后,模型的整体性能都会有所提升,说明 LSC 和 SSC 非常有效。同时,在同样的条件下,引入 CA 后模型性能也有所提升,验证了注意力机制的有效性。

在几个数据集上的测试结果,也表明 RCAN 取得了比以往方法更好的效果。如果采用几个模型集成的话,效果还能再提升,如上面 RCAN+ 所示。
一个主观的超分辨效果如下所示,可以看到 RCAN 恢复出了更多的细节和纹理。

获取更多精彩,请关注「seniusen」!

RCAN——Image Super-Resolution Using Very Deep Residual Channel Attention Networks的更多相关文章
- ASRWGAN: Wasserstein Generative Adversarial Network for Audio Super Resolution
ASEGAN:WGAN音频超分辨率 这篇文章并不具有权威性,因为没有发表,说不定是外国的某个大学的毕业设计,或者课程结束后的作业.或者实验报告. CS230: Deep Learning, Sprin ...
- Speech Super Resolution Generative Adversarial Network
博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/10874993.html 论文作者:Sefik Emre Eskimez , Kazuhito K ...
- Deep Residual Learning for Image Recognition (ResNet)
目录 主要内容 代码 He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition[C]. computer vi ...
- Deep Residual Learning
最近在做一个分类的任务,输入为3通道车型图片,输出要求将这些图片对车型进行分类,最后分类类别总共是30个. 开始是试用了实验室师姐的方法采用了VGGNet的模型对车型进行分类,据之前得实验结果是训练后 ...
- Computer Vision Applied to Super Resolution
Capel, David, and Andrew Zisserman. "Computer vision applied to super resolution." Signal ...
- 深度残差网(deep residual networks)的训练过程
这里介绍一种深度残差网(deep residual networks)的训练过程: 1.通过下面的地址下载基于python的训练代码: https://github.com/dnlcrl/deep-r ...
- [论文阅读] Deep Residual Learning for Image Recognition(ResNet)
ResNet网络,本文获得2016 CVPR best paper,获得了ILSVRC2015的分类任务第一名. 本篇文章解决了深度神经网络中产生的退化问题(degradation problem). ...
- 论文笔记:Deep Residual Learning
之前提到,深度神经网络在训练中容易遇到梯度消失/爆炸的问题,这个问题产生的根源详见之前的读书笔记.在 Batch Normalization 中,我们将输入数据由激活函数的收敛区调整到梯度较大的区域, ...
- Deep Residual Learning for Image Recognition这篇文章
作者:何凯明等,来自微软亚洲研究院: 这篇文章为CVPR的最佳论文奖:(conference on computer vision and pattern recognition) 在神经网络中,常遇 ...
随机推荐
- SpringCloud之Eureka注册中心原理及其搭建
一.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCl ...
- davinci 删除路线站点关系
删除路线站点关系 DELETE FROM tb_station_info_draw WHERE id in (SELECT stationId FROM tb_road_station_relatio ...
- CAFFE(0):Ubuntu 下安装anaconda2和anaconda3
这个步骤可以看做是安装caffe可以进行或者不必要的步骤,不过笔者建议安装anaconda2和anaconda3,里面会包含很多的模块,省去caffe学习过程中出现模块不存在的各种错误. 第一步.进入 ...
- Systemd: Service File Examples
大多数Linux发行版使用 systemd作为系统服务管理工具. systemctl是systemd的主要命令,用于管理控制服务. 这篇文章中将介绍如何创建允许你使用systemctl命令的sysyt ...
- 循环遍历 文件夹 生成makefile
在处理 openssl的makefile的source code问题,由于不支持makefile中添加整个文件夹,需要每个 .c 文件都要一个一个添加,所以做一个简单的脚本: #! /bin/bash ...
- python主要模块 和 常用方法简览
******************** PY核心模块方法 ******************** os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename ...
- ARM体系结构与编程读书笔记——处理器的寄存器
ARM处理器共有37个寄存器,其中包括: 31个通用寄存器,包括程序计数器(PC)在内,寄存器都是32位: 6个状态寄存器,这些寄存器都是32位的,目前只使用了其中12位: 通用寄存器 可以分为下面3 ...
- 关于join() 是否会释放锁的一些思考
# 首先从一个很有意思的问题开始: - 问 : Thread 的join() 方法是否会释放锁? - 答: 会! # 如果一切到这里就结束了,那可能也就没有这篇小记了,但是我的脑子却冒出了一些奇怪的想 ...
- Java&Selenium 鼠标键盘及滚动条控制相关方法封装
一.摘要 本片博文主要展示在使用Selenium with java做web自动化时,一些不得不模拟鼠标操作.模拟键盘操作和控制滚动条的java代码 二.模拟鼠标操作 package util; im ...
- Vue完成页面切换中加载数据
created() { // 拿到路由传递来的car主键 let pk = this.$route.query.pk || this.$route.params.pk; // 主键不存在,就直接结束方 ...