超分之RDN

在这里插入图片描述

这篇文章提出了一种结合ResNet结构和DenseNet结构的深度超分网络——Residual Dense Network(后文简称RDN)。RDN基于Residual Dense Block(后文简称RDB)块以及全局残差连接来提取全局特征,而RDB块基于Dense结构和局部残差连接进一步提取局部特征。通过这种结构,作者最大化利用了 L R LR LR不同层级的特征,在当时取得了SOTA的表现力。

Note:

  1. 这篇文章和RCAN是同一批作者。

参考文档:

  1. 转载于博主暖风博文:超分算法RDN
  2. ResNet
  3. DenseNet

Abstract

在这里插入图片描述

这篇文章提出的原因在于之前的SISR算法都没有很全面地利用 L R LR LR层级中所有的特征信息,如SRDenseNet宽度网络EDSRSRGAN(内置SRResNet)等这些虽然利用了不同层级的特征信息,但是还不够,还有更多的信息没有提取;再比如SRCNNFSRCNNDCSCNESPCN等这种就很少利用不同层级的特征信息。故为了解决这个问题,作者提出了最大化提取利用 L R LR LR层级所有的特征信息的SR算法——RDN。

RDN具有如下特点:

  1. RDN基于RDB模块和全局残差连接,其中RDB模块内部有 C C C个层,它们组成Dense结构和局部残差连接可以充分提取局部特征
  2. RDB模块会接受上一个RDB模块的特征信息,该特征信息会分别传到RDB中稠密结构的每一级,从而构成相邻存储机制(contiguous memory)。
  3. 为了缓解RDB中Dense结构带来网络过宽而不稳定的现象,作者在RDB的末端加入了 1 × 1 1\times 1 1×1瓶颈层来缩小输出通道。
  4. RDN将 D D D个RDB块通过concat融合起来并使用全局残差连接来提取全局特征信息
  5. RDN经实验证明确实充分提取了特征信息,当时取得了SOTA的表现力!
  6. 整个RDN网络包括低层特征提取、高层(深层)特征提取(局部特征提取+全局特征提取)、上采样层、重建层。

1 Introduction

这篇论文的贡献如下:

  1. 提出了一个可充分提取图像 L R LR LR层级所有特征信息的超分网络RDN,其网络结构如下:在这里插入图片描述整个RDN主要基于 D D D个RDB模块进行全局特征融合(GFF)和全局残差学习(GRL其实就是Long skip connection),将每个RDB提取的局部特征进行concat融合之后和来自低层特征信息进行残差连接,从而使得低层特征和高层特征相结合并迫使网络去学习更多的残差信息。我们通过GFF和GRL组成的Dense Feature Fusion(DFF)来提取全局特征。
  2. RDB模块用于充分提取 L R LR LR层级的局部特征,其网络结构如下:在这里插入图片描述
    整个RDB模块由 C C C个卷积层(包括ReLU)通过Dense结构相连(LFF),并使用局部残差学习LRL(其实就是short skip connection)将上一个RDB输出的特征信息和当前RDB输出的特征信息进行结构。此外上一个RDB的输出特征还会依次加入到Dense结构的每一个层中,形成相邻存储(CM) 。此外,由于每个RDB中设置了 1 × 1 1\times 1 1×1的瓶颈层来缩小输出通道,从而整个RDB块就允许设置较大的Dense growth rate。

2 Related Work

3 Residual Dense Network for Image SR

接下来我们具体分析下RDN的网络结构。

3.1 Network Structure

在这里插入图片描述

如上图所示就是整个RDN的网络结构:它包括浅层特征提取、RDBs、dense特征融合(DFF)、上采样层组成;不过我更喜欢用浅层特征提取、深层特征提取、上采样层、重建层来表示。


①浅层特征提取
和很多SR算法一样,浅层特征的提取往往只用 1 − 2 1-2 12 3 × 3 3\times 3 3×3卷积层实现,具体表达式为:
F − 1 = H S F E 1 ( I L R ) . (1) F_{-1} = H_{SFE1}(I_{LR}).\tag{1} F1=HSFE1(ILR).(1)其中 H S F E 1 ( ⋅ ) H_{SFE1}(\cdot) HSFE1()表示浅层特征第一层卷积层,它通过GRL和深层特征进行残差相连。
浅层特征提取的第二层用数学表达式为:
F 0 = H S F E 2 ( F − 1 ) . (2) F_0 = H_{SFE2}(F_{-1}).\tag{2} F0=HSFE2(F1).(2)其中 H S F E 2 ( ⋅ ) H_{SFE2}(\cdot) HSFE2()表示浅层特征提取的第二层卷积层,它用来作为第一个RDB块的输入。

