Learning a Deep Convolutional Network for Image Super-Resolution

Author:Chao Dong, Chen Change Loy, Kaiming He, and Xiaoou Tang
Department of Information Engineering, The Chinese University of Hong Kong Microsoft Research

1.介绍

目前,单幅图像的超分辨率重建大多都是基于样本学习的,如稀疏编码就是典型的方法之一。这种方法一般先对图像进行特征提取,然后编码成一个低分辨率字典,稀疏系数传到高分辨率字典中重建高分辨率部分,然后将这些部分汇聚作为输出。以往的SR方法都关注学习和优化字典或者建立模型,很少去优化或者考虑统一的优化框架。
为了解决上述问题,本文中提出了一种深度卷积神经网络(SRCNN),即一种LR到HR的端对端映射,具有如下性质:
①结构简单,与其他现有方法相比具有优越的正确性,对比结果如下:
②滤波器和层的数量适中,即使在CPU上运行速度也比较快,因为它是一个前馈网络,而且在使用时不用管优化问题;
③实验证明,该网络的复原质量可以在大的数据集或者大的模型中进一步提高。
本文的主要贡献:
(1)我们提出了一个卷积神经网络用于图像超分辨率重建,这个网络直接学习LR到HR图像之间端对端映射,几乎没有优化后的前后期处理。
(2)将深度学习的SR方法与基于传统的稀疏编码相结合,为网络结构的设计提供指导。
(3)深度学习在超分辨率问题上能取得较好的质量和速度。
图1展示了本文中的方法与其他方法的对比结果:

2.基于卷积神经网络的超分辨率

2.1公式化

使用双三次插值将单幅低分辨率图像变成我们想要的大小,假设这个内插值的图像为Y,我们的目标是从Y中恢复图像F(Y)使之尽可能与高分辨率图像X相似,为了便于区分,我们仍然把Y称为低分辨率图像,尽管它与X大小相同,我们希望学习到这个映射函数F,需要以下三部:
(1)特征提取:从低分辨率图像Y中提取patches,每个patch作为一个高维向量,这些向量组成一个特征映射,其大小等于这些向量的维度。
公式:第一层定义为函数F1:
F1(Y) = max(0,W1 ∗Y + B1)
其中,W1和B1分别代表滤波器和偏差,W1的大小为c*f1*f1*n1, c 是输入图像的通道数,f1是滤波器的空间大小,n1是滤波器的数量。从直观上看,W1使用n1个卷积,每个卷积核大小为c*f1*f1。输出是n1给特征映射。B1是一个n1维的向量,每个元素都与一个滤波器有关,在滤波器响应中使用Rectified Linear Unit (ReLU,max(0,x))
(2)非线性映射: 这个操作将一个高维向量映射到另一个高维向量,每一个映射向量表示一个高分辨率patch,这些向量组成另一个特征映射。
公式: 第二步将n1维的向量映射到n2维,这相当于使用n2个1*1的滤波器,第二层的操作如下:
F2(Y) = max(0,W2 ∗F1(Y) + B2).
其中,W2的大小为n1*1*1*n2,B2是n2维的向量,每个输出的n2维向量都表示一个高分辨率块(patch)用于后续的重建。
当然,也可以添加更多的卷积层(1*1的)来添加非线性特征,但会增加模型的复杂度,也需要更多的训练数据和时间,在本文中,我们采用单一的卷积层,因为它已经能取得较好的效果。
(3)重建: 这个操作汇聚所有的高分辨率patch构成最够的高分辨率图像,我们期望这个图像能与X相似。
公式: 在传统的方法中,预测的重叠高分辨率块经常取平均后得到最后的图像,这个平均化可以看作是预先定义好的用于一系列特征映射的滤波器(每个位置都是高分辨率块的“扁平”矢量形式),因此,我们定义一个卷积层产生最后的超分辨率图像:
F(Y) = W3 ∗F2(Y) + B3
W3的大小为n2*f3*f3*c,B3是一个c维向量。
如果这个高分辨率块都在图像域,我们把这个滤波器当成均值滤波器;如果这些高分辨率块在其他域,则W3首先将系数投影到图像域然后再做均值,无论哪种情况,W3都是一个线性滤波器。
将这三个操作整合在一起就构成了卷积神经网络,在这个模型中,所有的滤波器权重和偏差均被优化,网络结构如图2:

2.2 与基于稀疏编码方法的关系

基于稀疏编码的图像超分辨率方法也可以看作是一个卷积神经网络,如图3:

