1. Abstract
RAISR: Rapid and Accurate Image Super Resolution
Yaniv Romano et. al. arXiv 2016
讨论SR算法我们都要先问一个问题, 就是对于SR这样一个ill-posed问题, 这个方法是基于什么Prior将ill-posed问题regularized
首先对于从HR->LR, RAISR认为基于这样一个退化模型
z=DsHx
z是input image, 就是LR
x是要还原的HR image
H是blur过程, 就是降低HR的清晰度
Ds是降采样过程
这个就是RAISR的先验, 就是认为LR可以通过简单插值和一个sharpeness过程还原到HR, 而这个sharpness就是一个filter
其实基本的过程和A+/Sc差不多, 都是根据一个目标函数让退化后的LR图像尽量接近HR图像, 但是RAISR学的是一个filter
这个形式和A+/Sc的差不多, 但是RAISR学的是h(滤波器), 首先, 方便理解, 我们可以认为h是全局一个滤波器, 那这个就相当于是一个Convolution Network了, 只有一层, 并且滤波器的通道还只有一个(这个在文章的后面会提到, SR的过程只在Y通道上做, CbCr通道只做bicubic interpolation)
Note that upscaling an RGB image is done by converting it to the YCbCr color space. Then, a bicubic interpolation is applied on the luminance channel, which is used as an initialization for RAISR, while the chromatic channels are upscaled only by the bicubic interpolation. Finally, the estimated HR channels are converted back to the RGB color space.
Ai是经过cheap upscale后的样本yi的展开, 一行代表yi一个点为中心大小为filter大小的像素点, h的大小是dxd, 所以Ai一行是dxd, 一共是MN行
这个公式就是将一个卷积过程展开, 就是让一幅经过cheap upscale的LR图经过filter h后要尽量接近要还原的HR图
2. Algorithm
上面这两幅图分别是RAISR离线训练filter和在线Upscaling的过程
我们先讲一下重要的步骤, 然后讲一下它为了最后的效果, 增加的Tricks
① Cheap upscaling - 4 type filter
这里就用的是Bilinear Interpolation, 因为用的是Bilinear, 所以生成的upscale图上, 根据插值所用的点和权重不同, 要分成4 types of pix, 针对不同的pix, 也要训练不同的filter
P1 是原先像素位置上的点, 也就是不同插值直接拿过来的
P2 是横向两点插值得到的
P3 是纵向两点插值得到的
P4 是经过横纵两个维度插值得到的
这4种filter学出来是有明显差异的
四种filter在幅度谱上差异不大, 但是phase和方向有明显差异
② Hashing Classification
这是用哈希方法对样本进行聚类
其实大家用全局一样的filter也不是不行, 但是效果差点, 所以还是要根据局部特征自适应地训练不同的filter, 其实A+/ANR/SF也都用到K-means的方法来聚类, 只是有些用Euclidean distance, 有的用relevant
RAISR觉得你们这种聚类方式是"expensive" clustering, 这里的expensive应该是指在查找的时候计算量比较大, 所以就想了一种在查找的时候节省下成本的方法, 就是用局部的statistics of gradients来做Hash-table keys, 用对应的filter做hash-table entries, 这样查找就很方便, 在Upscale阶段, 对一个确定的点, 计算它的gradients, 然后找对应的filter来做恢复就可以
Statistics具体使用Angle/Strength/Coherence这三个值来作为Hash-table keys, 角度和强度都不用说, Coherence其实就是梯度各向异性的程度, 就是Coherence越大, 各向趋于不同, 越小, 各向趋于相同, 我们可以拿实际训练出的filter来看一下
③ Blending Structure-Preserving Solution
为防止过度sharpen带来的结构改变问题, 在Upscaling阶段, RAISR还增加了一个Blend手段
In areas that the structure of the initial interpolated image and the filtered one is somewhat similar – we choose the filtered version, while in areas that a major change is occurred by the filtering step – we choose the initial upscaled image
就是如果经过filter结构有重大改变, 我还是听原来的(就是cheap upscale的结果), 如果没有的话, 我就听滤波之后的
这里用到了一个叫CT(Census Transform)的方法
其实就是LBP, 局部二值化, 用周围的点和中心的关系将这个点附近区域编码, 用这串码表示这个点附近的结构, 判断结构是否相似就是用码串的相似度来衡量
实现过程中的randomness weights就是根据LCC(就是附近最少有多少个1或多少个0是连在一起的), 用这个来判断是不是在edge上, RAISR希望的是尽量只在高频部分进行filter, 而低频部分不要做
allows the pre-learned filters to enhance only the high-frequencies of the image, leading to HR images that look natural, as required by the conventional SISR problem
In general, the larger the size of LCC the higher the weight. Put differently, by measuring the ”randomness” of the bit string we can infer whether the pixel is a part of an edge or not, forming the blending weights map.
基本步骤就是这三步
- A very cheap (e.g. bilinear) interpolation method is used to upscale the LR image.
- A hash-table, containing set of filters, is learned from a training database, where the hash-table keys are a function of gradient properties. The filters are applied on the output of step (i) to improve its quality.
- The outputs of steps (i) and (ii) are selectively blended (with different weights at each pixel) to produce the final result.
3. Tricks
RAISR的trick非常之多, 包括之前的blending, Hash bucket, 因为那些在主流程上就不放到这儿说了
说一下RAISR中为了加快运算和加强sharpen效果增加的三个tricks
① 训练时sample的trick
In fact, we typically construct Ai and bi by sampling K patches/pixels from the images on a fixed grid, where K << MN
这里还没细看, 回头补上
② 数据扩增 Using Patch Symmetry for Nearly-Free 8x More Learning Examples
就是镜像和翻转用1个样本扩8个样本, 这个在DL不新鲜了
③ CT-Based DoG Sharpener
这个暂时没看, 回头补上
4. Discussion
首先, 快绝对是RAISR的优势, 相比于A+, 还要快10倍以上
https://blog.csdn.net/u011630458/article/details/69524582
RAISR快的原因是学习filter不学习映射矩阵或者字典, 因为不管是字典还是映射矩阵都要比filter大很多啊
另外RAISR还有一个优点是它是逐pixel做的, 考虑了每一个pixel的属性, 而不像是A+/Sc是逐patch还原, 还要考虑overlap怎么处理, 所以它就不存在overlap的部分在两个patch中有冲突的问题
劣势在于存的信息需要比较多, 你要精确, 那就要filter能够尽量稠密, 这样样本的需求也很大(所以才把RAISR逼出数据扩增了)
还有就是效果其实还是要比SRCNN甚至比A+差
这是RAISR自己给的比较结果, RAISR在速度上的优势显而易见, 但效果上比A+/SRCNN都要差