②深层特征提取
假设深层特征提取一共有 D D D个RDB块,那么对于 d ∈ { 1 , ⋯   , D } d\in \{1,\cdots,D\} d{1,,D},第 d d d个RDB块的输入输出可表示为:
F d = H R D B , d ( F d − 1 ) = H R D B , d ( H R D B , d − 1 ( ⋯ ( H R D B , 1 ( F 0 ) ) ⋯   ) ) . (3) F_d = H_{RDB,d}(F_{d-1})=H_{RDB,d}({\color{lightseagreen}H_{RDB,d-1}(\cdots({\color{mediumorchid}H_{RDB,1}(F_0)})\cdots)}).\tag{3} Fd=HRDB,d(Fd1)=HRDB,d(HRDB,d1((HRDB,1(F0)))).(3)其中 F d F_d Fd表示第 d d d个RDB块输出的局部特征, H R D B , d ( ⋅ ) H_{RDB,d}(\cdot) HRDB,d()是第 d d d个RDB块算子,表示深层特征提取。

Dense Feature Fusion(DFF):最后将 D D D个RDBs的所有局部特征进行concat之后,用 1 × 1 1\times 1 1×1瓶颈层进行降维并使用一个 3 × 3 3\times 3 3×3卷积层进一步提取深层特征,最后输出的就是全局特征 F G F F_{GF} FGF。全局特征和来自浅层特征 F − 1 F_{-1} F1通过GRL进行残差相连输出最终的Dense Feature—— F D F F_{DF} FDF,表达式为:
F D F = H D F F ( F − 1 , F 0 , F 1 , ⋯   , F D ) . (4) F_{DF} = H_{DFF}(F_{-1},F_0, F_1,\cdots,F_D).\tag{4} FDF=HDFF(F1,F0,F1,,FD).(4)其中 H D F F ( ⋅ ) H_{DFF}(\cdot) HDFF()表示整个DFF过程,它是GFF和GRL的结合。

③上采样层
上采样层采用ESPCN提出的亚像素卷积层,这种方式既节约存储资源又有较高效的执行效率,使用PyTorch可以直接调用torch.nn.PixelShuffle(r),具体可见我的另一篇PyTorch之PixelShuffle

④重建层
和其他SR结构一样,重建层可以重用一层 3 × 3 3\times 3 3×3卷积层代替,来进一步调整校正上采样的结构。


整个RDN网络的前向过程可表示为:
I S R = H R D N ( I L R ) . (5) I_{SR} = H_{RDN}(I_{LR}).\tag{5} ISR=HRDN(ILR).(5)其中 H R D N ( ⋅ ) H_{RDN}(\cdot) HRDN()是RDN网络算子,表示上述4个过程的串接总和。

3.2 Residual Dense Block

接下来我们从上往下分析RDB的结构,如下图所示:
在这里插入图片描述
整个RDB块由CM机制、Dense结构、局部特征融合LFF以及局部残差学习LRL组成,接下来我们分别介绍这4个部分。

①CM机制
CM,相邻存储机制,指的是对于每个RDB块中每个Dense块的每一层 c ∈ { 1 , ⋯   , C } c\in \{1, \cdots, C\} c{1,,C}都会接受来自于上一个RDB块输出的局部特征。

②Dense结构
和SRDenseNet结构类似,我们在RDB中使用Dense结构:在这里插入图片描述
我们直接用表达式为(不了解Dense块的前向过程可阅读DenseNet的论文):
F d , c = σ ( W d , c [ F d − 1 , F d , 1 , ⋯   , F d , c − 1 ] ) . (6) F_{d,c} = \sigma(W_{d,c}[F_{d-1},F_{d,1},\cdots, F_{d,c-1}]).\tag{6} Fd,c=σ(Wd,c[Fd1,Fd,1,,Fd,c1]).(6)其中 F d , c F_{d,c} Fd,c表示为第 c c c层输出的局部特征,其深度为 G G G,表示DenseNet中的Growth rate; W d , c W_{d,c} Wd,c表示第 d d d个RDB中第 c c c层的卷积层参数,这里省略bias; σ ( ⋅ ) \sigma(\cdot) σ()表示ReLU; [ F d − 1 , F d , 1 , ⋯   , F d , c − 1 ] [F_{d-1},F_{d,1},\cdots, F_{d,c-1}] [Fd1,Fd,1,,Fd,c1]表示上一个RDB的输出 F d − 1 F_{d-1} Fd1、前 c − 1 c-1 c1层输出的局部特征通过concat堆叠而成,其深度为 G 0 + ( c − 1 ) G G_0+(c-1)G G0+(c1)G

