【文章阅读】【超解像】–Residual Dense Network for Image Super-Resolution

论文链接:https://arxiv.org/pdf/1802.08797.pdf

code:https://github.com/yulunzhang/RDN

1.主要贡献

​ 本文作者结合Residual Black和Dense Black提出了RDN(Residual Dense Network)网络结构,网络主要由RDB(Residual Dense block)网络组成,网络的结构图如下:

2.论文分析

如上图,网络主要由四部分构成:

(1) SFFNet(shallow feature extraction net)

​ 上图中的前两个卷基层组成了SFFNet,上图中的F0=HSFE2(F−1)F _ { 0 } = H _ { S F E 2 } \left( F _ { - 1 } \right)F0​=HSFE2​(F−1​),F−1=HSFE1(ILR)F _ { - 1 } = H _ { S F E 1 } \left( I _ { L R } \right)F−1​=HSFE1​(ILR​) F0F_0F0​为SFFNet输出.

(2) RDBs(redidual dense blocks)

​ 上图中F1,FdF_1,FdF1​,Fd表示该模块的中间模块输出,根据之前的输入获得:
Fd=HRDB,d(Fd−1)=HRDB,d(HRDB,d−1(⋯(HRDB,1(F0))⋯ ))\begin{aligned} F _ { d } & = H _ { R D B , d } \left( F _ { d - 1 } \right) \\ & = H _ { R D B , d } \left( H _ { R D B , d - 1 } \left( \cdots \left( H _ { R D B , 1 } \left( F _ { 0 } \right) \right) \cdots \right) \right) \end{aligned} Fd​​=HRDB,d​(Fd−1​)=HRDB,d​(HRDB,d−1​(⋯(HRDB,1​(F0​))⋯))​
​ 该模块的结构图为:

​ 该模块将残差模块Residual block和dense block模块进行了整合,三个模块的区别如下:

​ RDB模块的输入是Fd−1F_{d-1}Fd−1​,输出FdF_dFd​, G0G_0G0​表示Fd−1F_{d-1}Fd−1​和FdF_{d}Fd​的特征向量数,RDB中间某层输出为:
Fd,c=σ(Wd,c[Fd−1,Fd,1,⋯ ,Fd,c−1])F _ { d , c } = \sigma \left( W _ { d , c } \left[ F _ { d - 1 } , F _ { d , 1 } , \cdots , F _ { d , c - 1 } \right] \right) Fd,c​=σ(Wd,c​[Fd−1​,Fd,1​,⋯,Fd,c−1​])
假设Fd,cF_{d,c}Fd,c​包含GGG个特征图(GGG也被称为增长率);

RDB模块中主要包含3个部分内容:

  • Contiguous memory

    该模块将Fd−1,Fd,1,Fd,c,FdCF_{d-1},F_{d,1},F_{d,c},F_{dC}Fd−1​,Fd,1​,Fd,c​,FdC​的特征都结合起来;

  • Local feature fusion

    该模块是concat之后的1∗11*11∗1卷积操作,该操作的作用是CM后非常多的feature map不易于模型训练,利用该模块对输出的维度进行了压缩.

  • Local residual learning

    该模块表示将Fd−1F_{d-1}Fd−1​和Fd,LFF_{d,LF}Fd,LF​的特征进行融合,该操作有助于提升模型的表达能力;
    Fd=Fd−1+Fd,LFF _ { d } = F _ { d - 1 } + F _ { d , L F } Fd​=Fd−1​+Fd,LF​

(3) DFF(Dense feature fusion)

​ 该模块主要包含两个模块,Global feature fusion和Global Residual learning,其中Global feature fusion模块的作用是将F1,F2,......FDF_1,F_2,......FDF1​,F2​,......FD联合起来FGF=HGFF([F1,⋯ ,FD])F _ { G F } = H _ { G F F } \left( \left[ F _ { 1 } , \cdots , F _ { D } \right] \right)FGF​=HGFF​([F1​,⋯,FD​]),Global Residual learning表示将F−1F_{-1}F−1​和FGFF_{GF}FGF​相加得到FDFF_{DF}FDF​输出,FDF=F−1+FGFF _ { D F } = F _ { - 1 } + F _ { G F }FDF​=F−1​+FGF​.该操作和RDB操作一样.

(4) UPNet(Up-sampleing net)

​ 该模块在网络的最后利用上采样和卷积实现图像的放大.

RDN与DenseNet区别:

  • RDN中去掉了DenseNet中的BN和pooling模块;
  • DenseNet中只有每一个dense block的输出是concat起来的,而RDB中的利用局部特征融合将RDB中的各层信息都进行了融合;
  • RDN利用全局特征融合将各个RDB模块中的信息都concat起来,并利用了最开始的特征;

