Papers | 超分辨 + 深度学习(未完待续)
1. SRCNN
Home page
http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.htmlECCV 2014,TPAMI 2015,2018年被引超1000次。
1.1. Contribution
end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 )。
指出了超分辨方向上传统方法( sparse-coding-based SR methods )与深度学习方法的关系,insightful 。
SRCNN网络非常简单,PSNR、SSIM 等却有小幅提升(< 1dB)。
应用(测试)时是完全 feed-forward ,因此网络速度比传统方法快。
1.2. Inspiration
SR 的本质 & 可行性
This problem (SR) is inherently ill-posed since a multiplicity of solutions exist for any given low-resolution pixel.
Such a problem is typically mitigated by constraining the solution space by strong prior information.
用样本训练 CNN ,就是在利用先验知识。CNN 为什么比传统方法更简单还更好用
传统方法中,各个组件是分离的,比如图像预处理和字典学习。
传统方法着重于学习和优化 dictionaries ,但对其他部分鲜有优化。
但 SRCNN 是一个 LR 和 HR 之间的端到端网络。
其训练过程中的优化是一体的,比如,其卷积层负责 patch extraction and aggregation ,隐藏层充当 dictionaries ,统一被优化。
因此,我们只需要极少的 pre/post-processing ,同时能实现对整体框架的全面优化。特征表示方法的不同
过去,我们用 a set of pre-trained bases such as PCA, DCT, Haar 来表示 patches 。
现在,我们用不同的卷积核,就实现了多样化的表示。更简单:由于 overlapping ,因此卷积使用的像素信息比简单的字典映射更多。
1.3. Network
1.3.1. Pre-processing
将低分辨率的图片,通过 Bicubic interpolation 得到 \(\mathbf Y\) 。
注意我们仍然称之为 low-resolution image 。
1.3.2. Patch extraction and representation
从 \(\mathbf Y\) 提取出 overlapping patches ,每一个 patch 都代表一个 high-dimensional vector 。
这些向量共同组成 a set of feature maps 。
每一个 vector 的维数,既是总特征数,也是 feature map 的总数。
\[
F_1(\mathbf Y) = max(0, W_1 * \mathbf Y + B_1)
\]
1.3.3. Non-linear mapping
通过一个非线性变换,由原 high-dimensional vector 变换到另一个 high-dimensional vector 。
该 high-dimensional vector 又组成了一个 set of feature maps ,在概念上代表着 high-resolution patch 。
\[
F_2(\mathbf Y) = max(0, W_2 * F_1(\mathbf Y) + B_2)
\]
1.3.4. Reconstruction
生成接近 ground truth: \(\mathbf X\) 的 output 。
过去常用取平均的方法。实际上,平均也是一个特殊的卷积。
因此我们不妨直接用一个卷积。
此时,输出patch不再是简单的平均,还可以是频域上的平均等(取决于 high-dimensional vector 的性质)。
\[
F_3(\mathbf Y) = W_2 * F_2(\mathbf Y) + B_3
\]
注意不要再非线性处理。
1.4. Story
- 深度CNN日益受欢迎的3大诱因:
- 更强大的GPU;
- 更多的数据(如ImageNet);
- ReLU的提出,加快收敛的同时保持良好质量。
- CNN此前被用于 natural image denoising and removing noisy patterns (dirt/rain) ,用于 SR 是头一回。
这就是讲好故事的重要性,无非是映射 pairs 不同。 - auto-encoder 也曾被用于超分辨网络,但仍没有摆脱 separated framework 的弊端。
1.5. Further Learning
Traditional sparse-coding-based SR methods.
从低分辨率图像到 \(\mathbf Y\) 采用的是 Bicubic interpolation ,实际上也是卷积。但为什么不当作卷积层呢?
文中解释,因为输出比输入还大,为了有效利用 well-optimized implementations sucha as cuda-convnet ,就暂且不当作一个“层”。
事实上,当输出大于输入时,CNN的效率会很低。可以继续往下学,后面就会逐渐体会。
2. FSRCNN
Home page
http://mmlab.ie.cuhk.edu.hk/projects/FSRCNN.html2016 ECCV ,2018年被引超250次。
2.1. 亮点
将单个 wide mapping layer 分解成多个 layers with fixed filter size \(3 \times 3\) 。
复杂的非线性映射是最消耗运算资源的。减小尺寸,加大层数,极大提高了运算速度。取消了 SRCNN 前端的双三次插值,将 LR 直接输入网络。
进一步减小了参数数量,进而提高了运算速度。- 在 FSRCNN 末端采用反卷积层,而不是简单的插值升采样。
- 反卷积层从 high-dimensional feature maps 和真实 HR 中学习多个卷积核,实现了超越一般插值的恢复效果。
- 由于放在网络末端,因此网络运算速度与 HR 尺寸无关。
- HR 尺寸可调,并且只需要重新训练利用特征的反卷积层,而不需要重新训练提取特征的CNN网络。
用PReLU替换ReLU,可以避免由 0 梯度带来的 dead features 现象。实验证明它更稳定。
2.2. Improvement
- 与SRCNN相比,速度提升了17到40倍(小型FSRCNN),在一般的CPU上实现了实时性。
原SRCNN在3倍 upsample \(240 \times 240\) 图像时,帧率只有1.32。但实时性要求24fps,差17倍。 - 恢复质量不减反升。
2.3. Analysis
限制原SRCNN运算速度的两大主谋:
升采样。设升采样因子为 \(n\) ,则运算时间增长至 \(n^2\) 倍。
非线性映射。该层越大,恢复质量越高,但时间越长。
对应的解决方法:
取消网络前端的升采样,在网络末端采用反卷积 deconvolution 。
此时,由于输入网络的是 LR ,因此运算时间只和 LR 图像的尺寸成比例。把单个大的非线性映射层,分解为多个小的固定大小的滤波器。
2.4. Network
整体形状像一个前端小,后端大的沙漏:
我们着重理解一下最后的反卷积。
先回顾卷积:
假设输出维数为 \(d\) ,则对于每一维,都有一个特定的卷积核(相当于一个匹配模板)。
同一个卷积核,要对输入的每一个通道的每一个patch进行相同系数的卷积运算。
这样,输出的每一维都是一个 feature map ,组成一个有厚度的 feature maps 。
而反卷积恰好相反。
对于输入的 feature maps ,网络需要找到最佳的卷积核,使得输出经卷积运算后逼近 feature maps 。
前面的CNN,在大小固定,计算量受限的情况下,尽全力让 feature maps 承载足够的信息;
后面的反卷积层,即根据 \(d\) 种不同的特征,尽全力恢复 HR 图像。
由于每一个 map 的含义都不尽相同,因此如果将反卷积替换成一般的插值,PSNR将剧烈下降。
这是实验得到的反卷积图像,显然都学到了不同的特征:
反卷积还有一个好处:
当我们希望输出不同大小的 HR 图片时,我们只需要对该层进行调整,而不需要重新训练前面的CNN网络。
实验结果表明,PSNR基本没有变化。
理论解释是,前面的CNN只起到抽象特征的作用,如何从有限的特征恢复图像,基本上属于反卷积的任务。
2.5. Inspiration
通过减小单个层的体积,可以有效减小运算复杂度。
后面的 expanding 的表面作用是辅助升采样,本质作用是提高恢复质量(提高学习复杂度)。
实验证明,如果取消这一环节,PSNR会有0.3dB左右的下降。
理解:把一个相对 low-dimensional 的 feature maps 直接交给反卷积层学习,是困难的。
2.6. Further Learning
De-convolution.
下一节介绍。CNNs acceleration.
PReLU.
3. ESPCN
2016 CVPR ,2018年引用超380次。
TensorFlow代码:https://github.com/Tetrachrome/subpixel & https://github.com/drakelevy/ESPCN-TensorFlow
3.1. Similarity & Network
作者的观点与FSRCNN有许多相似之处。在论文中提到:
Additionally, as noted by Dong et al. [6], there are no efficient implementations of a convolution layer whose output size is larger than the input size and well-optimized implementations such as convnet [21] do not trivially allow such behaviour.
因此,本文作者同样没有将 upscaling 放到CNN网络之中,并且也是在网络的最末端设置了一个额外的 upscaling 层: sub-pixel convolution layer ,以增强网络的实时性。
总而言之,卷积层不能在 HR space 上运作,否则计算成本就会很高。
3.2. The Drawback of Transposed Convolution ( Deconvolution )
本文也提到了转置卷积操作,同时指出:
However, any reduction (summing) after convolution is expensive.
关于转置卷积及其低效的解释,有以下推荐参考(点击超链接):
图解:
- 在原像素点周围补零;
- 将 kernel 转置(为什么?首先卷积可以看作一个稀疏矩阵乘法,则为了从相同尺寸的输出得到相同尺寸的“输入”,乘法矩阵就要转置);
- 然后进行正常卷积即可。
注意,我们是将kernel转置而不是求逆,因此转置卷积准确来说不应该称为逆卷积。
转置卷积可以用于 feature maps 可视化,但在运算速度上存在致命缺点:
- 首先,卷积是 highly parallelizable 的,原因在于卷积核对于某一维特征而言是固定的,因此可以并行计算各个patch。相比之下,转置卷积却很复杂。
- We should add zero values to the upscale the image, that have to be later filled in with meaningful values.
- Maybe even worse, these zero values have no gradient information that can be backpropagated through.
3.3. Efficient Sub-pixel Convolution Layer
为此,作者提出了新的 upscaling 结构:Efficient subpixel convolution layer 。
虽然名字带“卷积”,但具体实现居然只是一个简简单单的“PS”(重排)!!
重排方式见 Network 。其中要求通道数为 \(r^2\) ,这样才能实现重排。
为什么高效?
- CNN仍然是在 LR space 上进行。
- upscaling 是简单的重排,没有卷积运算。
为什么精度不降反升?
尽管重排是线性的,但前面的CNN是非线性的。
CNN的训练不再注重于简单的特征提取,而是注重于组合规则下的特征提取,并且速度更快的同时层数还能更多。
3.4. 亮点
A key assumption that underlies many SR techniques is that much of the high-frequency data is redundant and thus can be accurately reconstructed from low frequency components.
4. VDSR
Home page (MatConvent)
https://cv.snu.ac.kr/research/VDSR/2016 CVPR ,2018年引用超730次。
TensorFlow代码:https://github.com/Jongchan/tensorflow-vdsr
学习这个网络前,要了解残差学习网络:我的另一篇博客
关于 SR 问题,作者指出3大限制因素:
It relies on the context of small image regions;
Training converges too slowly;
The network only works for a single scale.
为此,本文提出以下措施:
不再只从 LR 的小 patch 中获取信息,而利用 very big image regions ;
不再用重排和转置卷积,而是和 SRCNN 一样用插值法,一开始就得到同输出尺寸的图片。采用残差学习;
作者认为,LR 图片中的低频信息被保留到 HR 图片中,需要重构的只有高频信息。
因此,低频映射没有必要学习,而是直接迁移即可。这是残差学习的一个比较好的解释。采用较高的学习率( SRCNN 的 \(10^4\) 倍)以及 Adjustable gradient clipping ;
让梯度保持在一个较好的范围内。Scale factor 可调,可以包含分数。比如需要缩放图片观看时很有用。
不需要重复训练网络,网络适应性非常好。
方法:训练集中包含多种尺寸的图片,同时训练。
其他特别之处:
由于深度的贡献非常明显,因此采用20层网络结构。
虽然滤波器尺寸固定为 \(3 \times 3\) ,但感受野仍然很大。在图片边缘,由于卷积不能很好地执行,因此传统方法往往会裁掉边缘区域再输出。
而 VDSR 在每一层卷积前都填充 0 ,包括最后的输出也填充0。
这样做的效果非常好,图像边缘也被很好的预测了。
当图像信息被充分挖掘后,0 位置再填上有意义的数。
Papers | 超分辨 + 深度学习(未完待续)的更多相关文章
- springcloud-netflix组件学习-未完待续!!!
SpringCloud学习 Spring Cloud是什么鬼? Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现 ...
- 浅析Oracle PL/SQL 学习--未完待续
这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...
- 【tomcat】sessionId学习(未完待续)
这里主要研究tomcat中session的管理方式以及sessionId的原理,下文将研究sessionid存到redis中以及基于redis实现session共享. 平时也就是了解session是基 ...
- 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)
简介: Treap,一种表现优异的BST 优势: 其较于AVL.红黑树实现简单,浅显易懂 较于Splay常数小,通常用于树套BST表现远远优于Splay 或许有人想说S ...
- jmeter 工具学习 未完待续
about Apache JMeter是Apache组织的开源项目,是 一个纯Java桌面应用,用于压力测试和性能测试,它最初被设计用于 web应用测试,后来逐渐的扩展到其他领域 jmeter可以用于 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- Java开发中的23+2种设计模式学习个人笔记(未完待续)
注:个人笔记 一.设计模式分三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模 ...
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- 堆学习笔记(未完待续)(洛谷p1090合并果子)
上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...
随机推荐
- 简谈OSI七层模型(网络层)
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系. 它是一个七层的.抽象的模型 ...
- 在HTML中限制input 输入框只能输入纯数字
限制 input 输入框只能输入纯数字 onkeyup = "value=value.replace(/[^\d]/g,'')" 使用 onkeyup 事件,有 bug ,那就是在 ...
- 性能测试day07_性能瓶颈和分析
其实如果之前都做的很到位的话,那么再加上APM工具(dynaTrace等),监控到非常细节,那么我们跑一个业务,我们就能完全清楚的知道每个请求的时间,也能知道请求所产生sql的时间,这样你自然而然都知 ...
- 【HQL】小技巧
case1.a与b匹配表保留一条匹配关系 背景:匹配b,b匹配a在同一张表: match_table表为: uid,m_uid 111,222 222,111 需求:只保留一条匹配关系. 结果为: u ...
- jmeter压测之添加负载机
jmeter压测基本介绍一般基准测试(基准测试时间一般为5分钟)后压测的时间是10-15分钟: 实施测试之前要拿到测试指标 例如:tps要达到多少响应时间要达到多少并发数要达到多少TPS :服务端每秒 ...
- leetcode647
class Solution { public: ][],int i,int j){ if(i>=j){ return true; } else{ return DP[i][j]; } } in ...
- Python __slots__限制动态添加变量
Python是一种非常灵活的动态语言,有时感觉太灵活以至于不知道遵循什么样的规则去驾驭.不过Python已经是非常完备的语言,想实现什么样的功能都是有方法的,而且也很容易,比如限制一个类动态添加成员变 ...
- unable to auto-detect email address
git错误:unable to auto-detect email address 2017年11月14日 08:51:08 陈君豪 阅读数:7914 idea 用git更新的时候报错,详细错误信 ...
- Java并发辅助类的使用
目录 1.概述 2.CountdownLatch 2-1.构造方法 2-2.重要方法 2-3.使用示例 3.CyclicBarrier 3-1.构造方法 3-2.使用示例 4.Semaphore 4- ...
- Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
组件化项目使用GreenDao时注意的事项: 1.要在组件化中的基础库(domain层)创建实体类: 2.如果sycn之后不能生产Dao文件,使用 Android Studio 的Gradle插件重新 ...