Note:

  1. 经典DenseNet块相比,在本文的Dense结构中去掉了BN层。一来是BN层的存储消耗和一层卷积层类似,我们大可以节省下这部分资源而用卷积层代替进一步提升模型复杂度;二来是在EDSR中文中提出了不同于识别等高级计算机任务,BN并不适用于超分任务。
  2. 每个RDB块的输出和输出feature map( F d F_d Fd)的深度都是 G 0 G_0 G0

③局部特征融合
我们将上一个RDB的输出 F d − 1 F_{d-1} Fd1、当前RDB中 C C C个层输出的所有局部特征进行concat融合,表达式为:
F d , L F = H L F F d ( [ F d − 1 , F d , 1 , ⋯   , F d , c , ⋯   , F d , C ] ) . (7) F_{d,LF} = H^d_{LFF}([F_{d-1}, F_{d,1}, \cdots, F_{d,c}, \cdots, F_{d,C}]).\tag{7} Fd,LF=HLFFd([Fd1,Fd,1,,Fd,c,,Fd,C]).(7)其中算子 H L F F d ( ⋅ ) H^d_{LFF}(\cdot) HLFFd()表示在第 d d d个RDB中将所有层特征信息进行融合,并使用 1 × 1 1\times 1 1×1进行缩减输出feature map的通道,从而避免Dense结构导致网络过宽而让训练不稳定的问题,缩减后的输出 F d , L F F_{d,LF} Fd,LF的通道数为 G 0 + C ∗ G → G 0 G_0+C*G\to G_0 G0+CGG0
Note:

  1. LFF的存在允许让Dense结构的RDB拥有更大的增长率Growth rate!

④局部残差学习
作者指出在上述结构基础上再添加LRL结构可以进一步提升整体的表现力,因此LRL的引入也是有必要的,其数学表达式为:
F d = F d − 1 + F d , L F . (8) F_d = F_{d-1} + F_{d,LF}.\tag{8} Fd=Fd1+Fd,LF.(8)

3.3 Dense Feature Fusion

当对所有RDBs输出的局部特征进行concat融合之后并使用全局残差学习GRL进一步将不同层级特征进行融合之后,就可以将输出的feature map进行上采样了。而上述这个过程就是Dense Feature Fusion(DFF)做的事情,它包括全局特征融合GFF和全局残差学习GRL两个部分。

①全局特征融合GFF
通过GFF将各个RDBs输出的局部特征信息进行concat融合,并使用 1 × 1 1\times 1 1×1卷积层进行通道缩减以及 3 × 3 3\times 3 3×3卷积层进一步提取高层特征信息,这一层也很重要,它提取之后的特征和来自低层的信息 F − 1 F_{-1} F1进行残差融合会产生不错的性能提升,这在SRGAN结构中也得到了体现:在这里插入图片描述
用数学表达式为:
F G F = H G F F ( [ F 1 , ⋯   , F D ] ) . (9) F_{GF} = H_{GFF}([F_1, \cdots, F_D]).\tag{9} FGF=HGFF([F1,,FD]).(9)其中算子 H G F F ( ⋅ ) H_{GFF}(\cdot) HGFF()表示的就是上述过程。

②全局残差学习GRL
类似于RDBs中的LRL,GRL也是将低层特征信息和高层特征信息进行残差连接,具体表达式为:
F D F = F − 1 + F G F . (10) F_{DF} = F_{-1} + F_{GF}.\tag{10} FDF=F1+FGF.(10)
最后的输出 F D F F_{DF} FDF就是我们下一个环节上采样的输入。

3.4 Implementation Details

  1. 除了 1 × 1 1\times 1 1×1的卷积层之外,其余所有卷积层都是用 3 × 3 3\times 3 3×3卷积核大小的滤波器。
  2. G 0 = 64 G_0=64 G0=64
  3. 最后重建层输出通道数为3,当然也可是处理灰度图,即通道数为1。