RDN与SRDenseNet的区别:

  • RDN加入了contiguous memory,使得先前的RDB模块和当前的模块信息直接融合,利用LFF,RDB模块可以利用更大的增长率;RDB中的LRF的应用增加了信息和梯度的流动;
  • RDB内部没有密集连接.
  • RDB使用了L1 loss,而SRDenseNet使用了L2 loss;

RDN与MemNet区别:

  • MemNet需要对原图使用Bicubic插值方式对低分辨率图像进行上采样,RDN直接使用低分辨率图像进行处理,减少了计算量和提高效率;
  • Memnet中包含逆向和门限单元模块,不接受先前模块的输入,而RDB的各个模块之间是有信息交流的;
  • MemNet没有全部利用中间的特征信息,而RDN利用GRL将所有的信息都利用起来;

3.结果分析

训练数据集:利用DIV2K进行训练,进行如下3种处理:

(1) BI方式:通过Bicubic对图像进行下采样,缩小比例为x2,x3,x4;

(2)BD方式:先对原图进行(7∗77*77∗7卷积,方差为1.6)的高斯滤波,再对滤波后的图像进行下采样;

(3)DN方法:先做Bicubic下采样,再加上30%的高斯噪声;





4.参考

1.https://blog.csdn.net/qq_14845119/article/details/81459859

5.附录

RDB的Pytorch代码实现如下:

