写在前面:
最近在给部门做分享的时候,分享了计算机视觉方向的一些应用算法,想起来很久没有写过什么技术分享类的blog,毕业也快一年了,在京东做机器学习工程师的日子,也应该记录一下自己的技术成长路线,便于与大家互相交流与进步。
1.What's SR(Super Resolution超分辨率)
通俗地来讲 便是 "To make it clearer"
下面两张图分别是 之前比较热门的AI修复清朝影像以及西方19世纪影片的样例
形意说法是“SR aims to enhance the Pixel Density and high-frequency information”
SR算法强调两个纬度,一是像素密度,二是高频信息。
像素密度很好理解,计算机图像的单位区域内增加更多像素点,便是提升密度。
(The number of pixels per inch of the image, called Pixel Density)
高频信息,建立在增加密度的基础上,上面一句提到要增加像素点,那这些像素点的数值应该怎么定义取值函数呢?肯定不能乱取,这些数值必然是能反应图片正确信息或者说趋近于我们的优化目标G的信息。
SR要做的就是,增加像素点并且给出像素点取值函数的定义。
2.上采样(upsampling)
在正式进入SR算法之前,我先来列举一下提升像素密度的一些传统方法
Bilinear:双线性插值
Bicubic:双三次插值
Nearst-neighbor:最近邻插值
以上都是一些rule-based方法,当然也有类似于转置卷积的一些方法,在这里不做过多介绍。
我想表达的是SR Focus On Pixel Density ,Also The Effective Information
最优的取值方式必然是非人工干预的,是有自我学习机制的。由于问题的场景特性十分适合DeepLearning,因此深度学习在SR领域自然而然地大肆横行。
3.初识EDSR
先po一张EDSR的结构图
对CV有了解的朋友可能发现了熟悉的结构体——ResBlock
这是由于超分辨率属于low-level的应用,而图像识别或是目标检测属于high-level的应用。很通俗的理解是,超分的粒度是每一个像素点,而识别任务仅产出一个output,绝对值对于超分来说很重要,最后需要添加的是像素点绝对的数值,BN层会消除这样的绝对数,使之成为相对值,从而造成高频信息的一个丢失。当然,这是我个人的一些理解,大家如果有其他的观点可以同我进行讨论~
上图是原论文中作者给出的实验效果图,可以看到EDSR的效果还是比较显著的。
4.训练思路(数据集准备)
我们都知道,相比较于模型或者算法来说,训练数据的优劣和适当性往往对结果产生决定性的影响,对于超分算法来说,不同的场景下训练集的准备也是必要的。比如说实际场景是原本清晰的2k海报图片经过网络传输的压缩后,采用分隔点提取的方式舍弃了部分像素点(可以理解为Bicubic的逆过程),因此再将其还原到最初的尺寸时(还原的过程是Bicubic),会以一种连续的方式补齐缺失的像素数量,导致图像像素变化过大(导数过大)的地方,变得连续而不突出,造成这种感官上的模糊,如下图上半部分的原图LR,下半部分为经过训练后的EDSR网络的output。
获取到这些HR数据集后,我们再将每一张HR图片进行压缩处理,存储为对应的LR图片。这样我们就可以将HR图片和LR图片丢到EDSR中进行训练,生成模型参数文件。然后我们便可以将需要超分的目标图片投入到训练好的EDSR中,映射出的output便可以直观地与目标图片进行对比。
当然这只是超分领域的一个场景,我们在实际中会遇到各种原因造成的低分辨率问题,不只是压缩问题。“We must prescribe the right medicine from the source of the problem”,
想要训练出优质的神经网络来解决实际业务场景,则必须准备好对症下药的训练数据,在深度学习的各个领域都是如此,虽说深度学习是黑盒产物,但是输入输出端还是依赖于逻辑支撑的。