社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

使用深度学习来实现超分辨率的介绍

小白学视觉 • 2 年前 • 195 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者:Bharath Raj

编译:ronghuaiyang

导读

这里详细讨论了用于使用深度学习的超分辨率的各种组件、损失函数和度量。

介绍

超分辨率是从给定的低分辨率(LR)图像中恢复高分辨率(HR)图像的过程。由于较小的空间分辨率(即大小)或退化的结果(如模糊),图像可能具有“较低的分辨率”。我们可以将HR图像和LR图像通过如下公式联系起来:LR = degradation(HR)`

显然,在应用退化函数时,我们可以从高分辨率图像中得到低分辨率图像。但是,我们可以反过来做吗?在理想情况下,是的!如果我们知道精确的退化函数,通过对LR图像应用它的逆函数,我们可以恢复HR图像。

但是,问题就在这里。我们通常事先不知道退化函数。直接估计逆退化函数是一个不适定的问题。尽管如此,深度学习技术已被证明是有效的超分辨率方法。

本博客主要介绍如何通过使用监督训练方法使用深度学习来进行超分辨率。还讨论了一些重要的损失函数和度量。很多内容都来自于这篇文献综述:https://arxiv.org/abs/1902.06068,读者可以参考一下。

监督方法

如前所述,深度学习可以用给定的低分辨率图像来估计高分辨率图像。通过使用高分辨率图像作为目标(或 ground-truth)和LR图像作为输入,我们可以将其视为监督学习问题。

在本节中,我们将按照卷积层的组织方式对各种深度学习方法进行分组。在我们继续讨论组之前,先介绍一下数据准备和卷积类型。用于优化模型的损失函数在本博客的最后单独给出。

数据准备

获取低分辨率数据的一个简单方法是对高分辨率数据进行退化。这通常是通过模糊或添加噪声来实现的。较低空间分辨率的图像也可以通过经典的上采样方法进行缩放,比如Bilinear或Bicubic插值。还可以引入JPEG和量化噪声来降低图像的质量。

对高分辨率图像进行退化处理以获得其低分辨率版本


需要注意的一件重要事情是,建议以未压缩(或无损压缩)格式存储高分辨率图像。这是为了防止由于有损压缩而导致的高分辨率图像质量下降,这可能会导致性能不佳。

卷积类型

除了经典的2D卷积,网络中还可以使用一些有趣的变体来改进结果。Dilated卷积可以提供更有效的视场,因此可以使用相隔很远的信息。Skip connections、Spatial Pyramid Pooling和Dense Blocks推动了低级特征和高级特征的结合,以提高性能。

上面的图片提到了一些网络设计策略。有关更多信息,可以参考这篇论文:https://arxiv.org/abs/1902.06068。关于深度学习中常用的不同类型卷积的入门知识,你可以参考这个博客:https://towardsdatascience.com/types-of-convolutions-in-deep-learning-717013397f4d

第1组:前置上采样

该方法首先对低分辨率图像进行插值,得到“粗”的高分辨率图像。现在,CNNs被用来学习从插值的低分辨率图像到高分辨率图像的端到端映射。这个方法的直觉是,使用传统方法(如双线性插值)对低分辨率图像进行上采样,然后对结果进行细化,可能比学习从低维空间到高维空间的直接映射更容易。

一个典型的前置上采样网络


您可以参考这篇文章的第5页:https://arxiv.org/abs/1902.06068,了解使用这种技术的一些模型。优点是,由于上采样是用传统的方法处理的,CNN只需要学习如何对粗图像进行细化,这更加简单。此外,由于我们这里没有使用转置卷积,checkerboard artifacts可能会被绕过。然而,缺点是预定义的上采样方法可能会放大噪声并导致模糊。

第2组:后置上采样

在这种情况下,低分辨率图像被传递到CNNs。上采样在最后一层使用可学习层来执行。

一个典型的后置上采样网络


该方法的优点是在较低维空间(上采样前)进行特征提取,从而降低了计算复杂度。此外,通过使用一个可学习的上采样层,可以对模型进行端到端的训练。

第3组:逐步上采样

在上面的组中,虽然计算复杂度降低了,但是只使用了一个上采样卷积。这使得大尺度缩放的学习过程更加困难。为了解决这个缺陷,Laplacian Pyramid SR Network和progressive SR采用了渐进上采样的框架。在这种情况下,模型使用级联神经网络在较小的尺度上每一步逐步重建高分辨率的图像。

一个典型的逐步上采样网络


通过将一个困难的任务分解成更简单的任务,可以大大降低学习难度,获得更好的性能。此外,像curriculum learning这样的学习策略可以进一步降低学习难度,提高最终的performance。

第4组:迭代上下采样

另一种流行的模型架构是hourglass(或U-Net)结构。有些变体,如Stacked Hourglass网络使用几个连续的hourglass结构,有效地在上采样和下采样过程之间交替。

一个典型的迭代上下采样网络


该框架下的模型能够更好地挖掘出低分辨率图像和高分辨率图像对之间的深层关系,从而提供更高质量的重建结果。

损失函数

利用损失函数来测量生成的高分辨率图像与ground truth高分辨率图像之间的差异。然后用这个差(误差)来优化监督学习模型。存在几种类型的损失函数,每一种函数都对生成的图像的不同方面进行惩罚。

通常,通过对每个损失函数的误差分别加权和求和,可以使用多个损失函数。这使得模型能够同时关注多个损失函数所贡献的方面。

 total_loss = weight_1 * loss_1 + weight_ 2 * loss_2 + weight_3 * loss_3

在本节中,我们将探索用于训练模型的一些流行的损失函数。

像素损失

像素损失是最简单的一类损失函数,其中生成的图像中的每个像素都直接与ground-truth图像中的每个像素进行比较。使用流行的损失函数,如L1或L2损失,或高级变体,如smooth L1损失。

PSNR度量(下面讨论)与像素损失高度相关,因此最小化像素损失可以直接最大化PSNR度量值(表明性能良好)。然而,像素损失并没有考虑到图像质量,而且模型常常输出感知上不令人满意的结果(通常缺乏高频细节)。

内容损失

这种损失是基于图像的感知质量来评估图像质量的。一种有趣的方法是比较生成的图像和ground truth图像的高层特征。我们可以让图像通过一个预先训练好的图像分类网络(如VGG-Net或ResNet)来获得这些高级特征。

上面的函数计算ground-truth图像和生成的图像之间的内容损失,给定pre-trained网络(Φ),和第I层的输出,网络计算这两者的损失。这种损失鼓励生成的图像在感知上类似于ground-truth图像。由于这个原因,它也被称为感知损失。

纹理损失

为了使生成的图像具有与ground-truth图像相同的样式(纹理、颜色、对比度等),使用纹理损失(或样式重建损失)。根据Gatys et. al的描述,图像的纹理被定义为不同特征通道之间的相关性。特征通道通常用预训练的图像分类网络(Φ)来提取。

计算Gram矩阵


特征图之间的相关关系用Gram矩阵(G)表示,G是矢量化特征图ij在图层I上的内积(见上图)。一旦对两幅图像计算了Gram矩阵,计算纹理损失就很简单,如下图所示:

计算纹理损失


通过使用这种损失,推动模型来创建真实的纹理和视觉上更令人满意的结果。

Total Variation损失

利用Total Variation (TV)损失抑制生成图像中的噪声。它取相邻像素之间的绝对差值之和,并测量图像中有多少噪声。对于生成的图像,TV loss计算如下:

这里, i,j,k 分别对高度,宽度和通道进行迭代。

对抗损失

生成对抗网络(GANs)已越来越多地用于包括超分辨率在内的几种基于图像的应用。GANs通常由两个神经网络组成——生成器和鉴别器——相互竞争。

给定一组目标样本,生成器尝试生成样本,以欺骗鉴别器,使其相信它们是真实的。鉴别器试图从假(生成的)样本中分辨出真实(目标)样本。使用这种迭代训练方法,我们最终得到一个生成器,它非常擅长生成与目标示例类似的示例。下图显示了一个典型GAN的结构。

为了提高性能,对基本GAN体系结构进行了改进。例如,Park et. al使用特征级鉴别器来捕捉真实高分辨率图像的更有意义的潜在属性。你可以查看这个blog:https://medium.com/beyondminds/advances-in-geners-adversarialnetworks-7bad57028032?

通常情况下,进行对抗损失训练的模型具有更好的感知质量,即使它们在PSNR上可能比那些进行像素损失训练的模型要差。一个小缺点是,GAN的训练过程有点困难和不稳定。但是,目前正在积极研究稳定的GAN的训练的方法。

度量

一个大问题是我们如何定量地评估模型的性能。许多图像质量评估(IQA)技术(或度量)用于相同的目的。这些指标可以大致分为两类——主观指标和客观指标。

主观度量基于人类观察者的感知评价,而客观度量基于试图评估图像质量的计算模型。主观度量通常更“感知上准确”,但是其中一些度量不方便、耗时或计算成本高昂。另一个问题是这两类度量标准可能不一致。因此,研究人员经常使用这两类指标来显示结果。

在本节中,我们将简要探讨一些广泛使用的度量标准,以评估超级分辨率模型的性能。

PSNR

峰值信噪比(PSNR)是一种常用的客观指标,用于测量有损变换的重建质量。PSNR与ground truth图像与生成图像的均方误差(MSE)的对数成反比。

在上面的公式中,L是可能的最大像素值(对于8位RGB图像,它是255)。不足为奇的是,由于PSNR只关心像素值之间的差异,它并不能很好地代表感知质量。

SSIM

结构相似度(SSIM)是一种基于亮度、对比度和结构三个相对独立的比较来衡量图像之间结构相似度的主观度量。抽象地说,SSIM公式可以表示为亮度、对比度和结构比较的加权乘积,分别计算。

式中,α,β和γ分别为亮度、对比度和结构比较函数的权重。常用的SSIM公式表示如下:

在上面的公式中μ(I)代表了一个特定图像的均值,σ(I)表示了特定图像的方差,σ(I,I’)表示了两张图像的协方差,C1, C2 是设置的常量,避免计算的不稳定。为简洁起见,这里没有解释这些术语的意义和确切的推导过程,感兴趣的读者可以在本文中查看第2.3.2节:https://arxiv.org/abs/1902.06068

由于图像统计特征可能分布不均或失真,局部评估图像质量比全局更可靠。均值SSIM (MSSIM)是一种局部评估质量的方法,它将图像分割成多个窗口,并对每个窗口获得的SSIM进行平均。

无论如何,由于SSIM是从人类视觉系统的角度来评价重建质量的,所以它更符合感知评价的要求。

其他的IQA分数

下面列出了其他一些评估图像质量的方法。感兴趣的读者可以参考这篇论文:https://arxiv.org/abs/1902.06068了解更多细节。

  • 平均意见评分(MOS)

  • 基于任务的评价

  • 信息保真度准则(IFC)

  • 视觉信息保真度(VIF)

END

英文原文:https://medium.com/beyondminds/an-introduction-to-super-resolution-using-deep-learning-f60aff9a499d

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有 SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115564
 
195 次点击