class RDB_Conv(nn.Module):def __init__(self, inChannels, growRate, kSize=3):super(RDB_Conv, self).__init__()Cin = inChannelsG  = growRateself.conv = nn.Sequential(*[nn.Conv2d(Cin, G, kSize, padding=(kSize-1)//2, stride=1),nn.ReLU()])def forward(self, x):out = self.conv(x)return torch.cat((x, out), 1) class RDB(nn.Module):def __init__(self, growRate0, growRate, nConvLayers, kSize=3):super(RDB, self).__init__()G0 = growRate0G  = growRateC  = nConvLayersconvs = []for c in range(C):convs.append(RDB_Conv(G0 + c*G, G))self.convs = nn.Sequential(*convs)# Local Feature Fusionself.LFF = nn.Conv2d(G0 + C*G, G0, 1, padding=0, stride=1)def forward(self, x):return self.LFF(self.convs(x)) + x

RDN的Pytorch代码如下:

class RDN(nn.Module):def __init__(self, args):super(RDN, self).__init__()r = args.scale[0]G0 = args.G0kSize = args.RDNkSize# number of RDB blocks, conv layers, out channelsself.D, C, G = {'A': (20, 6, 32),'B': (16, 8, 64),}[args.RDNconfig]# Shallow feature extraction netself.SFENet1 = nn.Conv2d(args.n_colors, G0, kSize, padding=(kSize-1)//2, stride=1)self.SFENet2 = nn.Conv2d(G0, G0, kSize, padding=(kSize-1)//2, stride=1)# Redidual dense blocks and dense feature fusionself.RDBs = nn.ModuleList()for i in range(self.D):self.RDBs.append(RDB(growRate0 = G0, growRate = G, nConvLayers = C))# Global Feature Fusionself.GFF = nn.Sequential(*[nn.Conv2d(self.D * G0, G0, 1, padding=0, stride=1),nn.Conv2d(G0, G0, kSize, padding=(kSize-1)//2, stride=1)])# Up-sampling netif r == 2 or r == 3:self.UPNet = nn.Sequential(*[nn.Conv2d(G0, G * r * r, kSize, padding=(kSize-1)//2, stride=1),nn.PixelShuffle(r),nn.Conv2d(G, args.n_colors, kSize, padding=(kSize-1)//2, stride=1)])elif r == 4:self.UPNet = nn.Sequential(*[nn.Conv2d(G0, G * 4, kSize, padding=(kSize-1)//2, stride=1),nn.PixelShuffle(2),nn.Conv2d(G, G * 4, kSize, padding=(kSize-1)//2, stride=1),nn.PixelShuffle(2),nn.Conv2d(G, args.n_colors, kSize, padding=(kSize-1)//2, stride=1)])else:raise ValueError("scale must be 2 or 3 or 4.")def forward(self, x):f__1 = self.SFENet1(x)x  = self.SFENet2(f__1)RDBs_out = []for i in range(self.D):x = self.RDBs[i](x)RDBs_out.append(x)x = self.GFF(torch.cat(RDBs_out,1))x += f__1return self.UPNet(x)

论文个人理解,如有问题,烦请指正,谢谢!

【文章阅读】【超解像】--Residual Dense Network for Image Super-Resolution相关推荐

  1. 【图像复原】RDN论文详解(Residual Dense Network for Image Restoration)

    这是CVPR2018的一篇文章,提出了针对图像复原任务的CNN模型RDN(residual dense network). RDN主要是提出了网络结构RDB(residual dense blocks ...

  2. 超分算法RDN:Residual Dense Network for Image Super-Resolution 超分辨率图像重建

    这篇文章总结分析了ResNet 和DenseNet的优缺点,并将其结合,提出了新的结构ResidualDenseNet.文章中对ResNet 和DenseNet以及MemNet都进行了简单的对比分析. ...

  3. Residual Dense Network for Image Super-Resolution 代码详解

    Residual Dense Network for Image Super-Resolution 以下是 RND论文Tensorflow版本实现的源码解析,我假设你已经了解Python的基本语法,和 ...

  4. 图像超分辨率:小米低功耗超分,适用于移动端Extreme Low-Power Super Resolution Network For Mobile Devices

    4. ELSR: Extreme Low-Power Super Resolution Network For Mobile Devices 小米的论文,网络很简单很快,训练步骤比较多.

  5. 超分辨率重建学习总结、SR、super resolution、single image super resolution

    目录 背景 方法 结论 挖坑,超分辨率重建.一直关注超分辨重建任务,最近着力研究超分辨率重建,随着我个人的任务进行,我会逐渐更新完善本栏目,将写一些经典方法的介绍,超分辨率重建的较为系统的学习,代码复 ...

  6. (MACN小米AI 轻量化SISR)A Matrix-in-matrix Neural Network for Image Super Resolution

    代码:https://github.com/macn3388/MCAN 1.简介 现存的SISR方法难以 用在手机等移动设备上面. However, these GAN-based methods i ...

  7. [论文阅读] Facial Expression Recognition Using Residual Masking Network

    Facial Expression Recognition Using Residual Masking Network 论文链接:https://ieeexplore.ieee.org/docume ...

  8. php获取微信文章阅读数,详解PHP+fiddler抓包采集微信文章阅读数点赞数的思路

    简介: 分析接口知道要获取文章阅读数和点赞数必须有key和uin这两个关键参数,不同公众号key不一样(据说有万能微信key,不懂怎么搞到),同一个公众号key大概半小时会过期 提交链接获取文章阅读量 ...

  9. fiddler抓包获取mysql密码_PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解

    简介: 分析接口知道要获取文章阅读数和点赞数必须有key和uin这两个关键参数,不同公众号key不一样(据说有万能微信key,不懂怎么搞到),同一个公众号key大概半小时会过期 提交链接获取文章阅读量 ...

最新文章

  1. usb调试模式已打开,adb devices显示List of devices attached 解决办法!纽维K333一键ROOT,获取ROOT权限!...
  2. hadoop2.610集群配置(包含HA和Hbase )
  3. 选择创业项目的基础——适合自己的才是最好的
  4. MySQL主从复制简单设置
  5. Django两天搭建个人博客
  6. CK8和CK18的含义
  7. dwr和ajax的区别,dwr的ajax实现
  8. 全国计算机等级考试题库二级C操作题100套(第29套)
  9. ×××送通知服务教程 Apple Push Notification Services Tutorial
  10. 将m文件通过matlab 的编译器转换为可执行文件,【转】 Matlab中提高m文件执行效率的小技巧...
  11. 谈判中,要学会“留一手”
  12. java_eclipse中添加外部动态链接库(dll文件)的三种方式
  13. 读书笔记--对象、实例、原型、继承 1
  14. 超实用的自我规划模型 | 进击
  15. 设计自有芯片将成为新常态?
  16. 平安人寿“内鬼”泄露近4万条公民信息
  17. SpringMVC总结-SpringMVC的运行流程以及简单运用
  18. python递归查找文件
  19. 通达信标记符号_通达信指标中赋值符号“:”、“=”、“:=”区别?
  20. python使用pip命令自动下载安装库

热门文章

  1. 取模后的余数,向负无穷方向舍入
  2. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(1):Cortex-M3处理器程序模型
  3. 【高分一号影像数据命名规则】
  4. 微信小程序上传和下载文件
  5. Credential Provider
  6. 机器视觉系统不同检测场景的光源选择技巧
  7. 远程计算机或设备将不受连接(能联网QQ能上,但浏览器无法上网)
  8. apache 开启php fpm,apache php fpm安装方法详解
  9. VMware Tools (ubuntu系统)安装详细过程与使用
  10. 九张图读懂大数据医疗