在稀疏编码方法中,假设f1*f1大小的低分辨率块是从输入图像中提取的,这一小块减去它的均值,然后投影成一个低分辨率的字典,如果这个字典大小为n1,就等价于对输入图像使用n1个线性滤波器(f1*f1)(减去均值也是一个线性操作,所以可以被吸收),这部分在上图左半部分中可以看到。
接下来,稀疏编码器将n1个系数投影输出n2个系数,通常n1=n2,这n2个系数代表高分辨率块,从这个角度看,稀疏编码器表现得像一个非线性映射操作,这部分在上图中间呈现。然而,这个稀疏编码器不是前馈形式,它是一个迭代算法。相反,我们的非线性操作是前反馈的而且可以高效计算,可以认为是一个全连接层。
上述得n2个系数被投影到另一个高分辨率字典,产生一个高分辨率块,所有重叠的块取平均。这等价于对n2个特征映射的线性卷积。假设这些用于重建的高分辨率小块大小为f3*f3,则线性滤波器也有相同的大小f3*f3,看上图中的右半部分。
上述讨论展示了基于稀疏编码的SR方法可以看成是一种卷积神经网络(非线性映射不同),但在稀疏编码中,被不是所有的操作都有优化,而卷积神经网络中,低分辨率字典、高分辨率字典、非线性映射,以及减去均值和求平均值等经过滤波器进行优化,所以我们的方法是一种端对端的映射。
上述分析帮助我们决定超参数,我们设置最后一层滤波器尺寸小于第一层,这样可以更多地依赖于高分辨率块的中心部分,如果f3=1,那么中心的像素不能进行平均。一般设置n2

2.3损失函数

学习端对端的映射函数F需要评估以下参数: Θ = {W1,W2,W3,B1,B2,B3}。最小化重建函数F(Y;Θ) 与对于的高分辨率图像X之间的损失,给出一组高分辨率图像 {Xi} 和对应得低分辨率图像 {Yi},使用 均方误差(Mean Squared Error,MSE)作为损失函数:

其中,n为训练样本数,损失的最小化使用随即梯度下降法和标准的BP算法进行反向传播。
使用MSE作为损失函数有利于得到较高的PSNR值,PSNR是图像复原方法中一个常用的评价指标。

3.实验

数据集:为了与传统方法公平的比较,我们使用相同的训练集和测试集,训练集包含91张图像,Set5用来衡量放大因子为2,3,4的结果,Set14用来评价放大因子为3的情况,除了这91张图像,我们后续使用了更大的训练集。
对比: 将我们的SRCNN与以往的方法SC (sparse coding) 、K-SVD、NE+LLE (neighbour embedding + locally linear embedding) 、ANR (Anchored Neighbourhood Regression) 进行对比。
实现细节: 设置f1 = 9, f3 = 5, n1 = 64 and n2 = 32 。对于每个方法因子 ∈{2,3,4}训练一个特定的网络。
在训练过程中,真实图像{Xi}为随机从训练图像中剪裁的32*32大小的子图。为了合成低分辨率样本{Yi},我们将子图用一个适当的高斯核进行模糊,子样本通过放大因子得到,用双三次插值以相同的因子进行放大,91张图像大约可以得到24800张子图,子图从原图像中提取,stride为14。
为了在训练中避免边界的影响,所有的卷积层都没有padding。每一层的滤波器权值初始化满足均值为0,标准差为0.001的高斯分布,偏差为0,前两层学习率为10-4,最后一层为10-5,我们发现最后一层使用更小的学习率比较容易收敛

4.定量评价



从表1,2中可以看到,本文提出的SRCNN在所有的实验中PSNR的平均值最大,且表1中平均PSNR比第二好的ANR分别高出0.51dB,0.47dB,0.40dB.由于Set5的数据集有限,所以结果不是决定性的。来看拥有更大数据集的Set14的结果,SRCNN的平均PSNR与其他方法相比有较大优势(>0.3dB)

5.进一步分析

从ImageNet中学习超分辨率
我们从ILSVRC2013ImageNet选择295909张图像,使用步幅 stride=33分解得到5百万张子图,仍然使用上述参数,由于BP反向传播次数相同(8*10e8),所以与91张图的训练时间差不多,在Set5上放大3倍进行测试,其收敛曲线与其他方法的比较如下:

可以看到,使用相同的BP数量,SRCNN+ImageNet可以达到32.52dB,高于原始的在91张图像的结果 32.39 dB ,结果表明,使用更大、更多样化的图像训练集可以进一步提高SRCNN的性能。
滤波器数量
之前的实验中我们使用的时n1=64,n2=32,接下来我们分别对n1=128,n2=64和n1=32,n2=16分别在ImageNet中训练,在Set5的方法因子为3时进行测试,结果如下:

可以看出,随着滤波器数量的增加,实验的结果会越好。但如果你期望一个较快的复原速度,就可以使用小规模的网络结构,实验效果也比之前的方法好。
滤波器大小
在之前的实验中,f1 = 9 ,f3 = 5;接下来将 f1 = 11 ,f3 = 7,其他参数均不变来进行实验,得到的PSNR为32.57dB,比之前的32.57dB稍微高了一点, 也就是说滤波器越大,就能获得越多的结构信息,也会得到更好的实验结果,但时间更长。因此,网络规模的选择往往是时间和性能的权衡。

