(Accelerating the Super-Resolution Convolutional Neural Network,ECCV2016)
文章摘要
本文是在利用深度卷积神经网络(Convolutional Neural Network,CNN)方法实现单张图超分辨的基础上,针对SRCNN计算开销大限制实时处理性能的问题进行相关的研究,提出了一种更加紧凑的卷积神经网络的结构——FSRCNN。
FSRCNN主要对RCNN的结构进行了三个方面的重新设计:
- 在网络的最后引入了反卷积层;
- 通过在映射之前降低特征维度,然后再扩展回来重构映射层;
- 选择相比SRCNN中更小尺寸的滤波器,但是增加更多的映射层。
算法模型
上图给出了FSRCNN和SRCNN的网络结构,以及展示出了两个网络之间结构的差异。
差异:
- FSRCNN直接采用低分辨的图像作为输入,不同于SRCNN需要先对低分辨率的图像进行双三次插值然后作为输入;
- FSRCNN在网络的最后采用反卷积层实现上采样;
- FSRCNN中没有非线性映射,相应地出现了收缩、映射和扩展;
- FSRCNN选择更小尺寸的滤波器和更深的网络结构。
上图给出了FSRCNN中的卷积层和反卷积层的结构体现。在卷积层中的上采样参数可以被共享,针对不同的上采样参数训练相对应的反卷积层。
激活函数
在FSRCNN中选择了the Parametric Rectified Linear Unit(PReLU)来代替the Rectified Linear Unit(ReLU)作为每一层的激活函数,避免了由ReLU得到零梯度造成的“dead features”。在实验中也证明了PReLU作为激活函数的网络更为稳定。
FSRCNN的计算复杂度
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\left\{\left(25 d+s d+9 m s^{2}+d s+81 d\right) S_{L R}\right\}=O\left\{\left(9 m s^{2}+2 s d+106 d\right) S_{L R}\right\}
O{(25d+sd+9ms2+ds+81d)SLR}=O{(9ms2+2sd+106d)SLR}
在该论文中,利用Relu作为收敛函数,利用最小均方差函数为Loss函数。
代价函数
FSRCNN和SRCNN一样,采用the mean square error (MSE)作为代价函数,目标函数具体如下所示:
min
θ
1
n
∑
i
=
1
n
∥
F
(
Y
s
i
;
θ
)
−
X
i
∥
2
2
\min _{\theta} \frac{1}{n} \sum_{i=1}^{n}\left\|F\left(Y_{s}^{i} ; \theta\right)-X^{i}\right\|_{2}^{2}
θminn1i=1∑n∥∥F(Ysi;θ)−Xi∥∥22
其中,
Y
s
i
Y_{s}^{i}
Ysi和
X
i
X^{i}
Xi表示第i次的低分辨率和高分辨率的子图对的训练数据,
F
(
Y
s
i
;
θ
)
F\left(Y_{s}^{i} ; \theta\right)
F(Ysi;θ)是网络的输出。所有的参数使用标准反向传播的随机梯度下降法(stochastic gradient descent,SGD)进行优化。
代码
// Tensorflow 代码
// 主函数
from model import FSRCNN
import numpy as np
import tensorflow as tf
import pprint
import os
flags = tf.app.flags
flags.DEFINE_boolean("fast", False, "Use the fast model (FSRCNN-s) [False]")
flags.DEFINE_integer("epoch", 10, "Number of epochs [10]")
flags.DEFINE_integer("batch_size", 128, "The size of batch images [128]")
flags.DEFINE_float("learning_rate", 1e-3, "The learning rate of gradient descent algorithm [1e-3]")
flags.DEFINE_float("momentum", 0.9, "The momentum value for the momentum SGD [0.9]")
flags.DEFINE_integer("c_dim", 1, "Dimension of image color [1]")
flags.DEFINE_integer("scale", 3, "The size of scale factor for preprocessing input image [3]")
flags.DEFINE_integer("stride", 4, "The size of stride to apply to input image [4]")
flags.DEFINE_string("checkpoint_dir", "checkpoint", "Name of checkpoint directory [checkpoint]")
flags.DEFINE_string("output_dir", "result", "Name of test output directory [result]")
flags.DEFINE_string("data_dir", "FastTrain", "Name of data directory to train on [FastTrain]")
flags.DEFINE_boolean("train", True, "True for training, false for testing [True]")
flags.DEFINE_integer("threads", 1, "Number of processes to pre-process data with [1]")
flags.DEFINE_boolean("params", False, "Save weight and bias parameters [False]")
FLAGS = flags.FLAGS
pp = pprint.PrettyPrinter()
def main(_):
pp.pprint(flags.FLAGS.__flags)
if FLAGS.fast:
FLAGS.checkpoint_dir = 'fast_{}'.format(FLAGS.checkpoint_dir)
if not os.path.exists(FLAGS.checkpoint_dir):
os.makedirs(FLAGS.checkpoint_dir)
if not os.path.exists(FLAGS.output_dir):
os.makedirs(FLAGS.output_dir)
with tf.Session() as sess:
fsrcnn = FSRCNN(sess, config=FLAGS)
fsrcnn.run()
if __name__ == '__main__':
tf.app.run()
Tensorflow完整代码:Tensorflow
MATLAB代码: MATLAB.
Caffe代码:Caffe
Pytorch代码:Pythorch
Keras: Keras
结果
由上述图表(基于Set14)可得:FSRCNN网络可以获得比现有方法更好的超分辨率质量,并且速度快几十倍。特别是,可在CPU上实时实现。
通过重新设计SRCNN结构得到FSRCNN来实现这一目标,最终加速达到40倍以上。