写在前面:
最近在给部门做分享的时候,分享了计算机视觉方向的一些应用算法,想起来很久没有写过什么技术分享类的blog,毕业也快一年了,在京东做机器学习工程师的日子,也应该记录一下自己的技术成长路线,便于与大家互相交流与进步。
1.What's SR(Super Resolution超分辨率)
通俗地来讲 便是 "To make it clearer"
下面两张图分别是 之前比较热门的AI修复清朝影像以及西方19世纪影片的样例
形意说法是“SR aims to enhance the Pixel Density and high-frequency information”
![394f77f09c6934d95cf3161da741a12a.png](https://i-blog.csdnimg.cn/blog_migrate/c1071c78a0c3088e6ec229770f4e4625.jpeg)
![f2d1e0e527da8d35bc901d1304d2704f.png](https://i-blog.csdnimg.cn/blog_migrate/fab627531e30e5edef5efcbe9a2a398a.jpeg)
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的结构图
![f1d90d9a91bfb306d86be9c09d34607b.png](https://i-blog.csdnimg.cn/blog_migrate/0783f8e4e5a1344752693f381f2b76eb.jpeg)
EDSR结构
对CV有了解的朋友可能发现了熟悉的结构体——ResBlock
没错 EDSR借鉴了ResNet网络基于残差进行学习的机制,input经过一层卷积后兵分两路,一条路经过n层的ResBlock再卷积一次,一条路则直接通向交汇处,进行加权求和,再经过上采样的处理与卷积输出结果。但是EDSR与ResNet中的ResBlock有些不同,EDSR中没有BN层,没有标准化的过程。
![5f5dd6c257f8e2bbd6fb479feca7d785.png](https://i-blog.csdnimg.cn/blog_migrate/178603c11b0b33c4a2f78ccdd01617b0.jpeg)
EDSR与Resnet对比
这是由于超分辨率属于low-level的应用,而图像识别或是目标检测属于high-level的应用。很通俗的理解是,超分的粒度是每一个像素点,而识别任务仅产出一个output,绝对值对于超分来说很重要,最后需要添加的是像素点绝对的数值,BN层会消除这样的绝对数,使之成为相对值,从而造成高频信息的一个丢失。当然,这是我个人的一些理解,大家如果有其他的观点可以同我进行讨论~
![b08543b2452798a405c5630a756842f0.png](https://i-blog.csdnimg.cn/blog_migrate/ca280935ee5bdf9932c31f4301baa69c.jpeg)
EDSR与Bicubic对比图
上图是原论文中作者给出的实验效果图,可以看到EDSR的效果还是比较显著的。
4.训练思路(数据集准备)
我们都知道,相比较于模型或者算法来说,训练数据的优劣和适当性往往对结果产生决定性的影响,对于超分算法来说,不同的场景下训练集的准备也是必要的。比如说实际场景是原本清晰的2k海报图片经过网络传输的压缩后,采用分隔点提取的方式舍弃了部分像素点(可以理解为Bicubic的逆过程),因此再将其还原到最初的尺寸时(还原的过程是Bicubic),会以一种连续的方式补齐缺失的像素数量,导致图像像素变化过大(导数过大)的地方,变得连续而不突出,造成这种感官上的模糊,如下图上半部分的原图LR,下半部分为经过训练后的EDSR网络的output。
![409b6697b035a648f6fa8d818364a2ea.png](https://i-blog.csdnimg.cn/blog_migrate/cd044a86d88e46e551debc3f84d2b445.jpeg)
经过分析而得出以上的结论后,我们准备数据的核心思想便是将一张张2k图片模拟网络压缩后作为训练数据的input,而原始2k图片作为训练数据对应的output,在两者之间架起神经网络训练出一套映射规则,此规则可以适用于诸如此类由于图片压缩场景下的超分应用。另外,以上的案例是一张图文并茂,红色线条和黑色字体结合的海报,因此我考虑到去ppt网站下载红黑风格并包含部分图片的2k高清ppt来截屏获取原始数据,并通过脚本将一张图片切割成四等块来增加训练数据量,如下图所示。
![e6d2ccfac8090488fa65f3b040252ae0.png](https://i-blog.csdnimg.cn/blog_migrate/68bd7ddb2c7b28ccc96b44c3b6f13aad.jpeg)
获取到这些HR数据集后,我们再将每一张HR图片进行压缩处理,存储为对应的LR图片。这样我们就可以将HR图片和LR图片丢到EDSR中进行训练,生成模型参数文件。然后我们便可以将需要超分的目标图片投入到训练好的EDSR中,映射出的output便可以直观地与目标图片进行对比。
当然这只是超分领域的一个场景,我们在实际中会遇到各种原因造成的低分辨率问题,不只是压缩问题。“We must prescribe the right medicine from the source of the problem”,
想要训练出优质的神经网络来解决实际业务场景,则必须准备好对症下药的训练数据,在深度学习的各个领域都是如此,虽说深度学习是黑盒产物,但是输入输出端还是依赖于逻辑支撑的。