【CVPR2019】SRFBN
Feedback Network for Image Super-Resolution
Abstract:我们使用隐状态在**一个递归神经网络(RNN)**的约束来实现这种反馈方式
反馈块被设计用于处理反馈连接并生成强大的高维表示
课程学习策略
低分辨率图像被多种类型的退化所破坏
用回传机制来提高超分辨率的效果,且不引入过多的参数。
主要是设计了一个feedback模块,多次回传
普通dl的好处:深度和跳跃连接(residual或dense)
1.一个更复杂的LR-HR映射 保留更多的上下文信息与更大的感受野
2.可以有效地缓解简单地堆叠更多层以加深网络所引起的梯度消失/爆炸问题
为了减少网络参数,经常使用递归结构(recurrent structure)
DRCN DRRN
这些具有递归结构的网络可以以前馈方式共享信息
- 传统的深度学习方法(如VDSR、EDSR等)主要依赖于深度和跳跃连接(residual或dense)来增强网络的表示能力,但这些方法通常是前馈结构,无法利用高层信息来改进低层特征。
- 受人类视觉系统中反馈机制的启发,作者提出了一种反馈网络(SRFBN),通过反馈连接将高层信息传递回低层,从而改进低层特征表示。
1. 什么是隐藏状态?
隐藏状态是 RNN 中的一个关键概念,它表示网络在某一时刻的内部状态,包含了当前时刻的特征信息以及之前时刻的信息。在 SRFBN 中:
- 隐藏状态的来源:隐藏状态是反馈模块(Feedback Block, FB)的输出特征
Foutt F_{\text{out}}^t Foutt
,它包含了高层特征信息。 - 隐藏状态的作用:隐藏状态
Foutt F_{\text{out}}^t Foutt
会被传递到下一次迭代 t+1 ,作为输入的一部分,用于改进下一次迭代的特征表示。
在 SRFBN 中,隐藏状态的数学表达为:
Foutt=fFB(Foutt−1,Fint)
F_{\text{out}}^t = f_{\text{FB}}(F_{\text{out}}^{t-1}, F_{\text{in}}^t)
Foutt=fFB(Foutt−1,Fint)
其中:
-
Foutt−1 F_{\text{out}}^{t-1} Foutt−1
:上一轮迭代的隐藏状态(高层特征)。
-
Fint F_{\text{in}}^t Fint
:当前轮迭代的输入特征(低层特征)。
-
fFB f_{\text{FB}} fFB
:反馈模块的操作。
2. RNN 如何通过多次迭代逐步改进输出图像?
RNN 的核心特性是时间上的递归,即每次迭代的输出会作为下一次迭代的输入,从而实现信息的逐步优化。在 SRFBN 中,这种递归特性被用来逐步改进图像超分辨率的结果。
2.1 SRFBN 的迭代过程
SRFBN 的迭代过程可以分为以下几个步骤:
- 初始输入:低分辨率图像
ILR I_{\text{LR}} ILR
被输入到网络中,经过特征提取模块(LR Feature Block, LRFB)生成初始特征 ( F_{\text{in}}^1 )。 - 反馈模块处理:反馈模块接收当前输入特征
Fint F_{\text{in}}^t Fint
和上一轮的隐藏状态
Foutt−1 F_{\text{out}}^{t-1} Foutt−1
,生成新的隐藏状态
Foutt F_{\text{out}}^t Foutt
。 - 重建模块生成输出:重建模块(Reconstruction Block, RB)利用隐藏状态
Foutt F_{\text{out}}^t Foutt
生成当前迭代的超分辨率图像
ISRt I_{\text{SR}}^t ISRt
。 - 反馈连接:隐藏状态
Foutt F_{\text{out}}^t Foutt
被传递到下一次迭代 ( t+1 ),作为下一次迭代的输入之一。 - 多次迭代:重复上述过程 ( T ) 次,每次迭代都会生成一个中间的超分辨率图像
ISRt I_{\text{SR}}^t ISRt
。
最终的高分辨率图像是最后一次迭代的输出
ISRT
I_{\text{SR}}^T
ISRT
。
2.2 数学公式
在第 ( t ) 次迭代中,SRFBN 的操作可以用以下公式表示:
-
特征提取:
Fint=fLRFB(ILR)其中fLRFB是特征提取模块的操作。 F_{\text{in}}^t = f_{\text{LRFB}}(I_{\text{LR}}) 其中 f_{\text{LRFB}} 是特征提取模块的操作。 Fint=fLRFB(ILR)其中fLRFB是特征提取模块的操作。 -
反馈模块:
Foutt=fFB(Foutt−1,Fint)反馈模块结合了当前输入特征和上一轮的隐藏状态,生成新的隐藏状态。 F_{\text{out}}^t = f_{\text{FB}}(F_{\text{out}}^{t-1}, F_{\text{in}}^t) 反馈模块结合了当前输入特征和上一轮的隐藏状态,生成新的隐藏状态。 Foutt=fFB(Foutt−1,Fint)反馈模块结合了当前输入特征和上一轮的隐藏状态,生成新的隐藏状态。 -
重建模块:
IRest=fRB(Foutt)其中IRest是当前迭代生成的残差图像 I_{\text{Res}}^t = f_{\text{RB}}(F_{\text{out}}^t)其中 I_{\text{Res}}^t 是当前迭代生成的残差图像 IRest=fRB(Foutt)其中IRest是当前迭代生成的残差图像 -
最终输出:
ISRt=IRest+fUP(ILR) I_{\text{SR}}^t = I_{\text{Res}}^t + f_{\text{UP}}(I_{\text{LR}}) ISRt=IRest+fUP(ILR)
通过全局残差跳跃连接(Global Residual Skip Connection),将残差图像与上采样后的低分辨率图像相加,生成当前迭代的超分辨率图像。
3. 为什么隐藏状态可以逐步改进输出图像?
隐藏状态的逐步改进能力来源于以下几个方面:
3.1 高层特征的反馈
- 隐藏状态包含了高层特征信息,这些信息可以帮助网络更好地理解图像的全局结构和细节。
- 在每次迭代中,高层特征会被传递回低层特征,改进低层特征的表示能力,从而生成更精细的超分辨率图像。
3.2 多次迭代的优化
- 每次迭代都会生成一个中间的超分辨率图像并通过损失函数对其进行优化。
- 这种逐步优化的过程使得网络能够在早期迭代中快速生成粗略的超分辨率图像,并在后续迭代中逐步改进细节。
3.3 信息的循环利用
- 通过反馈机制,网络可以重复利用之前迭代中生成的高层特征,避免信息的浪费。
- 这种循环利用的机制使得网络能够在参数量较少的情况下实现高效的特征表示。
4. SRFBN 的反馈机制与传统 RNN 的区别
SRFBN 的反馈机制与传统 RNN 有以下区别:
-
隐藏状态的定义:
- 在传统 RNN 中,隐藏状态通常是通过全连接层或 LSTM 单元生成的。
- 在 SRFBN 中,隐藏状态是通过卷积操作生成的特征图,包含了图像的空间信息。
-
反馈模块的设计:
- SRFBN 的反馈模块由上采样和下采样操作以及**密集跳跃连接(Dense Skip Connections)**组成,能够生成更强大的高层特征表示。
- 这种设计使得 SRFBN 更适合处理图像超分辨率任务。
-
多次迭代的目标:
- 在传统 RNN 中,多次迭代的目标通常是生成一个序列的输出。
- 在 SRFBN 中,多次迭代的目标是逐步改进同一个图像的超分辨率结果。
FB模块(Feedback Block, FB)
投影组(Projection Group) 是一个由上采样和下采样操作组成的核心单元
它的主要作用是通过特征的升降维操作,生成高层和低层特征,并通过密集跳跃连接实现特征的高效复用
就是前面的conv的输出是一定会加到后面的conv的输入中,前面Deconv的输出也是加到后面Deconv的输入中,有点类似densenet的做法,防止梯度消失
for idx in range(self.num_groups):
self.upBlocks.append(DeconvBlock(num_features, num_features,
kernel_size=kernel_size, stride=stride, padding=padding,
act_type=act_type, norm_type=norm_type))
self.downBlocks.append(ConvBlock(num_features, num_features,
kernel_size=kernel_size, stride=stride, padding=padding,
act_type=act_type, norm_type=norm_type, valid_padding=False))
if idx > 0:
self.uptranBlocks.append(ConvBlock(num_features*(idx+1), num_features,
kernel_size=1, stride=1,
act_type=act_type, norm_type=norm_type))
self.downtranBlocks.append(ConvBlock(num_features*(idx+1), num_features,
kernel_size=1, stride=1,
act_type=act_type, norm_type=norm_type))
Curriculum learning strategy
将训练集的图像按照困难程度排序,loss函数还是l1loss
Wt是一个常量,用来衡量第T轮迭代对输出值的影响。(实际上论文里每一轮都置为1了……)
实验
用PRelu作为激活函数,训练集是Div2K和Flickr2K,测试仅在Y通道(基本上所有工作都是这样的)。
其中,patch size每一个scale factor都是不一样的
performance and parameters
这里没用放RCAN和RDN的数据,实际上SRFBN没达到SOFT,现在最好的还是RCAN