FSRCNN-图像超分辨的学习

《Accelerating the Super-Resolution Convolutional Neural Network》的学习

(Accelerating the Super-Resolution Convolutional Neural Network,ECCV2016)

文章摘要

本文是在利用深度卷积神经网络(Convolutional Neural Network,CNN)方法实现单张图超分辨的基础上,针对SRCNN计算开销大限制实时处理性能的问题进行相关的研究,提出了一种更加紧凑的卷积神经网络的结构——FSRCNN

FSRCNN主要对RCNN的结构进行了三个方面的重新设计:

  1. 在网络的最后引入了反卷积层;
  2. 通过在映射之前降低特征维度,然后再扩展回来重构映射层;
  3. 选择相比SRCNN中更小尺寸的滤波器,但是增加更多的映射层。

算法模型

在这里插入图片描述
上图给出了FSRCNNSRCNN的网络结构,以及展示出了两个网络之间结构的差异。
差异:

  1. FSRCNN直接采用低分辨的图像作为输入,不同于SRCNN需要先对低分辨率的图像进行双三次插值然后作为输入;
  2. FSRCNN在网络的最后采用反卷积层实现上采样;
  3. FSRCNN中没有非线性映射,相应地出现了收缩、映射和扩展;
  4. 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=1nF(Ysi;θ)Xi22
其中, 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倍以上。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值