6.结论

我们提出了一种新的深度学习方法用于单幅图像的超分辨率重建,传统的基于稀疏编码的方法可以看作一个深的卷积神经网络。本文提出的SRCNN方法是一种在LR和HR图像之间的端对端映射,在优化时几乎不需要额外的预处理和后处理,结构也比较简单,比以往的方法都要好。我们推测,通过在网络中探索更多的隐藏层/过滤器以及不同的训练策略,可以进一步提高性能。此外,该结构简单且鲁棒性强,能运用到低水平的视觉问题中,例如图像去模糊、同步SR+去噪。同时,该网络结构可以处理不同的放大因子。来看几个实验结果:

基于深度卷积神经网络的图像超分辨率重建(SRCNN) 学习笔记相关推荐

  1. 经典论文复现 | 基于深度卷积网络的图像超分辨率算法

    过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...

  2. 网络通道数2的倍数_利用双通道卷积神经网络的图像超分辨率算法

    发布时间: 2016-05-25 摘要点击次数: 288 全文下载次数: 39 DOI: 10.11834/jig.20160503 2016 | Volumn 21 | Number 5 图像处理和 ...

  3. PANet:基于金字塔注意力网络的图像超分辨率重建(Pytorch实现)

    PANet:基于金字塔注意力网络的图像超分辨率重建 [!] 为了提高代码的可读性,本文模型的具体实现与原文具有一定区别,因此会造成性能上的差异 文章目录 PANet:基于金字塔注意力网络的图像超分辨率 ...

  4. 基于深度卷积神经网络的图像网络分类

    摘要 我们训练了一个大型的.深层的卷积神经网络,将ImageNet lsvrc-2010比赛中的120万张高分辨率图像分类为1000个不同的类别.在测试数据上,我们实现了前1位和前5位错误率分别为37 ...

  5. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  6. 基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  7. 基于深度学习的图像超分辨率重建技术的研究

    1 超分辨率重建技术的研究背景与意义 图像分辨率是一组用于评估图像中蕴含细节信息丰富程度的性能参数,包括时间分辨率.空间分辨率及色阶分辨率等,体现了成像系统实际所能反映物体细节信息的能力.相较于低分辨 ...

  8. 【毕业设计】基于深度学习的图像超分辨率重建 - opencv python cnn

    文章目录 0 前言 1 什么是图像超分辨率重建 2 应用场景 3 实现方法 4 SRResNet算法原理 5 SRCNN设计思路 6 代码实现 6.1 代码结构组织 6.2 train_srresne ...

  9. 毕业设计-基于深度学习的单幅图像超分辨率重建算法

    目录 前言 课题背景和意义 实现技术思路 一.超分辨率图像数据集 二.单幅图像超分辨率重建的研究 三.图像质量评估 实现效果图样例 最后 前言

  10. 基于深度卷积神经网络的目标检测研究综述

    基于深度卷积神经网络的目标检测研究综述 人工智能技术与咨询 来自<光学精密工程> ,作者范丽丽等 摘要:作为计算机视觉中的基本视觉识别问题,目标检测在过去的几十年中得到了广泛地研究.目标检 ...

最新文章

  1. Boosting 简介--A (small) introduction to Boosting
  2. Hadoop集群_Eclipse开发环境设置
  3. 《剑指offer》— JavaScript(24)二叉树中和为某一值的路径
  4. C语言 enum和typedef enum的区别
  5. android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事...
  6. 编译时如何看到每个文件的编译选项_导出 Clang 可视化编译耗时分析报告 —— ftimetrace 的使用...
  7. linux操作系统(云服务器中的使用)
  8. 前端 如何检测到当前的网页已经退出_如何监控网页崩溃?
  9. Unity Shader Interior mapping 内部映射
  10. Linux源码在线阅读
  11. 高品质的3D建模和渲染软件——3Dmax!小白须知!
  12. F#周报2019年第8期
  13. 怎么确认eclipse是32位还是64位
  14. 修改自带input样式input:-internal-autofill-selected为透明色
  15. 学区摇号软件设计_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...
  16. 城市巡游赛(树和图)
  17. Java三(运算符 )
  18. upper_bound和lower_bound
  19. LAMP环境让php支持pdo_mysql
  20. matlab注册表版本号,通过注册表发现Windows版本信息

热门文章

  1. 随机生成姓名存入mysql_MYSQL随机生成姓名
  2. 视频学习前端的经验之谈
  3. 二、Linux文件操作命令
  4. 各种蔬菜水果中英文名称对照
  5. (翻译)赫曼方格如何影响用户视觉
  6. LeetCode Word Abbreviation
  7. 计算机主机电源键,按电脑主机机箱电源键后,却没有任何反应疑难问题
  8. Java基础篇--异常机制
  9. java获取ip地址与网络接口
  10. 域名注册查询批量筛选工具