第一篇用深度学习做超分的文章,就是用深度学习来表示传统方式。结构比较简单。
源码地址:
SRCNN CODE
先用 bicubic interpolation把图像scale到目标大小,然后通过提特征,非线性映射,然后恢复成图像。
网络结构代码表示:
import tensorflow as tf
from tensorflow.contrib import slim
class SRCNN:
def __init__(self):
pass
def model(self, inputs, padding='VALID', name='srcnn'):
with tf.variable_scope(name, reuse=tf.AUTO_REUSE):
inputs = inputs / 255.0
net = slim.conv2d(inputs, 64, [9, 9], padding=padding, scope='conv1_1')
net = slim.conv2d(net, 32, [1, 1], padding=padding, scope='conv2_1')
net = slim.conv2d(net, 1, [5, 5], padding=padding, activation_fn=None, scope='conv3_1')
return net
def __call__(self, inputs, padding='VALID', name='srcnn'):
return self.model(inputs, padding, name)
文章主页
相比SRCNN,FSRCNN
反卷积传送门
网络分为了
feature exraction—shrinking—mapping—expanding—deconvolution
第一步是提取特征。这一步由于没有像SRCNN先做上采样,所以 5 ∗ 5 5*5 5∗5的滤波器的感受野就相当于SRCNN 9 ∗ 9 9*9 9∗9的滤波器感受野。这一层可以表示为 C o n v ( 5 , d , 1 ) Conv(5,d,1) Conv(5,d,1)
这一步降低了计算消耗。用了 1 ∗ 1 1*1 1∗1的filter,这一层可以表示为 C o n v ( 1 , s , d ) , s < < d Conv(1,s,d), s<
这一层最重要的是深度(depth, the number of layers)和宽度(width, the number of filters in a layer)。这一部分可以表示为 m ⋅ C o n v ( 3 , s , s ) m \cdot Conv(3, s, s) m⋅Conv(3,s,s)
这一层就像是shrinking的逆操作。直接从前面的LR特征做超分结果是不理想的,所以多加了这一层去扩展HR层的维度。这一层是 C o n v ( 1 , d , s ) Conv(1,d,s) Conv(1,d,s)。
D e C o n v ( 9 , 1 , d ) DeConv(9,1,d) DeConv(9,1,d)
Parametric Rectified Linear Unit
ReLU和PReLU可以表示为:
f ( x i ) = m a x ( x i , 0 ) + a i m i n ( 0 , x i ) f(x_i) = max(x_i,0) + a_imin(0, x_i) f(xi)=max(xi,0)+aimin(0,xi)
如果 a i = 0 a_i = 0 ai=0就是ReLU
C o n v ( 5 , d , 1 ) − P R e L U − C o n v ( 1 , s , d ) − P R e L U − m ∗ C o n v ( 3 , s , s ) − P R e L U − C o n v ( 1 , d , s ) − P R e L U − D e C o n v ( 9 , 1 , d ) Conv(5, d, 1) - PReLU - Conv(1, s, d) - PReLU - m*Conv(3, s, s) - PReLU -Conv(1, d, s) - PReLU - DeConv(9, 1, d) Conv(5,d,1)−PReLU−Conv(1,s,d)−PReLU−m∗Conv(3,s,s)−PReLU−Conv(1,d,s)−PReLU−DeConv(9,1,d)
三个敏感变量 s , d , m s, d, m s,d,m
F S R C N N ( d , s , m ) FSRCNN(d, s, m) FSRCNN(d,s,m)
计算复杂度(不计PReLU) O ( 25 d + s d + 9 m s 2 + d s + 81 d ) S L R = O ( 9 m s 2 + 2 s d + 106 d ) S L R O{(25d + sd + 9ms^2 + ds + 81d)S_{LR}} = O{(9ms^2 + 2sd + 106d)S_{LR}} O(25d+sd+9ms2+ds+81d)SLR=O(9ms2+2sd+106d)SLR
MSE
m i n θ 1 n ∑ i = 1 n ∣ ∣ F ( Y s i ; θ − X i ) ∣ ∣ 2 2 min_\theta \frac{1}{n}\sum_{i=1}^n||F(Y_s^i;\theta - X_i)||_2^2 minθn1i=1∑n∣∣F(Ysi;θ−Xi)∣∣22
Y s i Y_s^i Ysi和 X i X^i Xi分别是第i个LR和HR图片对, F ( Y s i ; θ ) F(Y_s^i;\theta) F(Ysi;θ)是网络的输出
先对原来的图像做高斯模糊,模拟相机的点扩散,然后做下采样。
先在LR图片上过了 l l l层卷积,然后用一个 sub-pixel convolution layer上采样LR feature maps产生 I S R I^{SR} ISR
比如对于一个L层的网络, L − 1 L-1 L−1层可以描述为:
f 1 ( I L R ; W 1 , b 1 ) = ϕ ( W 1 ∗ I L R + b 1 ) f^1(I^{LR}; W_1, b_1) = \phi(W_1 * I^{LR} + b_1) f1(ILR;W1,b1)=ϕ(W1∗ILR+b1)
f l ( I L R ; W 1 : l , b 1 , l ) = ϕ ( W l ∗ f l − 1 ( I L R + b l ) ) f^l(I^{LR}; W_{1:l}, b_{1,l}) = \phi(W_l * f^{l-1}(I^{LR} + b_l)) fl(ILR;W1:l,b1,l)=ϕ(Wl∗fl−1(ILR+bl))
W l , b l , l ∈ ( 1 , L − 1 ) W_l, b_l, l \in (1, L-1) Wl,bl,l∈(1,L−1), W l W_l Wl是 2 D 2D 2D卷积层,大小为 n l − 1 ∗ n l ∗ k l ∗ k l n_{l-1}*n_l*k_l*k_l nl−1∗nl∗kl∗kl, n l n_l nl是 l l l层的特征数, ϕ \phi ϕ激活函数,最后一层 f L f^{L} fL将LR特征映射到HR图片。
使用神经网络unscale的方法之一
I S R = f L ( I L R ) = P S ( W L ∗ f L − 1 ( I L R ) + b L ) I^{SR} = f^L(I^{LR}) = PS(W_L * f^{L-1}(I^{LR})+b_L) ISR=fL(ILR)=PS(WL∗fL−1(ILR)+bL)
P S PS PS这个操作就是,上一步生成的特征层为 H ∗ W ∗ C ∗ r 2 H*W*C*r^2 H∗W∗C∗r2,把他们重新排列成 r H ∗ r W ∗ C rH*rW*C rH∗rW∗C,对应于上面的第四第五张图就是这个操作
P S ( T ) x , y , c = T ⌊ x / r ⌋ , ⌊ y / r ⌋ , C ⋅ r ⋅ m o d ( y , r ) + C ⋅ m o d ( x , r ) + c PS(T)_{x,y,c} = T_{\lfloor x/r \rfloor, \lfloor y/r\rfloor, C\cdot r \cdot mod(y,r) + C \cdot mod(x,r) + c} PS(T)x,y,c=T⌊x/r⌋,⌊y/r⌋,C⋅r⋅mod(y,r)+C⋅mod(x,r)+c
卷积操作 W L W_L WL大小为 n L − 1 ∗ r 2 C ∗ k L ∗ k L n_{L-1} * r^2C * k_L * k_L nL−1∗r2C∗kL∗kL,当 K L = k s r K_L = \frac{k_s}{r} KL=rks还有 m o d ( k s , r ) = 0 mod(k_s,r)=0 mod(ks,r)=0时,相当于在LP空间上的 sub-pixel convolution卷积
这篇文章有关于sub-pixel conv更详细的介绍
pixel-wise mean squared error(MSE)
l ( W 1 : L , B 1 : L ) = 1 r 2 H W ∑ x = 1 r H ∑ x = 1 r W ( I x , y H R − f x , y L ( I L R ) ) 2 l(W_{1:L}, B_{1:L}) = \frac {1}{r^2HW}\sum_{x = 1}^{rH}\sum_{x=1}^{rW}(I_{x,y}^{HR} - f_{x,y}^L(I^LR))^2 l(W1:L,B1:L)=r2HW1x=1∑rHx=1∑rW(Ix,yHR−fx,yL(ILR))2
这篇文章提出了一个very deep网络结构,通过在深层网络结构中多次级联小滤波器,有效利用大图像区域上的上下文信息。还有通过之学习残差加快训练。
作者提出了SRCNN的几个缺点:
使用了d层,除了第一层和最后一层,都用了 3 ∗ 3 ∗ 6 3*3*6 3∗3∗6的滤波器,第一层作用于输入图片,最后一层输出图片。做了pad zeros处理。
输入图像 x x x,输出 y y y,训练集 { x ( i ) , y ( i ) } i = 1 N \{x^{(i)}, y^{(i)}\}_{i=1}^N {x(i),y(i)}i=1N
y ^ = f ( x ) \hat y = f(x) y^=f(x), y ^ \hat y y^ estimate
训练目标,最小化MSE 1 2 ∣ ∣ y − f ( x ) ∣ ∣ 2 \frac{1}{2}||y - f(x)||^2 21∣∣y−f(x)∣∣2
Residual-Learning
在SRCNN中,输入的信息从输入传到了输出,由于有许多权重层,这就变成了一种端到端的关系,需要非常长的内存。对于这个原因,消失/爆炸梯度问题是至关重要的。通过residual-learning解决这个问题。
残差图片可以表示为 r = y − x r = y -x r=y−x,很多为0或者很小,loss function就是 1 2 ∣ ∣ r − f ( x ) ∣ ∣ 2 \frac{1}{2}||r - f(x)||^2 21∣∣r−f(x)∣∣2, f ( x ) f(x) f(x)是网络的预测结果。
网络的loss层有三个输入:residual estimate, network input (ILR image) and ground truth HR image。 Loss是重建图像和gt的欧氏距离。
High Learning Rates
使用比较高的学习率,同时用一个可调的梯度裁剪最大限度地提高速度,同时抑制爆炸梯度。
Adjustable Gradient Clipping,裁剪到 [ − θ , θ ] [-\theta, \theta] [−θ,θ]。为了最大化收敛,梯度裁剪范围为 [ − θ γ , θ γ ] [-\frac {\theta}{\gamma},\frac {\theta}{\gamma}] [−γθ,γθ], γ \gamma γ是当前的学习率。
Multi-Scale
训练集有多种scale的图像
网络越深,就能更大的感受野,但是网络越大,于是作者提出了deeply-recurisive convolution network(DRCN),不需要引入太多的网络参数。但是DRCN会比较男训练,于是通过recursive-supervision和skip-connection来解决。
网络的输入是插值图像
就是上面的两张图,网络分成了三个部分:embedding, inference and reconstruction
每个子网络只有一层,每一层就像是MLP,使用 3 ∗ 3 3*3 3∗3的卷积核。对于embedding net, 使用 3 ∗ 3 3*3 3∗3卷积核是因为对于超分辨率,图像梯度的信息比强度更丰富。对于其他的两个网络,就是考虑了邻近的像素信息。
网络的输入是插值后的图片 x x x,预测目标图片 y y y,网路输出是 y ^ = f ( x ) \hat y = f(x) y^=f(x),分别用 f 1 f_1 f1, f 2 f_2 f2, f 3 f_3 f3表示三个子网络,那么 f ( x ) = f 3 ( f 2 ( f 1 ( x ) ) ) f(x) = f_3(f_2(f_1(x))) f(x)=f3(f2(f1(x)))。
对于embedding, f 1 f_1 f1
假设 f 1 ( x ) f_1(x) f1(x)的输出是矩阵 H 0 H_0 H0,把隐藏层记成 H − 1 H_{-1} H−1,有
H − 1 = m a x ( 0 , W − 1 ∗ x + b − 1 ) H_{-1} = max(0, W_{-1}*x + b_{-1}) H−1=max(0,W−1∗x+b−1)
H 0 = m a x ( 0 , W 0 ∗ H − 1 + b 0 ) H_0 = max(0, W_0*H_{-1}+b_0) H0=max(0,W0∗H−1+b0)
f 1 ( x ) = H 0 f_1(x) = H_0 f1(x)=H0
对于inference, f 2 f_2 f2
输入为 H 0 H_0 H0,输出为 H D H_D HD。用相同的权重和偏差 W W W, b b b做所有的操作。
H d = g ( H d − 1 ) = m a x ( 0 , W ∗ H d − 1 + b ) H_d = g(H_{d-1}) = max(0, W*H_{d - 1} + b) Hd=g(Hd−1)=max(0,W∗Hd−1+b)
g g g是单一 一层的操作, d = 1 , . . . , D d = 1,...,D d=1,...,D
f 2 = ( g ∗ g ∗ . . . ∗ ) g ( H ) = g D ( H ) f_2 = (g * g * ... *)g(H) = g^D(H) f2=(g∗g∗...∗)g(H)=gD(H)
∗ * ∗表示一个函数组合, g d g^d gd表示 g的 d − f o l d d-fold d−fold积。
对于重建网络reconstructin, f 3 f_3 f3
H D + 1 = m a x ( 0 , W D + 1 ∗ H D + b D + 1 ) H_{D+1} = max(0, W_{D+1} * H_D + b_{D+1}) HD+1=max(0,WD+1∗HD+bD+1)
y ^ = m a x ( 0 , W D + 2 ∗ H D + 1 + b D + 2 ) \hat y = max(0, W_{D+2} * H_{D+1} + b_{D+2}) y^=max(0,WD+2∗HD+1+bD+2)
f 3 ( H ) = y ^ f_3(H) = \hat y f3(H)=y^
梯度会出现问题
监督每一次的结果消除梯度爆炸或者消失的问题,inferece网络出来的每一次结果,reconstruction网络都会重建,最终有 D D D个结果。用所有的 D D D计算最终的结果。测试中求平均。
训练过程中监测信号直接从loss传到早期递归
思考:反向传播,梯度是怎么回传的
直接将输入引入到reconstruction层。这样reconstruction就有两个信息来源
y ^ d = f 3 ( x , g ( d ) ( f 1 ( x ) ) ) \hat y_d = f_3(x , g^{(d)}(f_1(x))) y^d=f3(x,g(d)(f1(x)))
d = 1 , 2 , . . . , D d = 1, 2, ..., D d=1,2,...,D
输出可以堪称是输入和特征 H d H_d Hd的叠加, f 3 ( x , H d ) = x + f 3 ( H d ) f_3(x, H_d) = x + f_3(H_d) f3(x,Hd)=x+f3(Hd)
最后的输出是所有中间预测的权值平均 y ^ = ∑ d = 1 D w d ⋅ y ^ d \hat y = \sum_{d = 1}^D w_d \cdot \hat y_d y^=d=1∑Dwd⋅y^d
w d w_d wd是递归期间从每个中间隐藏状态重建的预测的权重。
w d w_d wd是怎么得到的
训练集 { x ( i ) , y ( i ) } i = 1 N \{x^{(i)}, y^{(i)}\}_{i=1}^N {x(i),y(i)}i=1N,目标准确预测 y ^ = f ( x ) \hat y = f(x) y^=f(x)
对于中间输出,有loss: l 1 ( θ ) = ∑ d = 1 D ∑ i = 1 N 1 2 D N ∣ ∣ y ( i ) − y ^ d ( i ) ∣ ∣ 2 l_1(\theta) = \sum_{d = 1}^D\sum_{i=1}^N \frac{1}{2DN}||y^{(i)} - \hat y_d^{(i)}||^2 l1(θ)=∑d=1D∑i=1N2DN1∣∣y(i)−y^d(i)∣∣2
对于最后的输出,有loss: l 2 ( θ ) = ∑ i = 1 N 1 2 N ∣ ∣ y ( i ) − ∑ d = 1 D w d ⋅ y ^ d ( i ) ∣ ∣ 2 l_2(\theta) = \sum_{i=1}^N \frac{1}{2N}||y^(i) - \sum_{d=1}^D w_d \cdot \hat y_d^{(i)}||^2 l2(θ)=∑i=1N2N1∣∣y(i)−∑d=1Dwd⋅y^d(i)∣∣2
总的loss: L ( θ ) = α l 1 ( θ ) + ( 1 − α ) l 2 ( θ ) + β ∣ ∣ θ ∣ ∣ 2 L(\theta) = \alpha l_1(\theta) + (1-\alpha)l_2(\theta) + \beta||\theta||^2 L(θ)=αl1(θ)+(1−α)l2(θ)+β∣∣θ∣∣2
α \alpha α前期比较大有利于训练收敛,后面逐渐变小。
用上分层的信息做图像的超分重建,代码地址
网络输入记为 I L R I_{LR} ILR和 I S R I_{SR} ISR,整体结构包括了四部分:
I S R = H R D N ( I L R ) I_{SR} = H_{RDN}(I_{LR}) ISR=HRDN(ILR)
第一层提取了LR输入的特征 F − 1 F_{-1} F−1, F − 1 = H S F E 1 ( I L R ) F_{-1} = H_{SFE1}(I_{LR}) F−1=HSFE1(ILR), F 0 = H S F E 2 ( F − 1 ) F_0 = H_{SFE2}(F_{-1}) F0=HSFE2(F−1)
假设有 D D D个RSB, 第 d d d个输出 F d F_d Fd ,
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 ) ) . . . ) ) F_d = H_{RDB,d}(F_{d-1}) = H_{RDB,d}(H_{RDB,d-1}(...(H_{RDB,1}(F_0))...)) Fd=HRDB,d(Fd−1)=HRDB,d(HRDB,d−1(...(HRDB,1(F0))...))
H R D B , d H_{RDB,d} HRDB,d是一个函数的组合操作,比如卷积和修正线性函数
然后进行DFF(dense feature fusion) ,包括了GFF(global feature fusion)和GRL(global residual learning) F D F = H D F F ( F − 1 , F 0 , F 1 , . . . , F D ) F_{DF} = H_{DFF}(F_{-1}, F_0, F_1, ... , F_D) FDF=HDFF(F−1,F0,F1,...,FD)
然后上采样,用了ESPCN。
RDB 包括了dense connected layers, local feature fusion(LFF), local residual learning, 学了了一个contiguous memory(CM)机制。
CM
第d个RDB的输入,输出分别记为 F d − 1 F_{d-1} Fd−1, F d F_d Fd,各自都有 G 0 G_0 G0个feature maps,有
F d , c = σ ( W d , c [ F d − 1 , F d , . . . , F d , c − 1 ] ) F_{d,c} = \sigma(W_{d,c}[F_{d-1}, F_d, ... ,F_{d, c-1}]) Fd,c=σ(Wd,c[Fd−1,Fd,...,Fd,c−1])
σ \sigma σ是ReLU函数,假设 F d , c F_{d,c} Fd,c有G个feature maps, [ F d − 1 , F d , . . . , F d , c − 1 ] [F_{d-1}, F_d, ... ,F_{d, c-1}] [Fd−1,Fd,...,Fd,c−1]表示里面第 ( d − 1 ) (d-1) (d−1)个RDB的特征和第 d d d个RDB的第 1 , . . . , ( c − 1 ) 1,...,(c-1) 1,...,(c−1)卷积特征的结合,最终有 G 0 + ( C − 1 ) ∗ G G_0 + (C-1)*G G0+(C−1)∗G个特征。
LFF
F d , L F = H L F F d ( [ F d − 1 , F d , 1 , . . . , F d , c , . . . , F d , C ] ) F_{d,LF} = H_{LFF}^d([F_{d-1}, F_{d,1},...,F_{d,c},...,F_{d,C}]) Fd,LF=HLFFd([Fd−1,Fd,1,...,Fd,c,...,Fd,C])
H L F F d H_{LFF}^d HLFFd是第 d d d个RDB的 1 ∗ 1 1*1 1∗1卷积。
LRL Local residal learning
为了提高信息流。
F d = F d − 1 + F d , L F F_d = F_{d-1}+F_{d,LF} Fd=Fd−1+Fd,LF
DFF包含了global feature fusion(GFF)和global residual learning
GFF
F G F = H G F F ( [ F 1 , . . . , F D ] ) F_{GF} = H_{GFF}([F_1,...,F_D]) FGF=HGFF([F1,...,FD])
[ F 1 , . . . , F D ] [F_1,...,F_D] [F1,...,FD]是每个RDB的特征, H G F F H_{GFF} HGFF包括了 1 ∗ 1 1*1 1∗1和 3 ∗ 3 3*3 3∗3的卷积。 1 ∗ 1 1*1 1∗1用于自适应地融合具有不同级别的一系列功能。
Global residual learning
F D F = F − 1 + F G F F_{DF} = F_{-1} + F_{GF} FDF=F−1+FGF
F − 1 F_{-1} F−1是浅层特征,其他的是全局融合特征。
用PSNR和SSIM对变换后的YCbCr空间的Y通道(即亮度)进行结果评估
论文工作页面
基于拉普拉斯金字塔框架,有 l o g 2 S log_2^S log2S层金字塔结构,S为缩放的系数。比如如果为8倍( S = 8 S=8 S=8),那么就有三层结构。
包括了三部分:
图片通过一个转置卷积层(transposed convolutional layer)上采样2倍,这个卷积层初始是 4 ∗ 4 4*4 4∗4的双线性核。然后组合上采样的图和预测的残差图片产生HR图像。然后用于下一层的输入。每一层是相同的结构。
网络越深,参数越多,下面用两种方法减少参数
因为每层金字塔都是相同的任务,放大相同的倍数
最终网络参数与放大倍数无关,使用一个参数集就可以实现放大不同的倍数。
将feature embedding sub-network扩展成深度递归层
如果每个feature embedding sub-network有 R R R次循环模块,模块有 D D D层,那么整个网络的深度为 d e p t h = ( D ∗ R + 1 ) ∗ L + 2 depth = (D * R + 1) * L + 2 depth=(D∗R+1)∗L+2
L = l o g 2 S L = log_2 S L=log2S,括号里的1表示转置卷积层, 2 2 2表示作用与输入图片的卷积和最后一层预测残差的卷积。
解决梯度爆炸\消失问题,在feature embedding sub-network探索了三种方法:
输入 x x x,网络参数 θ \theta θ,输出 y ^ \hat y y^,网络可表示为 y ^ = f ( x ; θ ) \hat y = f(x;\theta) y^=f(x;θ),尽可能与gt y y y相同。将第 l l l层的残差图像表示为 r ^ l \hat r_l r^l,upscale的图像记为 x l x_l xl和对应的 y ^ l \hat y_l y^l,第 l l l层输出的图像为 y ^ l x l + r ^ l \hat y_l x_l + \hat r_l y^lxl+r^l,使用双三次插值算法将gt下采样到 y l y_l yl大小。鲁棒损失函数来处理异常值
L S ( y , y ^ ; θ ) = 1 N ∑ i = 1 N ∑ l = 1 L ρ ( y l ( i ) − y ^ l ( i ) ) = 1 N ∑ i = 1 N ∑ l = 1 L ρ ( ( y l ( i ) − x l ( i ) ) − r ^ l ( i ) ) L_S(y, \hat y ; \theta) = \frac{1}{N}\sum_{i=1}^N\sum_{l=1}^{L}\rho(y_l^{(i)} - \hat y_l^{(i)}) = \frac{1}{N}\sum_{i=1}^N\sum_{l=1}^{L}\rho((y_l^{(i)} - x_l^{(i)}) - \hat r_l^{(i)}) LS(y,y^;θ)=N1i=1∑Nl=1∑Lρ(yl(i)−y^l(i))=N1i=1∑Nl=1∑Lρ((yl(i)−xl(i))−r^l(i))
ρ ( x ) = ( x 2 + ϵ 2 ) \rho(x) = \sqrt{(x^2 + \epsilon^2)} ρ(x)=(x2+ϵ2),Charbonnier penalty function L1范数的一个可微变量,通常设 ϵ \epsilon ϵ为 1 e − 3 1e-3 1e−3。
在提出的模型中,每个level, s s s都有他loss方程和对应的gt,这种multi-scale的监督使网络重建图像实现了coarse-to-fine的模式,减少空间混叠伪影。
使用了不同的scale去训练网络,同时不同的unsampling scale samples由不同的层输出。最终组合的loss为:
L ( y , y ^ ; θ ) = ∑ S ∈ { 2 , 4 , 8 } L s ( y , y ^ ; θ ) L(y, \hat y ;\theta) = \sum_{S\in\{2,4,8\}}L_s(y, \hat y; \theta) L(y,y^;θ)=∑S∈{2,4,8}Ls(y,y^;θ)
但是对于基于pre-upsampling的方法,图片可以缩放在任意的scale,但是对于LapSRN,只能是 2 n ∗ S R 2^n * SR 2n∗SR, n n n为整数。
使用DenseNet作为网络的基础模块,通过dense skip connections实现SISR
对于给定的训练图片 { I L k , I H k } \{I_L^k, I_H^k\} {ILk,IHk},最小化MSE
l ( Θ ) = 1 N ∑ k = 1 N ∣ ∣ F ( I K m , Θ ) − I H k ∣ ∣ 2 2 l(\Theta) = \frac{1}{N}\sum_{k=1}^N||F(I_K^m,\Theta) - I_H^k||_2^2 l(Θ)=N1k=1∑N∣∣F(IKm,Θ)−IHk∣∣22
第i层活接受之前所有层的特征作为输入
X i = m a x ( 0 , w i ∗ [ X 1 , X 2 , . . . , X i − 1 ] + b i ) X_i = max(0, w_i * [X_1, X_2, ... ,X_{i-1}] + b_i) Xi=max(0,wi∗[X1,X2,...,Xi−1]+bi)
[ X 1 , X 2 , . . . , X i − 1 ] [X_1, X_2, ... ,X_{i-1}] [X1,X2,...,Xi−1]表示concatenation,如果对于每一个block,有8个卷积层,每层有 k k k个特征输出,那么每个Dense Block输出的特征是 k ∗ 8 k*8 k∗8,这里 k k k就是指增长率,表示每层能为最终重建层提供多少信息。
两个 3 ∗ 3 3*3 3∗3的反卷积核,feature map为256
见上图
如果所有的block出来的特征信息送入到反卷积网络,会增加计算消耗和增大模型。所以需要先较小输入的特征信息。故用了 1 ∗ 1 1*1 1∗1的卷积核作为bottleneck。最终送入到deconvolution层的特征层为256.然后使用 3 ∗ 3 3*3 3∗3的网络做反卷积。
图片超分是一个一对多的问题
之前的方法对超分比例比较大的图片无法恢复出精细的纹理细节。之前只要用MSE PSNR
作者用GAN的方法,得到更精细的图片细节,引入了一个perceptual loss function,包括了对抗loss和内容loss两部分。
I L R I^{LR} ILR由 I H R I^{HR} IHR经过高斯滤波然后下采样倍数 r r r得到。如果低像素图片 I L R I^{LR} ILR是 W ∗ H ∗ C W*H*C W∗H∗C,上采样结果是 r W ∗ r H ∗ C rW*rH*C rW∗rH∗C。我们的最终目标是训练一个生成函数G来估计给定的LR输入图像对应的HR对应图像。
于是训练一个generator ,CNN G θ G G_{\theta_G} GθG, θ G = { W 1 : L ; b 1 : L } \theta_G = \{W_{1:L};b_{1:L}\} θG={W1:L;b1:L}表示L层网络的权重和方差,通过 l S R l^{SR} lSR 优化,对于 I n H R , n = 1 , . . . , N I_{n}^{HR}, n = 1,...,N InHR,n=1,...,N对应的 I n L R , n = 1 , . . . , N I_n^{LR}, n = 1, ... , N InLR,n=1,...,N
θ ^ G = a r g m i n θ G 1 N ∑ n = 1 N l S R ( G θ G ( I n L R ) , I n H R ) \hat \theta_G = argmin_{\theta_G} \frac{1}{N}\sum_{n=1}^N l^{SR}(G_{\theta_G}(I_n^{LR}), I_n^{HR}) θ^G=argminθGN1n=1∑NlSR(GθG(InLR),InHR)
作者设计了一个perceptual loss l S R l^{SR} lSR 最为几个loss的组合。对恢复后的SR图像进行了清晰的特征建模。
m i n θ G m a x θ D E I H R ∼ p t r a i n ( I H R ) [ l o g D θ D ( I H R ) ] + E I L R ∼ p G ( I L R ) [ l o g ( 1 − D θ D ( G θ G ( I L R ) ) ) ] \begin{aligned} min_{\theta_G} max_{\theta_D} E_{I^{HR} \sim p_{train}(I^{HR})}[log D_{\theta_D}(I^{HR})] + \\E_{I^{LR} \sim p_G(I^{LR})}[log(1 - D_{\theta_D}(G_{\theta_G}(I^{LR})))] \end{aligned} minθGmaxθDEIHR∼ptrain(IHR)[logDθD(IHR)]+EILR∼pG(ILR)[log(1−DθD(GθG(ILR)))]
给了权重参数 γ i , i = 1 , . . . , K \gamma_i,i=1,...,K γi,i=1,...,K。定义 l S R = ∑ i = 1 K γ i l i S R l^{SR} = \sum_{i=1}^K \gamma_i l_i^{SR} lSR=∑i=1KγiliSR 作为单个损失函数的加权和。