为了更多的同学能进入视觉算法的大坑殿堂,零基础入门系列开播啦!
今天为大家带来第一篇—— 零基础 PyTorch 入门超分辨率 ~
本文内容
什么是超分辨率
数据
模型结构
损失函数
评价指标
超分辨率发展过程
SISR 发展过程
VSR发展过程
如何快速上手
1. 什么是超分辨率
超分辨率(Super-Resolution, SR)重建技术的基本思想是釆用信号处理的方法,在改善低分辨率(Low Resolution, LR)图像质量的同时,重建成像系统截止频率之外的信息,从而在不改变硬件设备的前提下,获取高分辨率(High Resolution, HR)的图像。
通过深度学习方法提升图像/视频的分辨率,作为将模糊的图像变清晰的神奇技术,图像超分辨率技术在游戏、电影、相机、医疗影像等多个领域都有广泛的应用,例如手机拍月亮、视频去马赛克(敲黑板,老司机最感兴趣的深度学习技术)。
使用深度学习方法实现超分辨率需要在大量数据集上训练深度神经网络模型,然后将训练好的模型应用在实际数据上进行超分辨率处理。
数据
超分辨率常用的数据集有 Set5, Set14, DIV2K, Urban100, BSD100 等, 其中 DIV2K 是常用的训练集。
在超分辨率任务中, 我们一般会使用已知的下采样方式来得到成对的数据, 常用的方式是 bicubic down sampling,常用的下采样在 PIL, opencv 等图像处理工具包能够找到。
但需要留意的是, 在不同工具包下, 即使是同一个下采样方法也会有细微分别, 所以在准备数据时需要确保你使用的是跟其他方法一样, 否则比较就会变得不公平。
目前常用的是利用 MATLAB 的imresize function 来进行 bicubic 下采样。
模型结构
超分辨率深度学习模型由上采样模块和大量特征提取模块组成,广泛使用跳接结构。
下图为 ESRGAN 算法的网络结构,一层卷积层将三通道图片转化为含有多个通道(一般为64)的特征图,然后使用大量 Basic Block 进行特征提取,经过跳跃连接后进行上采样,最后经过两层卷积层加工后得到超分辨率结果。
Basic Block 可以是残差块 (Res Block),也可以是稠密连接块 (Residual Dense Block),还可以像 ESRGAN 一样使用嵌套残差的稠密连接块 (Residual in Residual Dense Block)。
由于超分辨率网络由上采样模块和特征提取模块组成,超分辨率网络可以根据上采样模块的位置分为以下四类:
- 前置上采样
- 后置上采样
- 渐进上采样
- 反复上下采样
损失函数
超分辨率常用的损失函数包括 :
- 像素损失 (L1, L2, ssim 等):直接计算超分辨率预测结果与 GT (Ground truth) 之间的差异
- 感知损失&风格损失:将预测结果和 GT 输入到特征提取网络(一般为 VGG 等 backbone),对比特征图之间的差异
- 对抗损失:使用生成对抗网络 (GAN) 实现超分辨率,超分辨率网络为生成器,再搭建分类网络作为鉴别器,通过鉴别器的损失函数来训练生成器
评价指标
超分辨率的评价指标包括 :
- 峰值信噪比 (PSNR):直接对比预测结果与 GT 之间的像素差异,与 L2 损失强相关
- 结构相似性 (SSIM):对比预测结果与 GT 之间的结构相似程度
- 平均意见得分 (MOS):人眼直观判断图像清晰度
- 感知质量 (PI):评估图像的感知舒适度
2. 超分辨率发展过程
超分辨率包括以下三种 :
- 一对一重建:单张图像超分辨率
- 多对一重建:多张低分辨率重建单张高分辨率
- 多对多重建:视频序列的超分辨率重建
单张图像超分辨率(Single Image Super-Resolution, SISR)主要利用对髙分辨率图像的先验知识和以混叠形式存在的高频信息进行复原。
后两种情况除了利用先验知识和单幅图像信息外,还可以应用相邻图像之间的互补信息进行超分辨率重建,得到比任何一幅低分辨率观测图像分辨率都高的高分辨率图像。核心思想是用时间带宽换取空间分辨率。
SISR 发展过程
基于深度学习的 SISR 随着主流 CNN 网络结构一起进步,直到 2017 年 EDSR 移除了 ResBlock 中的 BN 层取得更好的效果。
2018年 RDN 保持移除 BN 操作,通过残差密集块 RDB,充分利用所有的多级特征,获得了更好的效果。
SISR 是一种无中生有的病态问题,因此有大量基于 GAN 的解决方案,例如 SRGAN、ESRGAN、GLEAN 等。
相比基于像素损失的超分辨率方法(SRCNN、EDSR、SRResNet、RDN等),基于GAN的方法(SRGAN、ESRGAN等)能够恢复出更多的风格信息,带来更多的高频细节。
深度学习需要大量训练数据,基于深度学习的 SISR 使用的低分辨率数据通常来自高分辨率图像的退化,这种退化得到训练数据的方法与现实需求有一定的差异,因此有许多针对真实图像超分辨率的尝试,例如 CamerSR 等直接从真实的相机镜头成像的角度出发,构建分辨率和视场之间的关系。
但这种方法数据采集困难,且涉及数据匹配问题,一种妥协方案是在学习超分辨率过程的同时学习退化过程,例如 DRN,CycleGAN。
SR 过程涉及图像尺寸的放大,针对特征提取和尺寸放大模块的相对问题,SR 可分为前置上采样、后置上采样、渐进上采样、反复上下采样等方法。
在 SISR 的发展过程中,后置上采样的结构具有引入噪声少、速度快的优点,逐渐成为主流。但在批处理训练中,这种结构只能处理固定的上采样倍数。MetaSR 和 LIIF 使用 CNN+MLP 的结构解决任意上采样倍数的问题,使得网络具有更强的实用性。
文章链接:https://mp.weixin.qq.com/s/S0QlFCjRCJiMi4v9OY_dQg
VSR发展过程
在视频超分 (Video Super-Resolution,VSR) 中,我们有一系列高度相关但不对齐的低分辨率图像。
因此,除了需要考虑图片自身的信息外,我们还要思考怎样有效地把视频中的互补的信息利用起来。最直接的方法就是将 SISR 方法分开应用到每一帧中。
但这种操作非但不能利用视频中的信息,而且未能保证时序连续性。所以,这些方法一般未能恢复高质量的视频,也会导致 flickering artifacts 的出现。
早期比较流行的方法一般都是采取一个滑动窗口 (sliding-window) 的框架。在这个框架中,我们会使用 {k±i | i=0,1,2,⋯} 视频帧来复原第k个视频帧。这样的操作可以把相邻 (一般是4-6帧) 的信息拿进来,更有效的恢复视频。为了解决相邻帧不对齐的问题,早期方法例如 TOFlow 和 RBPN 一般会先利用光流 (optical flow) 将相邻对齐到需要恢复的帧,然后输到网络中进行复原。
在2018年,TDAN 提出利用可变型卷积 (deformable convolution,DCN) 对特征进行对齐,并带来更好的效果。其后,EDVR 进一步作出改进并提出 PCD alignment,夺得 NTIRE 2019 视频复原比赛中的全部四项冠军。
2021年之前,滑动窗口框架一直是 VSR 中的主流。但这个框架存在一个根本性的问题,就是网络只利用相邻帧信息进行复原,忽略了视频中其他帧的信息。这个想法在 BasicVSR 中得到证实。为了更有效地利用视频中所有帧的信息,BasicVSR 采取了循环 (recurrent) 框架,通过利用双向传播 (bidirectional propagation),在只有 EDVR 的30%参数量下超越 EDVR。
之后,recurrent 框架慢慢获得重视。今年,BasicVSR++ 基于 BasicVSR 作出改进,表现大幅超越 BasicVSR, 并在 NTIRE 2021 视频复原比赛中夺得三个冠军及一个亚军。
如何快速上手
MMEditing 提供一个方便的途径比较现有的算法,上方的对比图其实就是我们用 MMediting 跑出来的。
我们只需要下载并安装 MMEditing, 之后运行相应的指令即可。例如, 以下指令即可以快速地输出 BasicVSR 的结果:
python demo/restoration_video_demo.py ./configs/restorers/basicvsr/basicvsr_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_vimeo90k_bi_20210409-d2d8f760.pth data/Vid4/BIx4/calendar/ ./outputs
如果想要在 Set5, Set14 等测试集测试模型,可以运行以下指令(以 ESRGAN 为例):
python tools/test.py configs/restorers/esrgan/esrgan_x4c64b23g32_g1_400k_div2k.py https://download.openmmlab.com/mmediting/restorers/esrgan/esrgan_x4c64b23g32_1x16_400k_div2k_20200508-f8ccaf3b.pth --save-path work_dirs/save
其中第二个参数 config 文件、第三个参数模型文件是必须提供的参数;--save-path 为保存输出结果的文件夹地址,是可选项。
文章来源:公众号【OpenMMLab】
2021-10-26 12:10