4 Discussions

①Difference to DenseNet

  1. 一般来说,DenseNet广泛用于高级计算机视觉任务(如目标识别),而RDN是为图像SR这种简单任务设计的。因此去掉了批处理规范化(BN)层,减轻了GPU内存消耗,减小了计算复杂度,并提升了网络性能。
  2. 在DenseNe中,两个相邻Dense块之间使用过渡层。而在RDN中,密集连接层输出与局部特征融合输出(LFF)的结合方式是使用局部残差学习(LRL),这在实验中证明是非常有效的。
  3. 采用全局特征融合来充分利用DenseNet中忽略的层次特征。

②Difference to SRDenseNet

  1. 第一个是基本架构块的设计不同。本文的残差密集块(RDB)从三个方面做了改进:一、引入了相邻存储(CM)机制,它允许前面RDB的状态直接访问当前RDB的每一层。二、通过使用局部特征融合(LFF),RDB允许更大的增长率,从而能够更稳定地训练深度网络。三、局部残差学习(LRL)被用于RDB,以进一步优化信息流和梯度。
  2. 第二个不同是RDB之间没有紧密的连接。相反,RDB使用全局特征融合(GFF)和全局残差学习来提取全局特征,因为具有相邻内存的RDB已经完整的提取了局部特征。
  3. SRDenseNet使用L2损失函数。而RDN使用了L1损失函数,L1损失函数已被证实了对性能具有更强大的收敛性。

5 Experiments

实验部分可参考:超分算法RDN:Residual Dense Network for Image Super-Resolution 超分辨率图像重建

6 Conclusion

  1. 文章提出了一种具有非常深的SISR结构——RDN。RDN通过结合ResNet和DenseNet的优势在 L R LR LR层级上最大化提取所有的特征信息。
  2. RDN基于RDB以及全局残差学习(GRL),每个RDB块中包含了Dense结构,通过LFF来提取融合每一层局部信息之后的特征信息,并于LRL的另一端,即来自上个RDB块的局部特征信息进行残差结合输出当前RDB块最终的局部特征信息。GFF将所有来自RDBs的局部信息进行融合产生全局信息 F G F F_{GF} FGF,并于GRL另一端,即低层特征信息 F − 1 F_{-1} F1进行残差结合输出最终的特征信息。
  3. RDN属于SISR方法,其结构主要包括低层特征提取深层特征提取上采样层、重建层。本文中上采样层采用亚像素卷积层,而深层特征提取GFF是RDN的重点。
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RDN(Residual Dense Network)是一种深度残差网络,它可以将超分辨率图像生成任务转化为深层次非线性映射。PyTorch是一种基于Python的深度学习框架,使用起来十分方便。PyTorch实现RDN的步骤如下: 1. 数据集准备 首先需要准备足够数量的训练数据集、测试数据集和验证数据集。对于超分辨率任务,训练集应该是原始分辨率图像和相应的高分辨率图像。数据集应该准备好后进行预处理,比如进行裁剪、旋转、翻转或者其他的数据增强操作。 2. 定义RDN网络结构 在PyTorch中,可以使用nn.Module类来定义神经网络模型,在该类中重写forward函数来定义网络的前向传播过程。可以使用PyTorch内置的神经网络层来构建网络,也可以自定义某些层。RDN网络结构包含多个密集块和一个全局残差连接。可以参考RDN的论文来确定网络结构和参数设置。 3. 定义损失函数 RDN网络的训练需要使用损失函数进行优化,常见的损失函数包括均方误差(MSE)和感知损失(Perceptual Loss)。在PyTorch中,可以使用nn.MSELoss和nn.L1Loss来实现MSE和L1损失函数,也可以自定义其他损失函数。 4. 训练网络 在准备好数据集、网络结构和损失函数后,就可以开始训练RDN网络了。可以使用PyTorch内置的优化器如Adam、SGD等来更新网络权重,并且可以使用PyTorch提供的学习率衰减策略来控制学习率的更新。每个epoch结束后,要保存网络的参数和状态,以便后续使用。 5. 测试和部署网络 训练好的RDN网络可以用于超分辨率图像生成任务。在PyTorch中,可以使用训练的RDN网络来对测试集和验证集中的图像进行超分辨率处理,并使用评价指标如PSNR和SSIM来衡量结果。部署网络可以将网络封装成可执行的应用程序或者服务,用于实际场景应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值