基于深度学习的超级分辨率,无需使用GAN

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41697507/article/details/97391270

本文介绍了技术和培训深度学习模型的图像改进,图像恢复,修复和超分辨率。这利用了Fastai课程中教授的许多技术,并利用Fastai软件库。这种训练模型的方法是基于非常有才华的AI研究人员的方法和研究,我将它归功于我在信息和技术方面的能力。
据我所知,我用这些训练数据应用的一些技术在这一点上是独一无二的(截至2019年2月),只有少数研究人员将所有这些技术结合在一起,很可能是Fastai的研究人员/学生。

超级分辨率

超分辨率是升级和/或改善图像内细节的过程。通常将低分辨率图像作为输入,并将相同图像放大到更高的分辨率,即输出。高分辨率输出中的细节填写在细节基本未知的地方。
超级分辨率基本上就是你在电影和连续剧中看到的内容,例如CSI,有人放大图像,它的质量提高,细节就出现了。
去年2018年初,我首次在优秀的YouTube 2分钟论文中听说过“AI超级分辨率”,其中包含对最新AI论文的简短评论(通常超过2分钟)。当时它看起来像魔术,我无法理解它是如何可能的。绝对不辜负Arthur C Clarke的话:“任何先进的技术都与魔术无法区分”。我认为不到一年的时间我就会训练自己的超级分辨率模型并写下它。
这是我正在撰写的一系列文章的一部分,作为我在人工智能和机器学习方面不断学习和研究的一部分。我是一名软件工程师和分析员,负责成为AI研究员和数据科学家。
我写这部分是为了加强我自己的知识和理解,希望这对其他人也有帮助和兴趣。我试图将大部分内容保留在尽可能简单的英语中,以便希望对于熟悉机器学习的人有一些更深入的技术细节和与同事研究的联系。这些主题和技术的理解非常具有挑战性,并且花了我几个月的时间来试验和写这篇文章。如果你不同意我写的或认为这是错的,请联系我,因为这是一个持续的学习过程,我将很感激反馈。
下面是一个低分辨率图像的示例,在其上执行超分辨率以改善它:

在这里插入图片描述

   左低分辨率图像。使用此处训练的模型正确分辨低分辨率图像。

基于深度机器学习的超分辨率试图解决的问题是基于传统算法的升级方法缺乏精细细节,无法去除缺陷和压缩伪像。对于手动执行这些任务的人来说,这是一个非常缓慢和艰苦的过程。
从一个从未存在或已经丢失的地方获得更高质量的图像的好处,这可能在许多领域有益,甚至在医疗应用中挽救生命。
另一个用例是用于计算机网络之间的传输压缩。想象一下,如果您只需要发送256x256像素的图像,其中需要1024x1024像素的图像。
在下面的图像集中有五个图像:

  • 要升级的较低分辨率输入图像
  • 输入图像由最近邻插值放大
  • 输入图像通过双线解释升级,这是您的Internet浏览器通常需要的
  • 输入图像通过此模型的预测进行了升级和改进
  • 目标图像或地面实况,缩小尺寸以创建较低分辨率的输入。

目标是将低分辨率图像改善为比目标更好(或更好),称为基础事实,在这种情况下,我们将原始图像缩小为低分辨率图像。

在这里插入图片描述
比较低分辨率图像,传统的放大,深度学习模型预测和目标/地面实况

为了实现这一目标,数学函数采用缺乏细节的低分辨率图像,并将细节和特征幻觉化到其上。在这样做时,该功能找到原始相机可能永远不会记录的细节。
该数学函数称为模型,放大图像是模型的预测。
一旦如何解释模型及其培训,本文末尾提到的这一点可能存在道德问题。

图像修复和修复

经过超分辨率训练的模型也可用于修复图像中的缺陷(jpeg压缩,撕裂,折叠和其他损坏),因为模型具有某些特征应该是什么样的概念,例如材料,毛皮甚至是眼睛。
图像修复是修饰图像以去除图像中不需要的元素(例如铁丝网)的过程。对于训练,通常会切出图像的各个部分并训练模型,以根据应该存在的事先知识来替换缺失的部分。当由熟练的人手动执行时,图像修复通常是非常慢的过程。

在这里插入图片描述

留下一个打孔的图像,文字重叠。基于中深度学习的修复图像模型预测。正确的目标或地面真相没有缺陷。

超级分辨率和修复似乎通常被视为独立和不同的任务。但是,如果可以训练数学函数来创建不在图像中的其他细节,那么它也应该能够修复图像中的缺陷和间隙。这假设训练数据中存在缺陷和缺口,以便通过模型学习恢复。

超级分辨率的GAN

使用生成对抗网络(GAN)训练大多数基于深度学习的超分辨率模型。
GAN的一个局限性在于它们实际上是一种懒惰的方法,因为它们的损失功能,批评者,是作为过程的一部分进行训练而不是专门为此目的而设计的。这可能是许多模型只擅长超分辨率而不是图像修复的原因之一。

通用应用

许多深度学习超分辨率方法不能普遍适用于所有类型的图像,几乎都有其缺点。例如,为动物的超分辨率训练的模型可能不利于人脸的超分辨率。
使用本文详述的方法训练的模型似乎在包括人类特征在内的各种数据集中表现良好,表明可以有效地对任何类别的图像进行放大的通用模型。

X2超分辨率的例子

以下是来自在Div2K数据集上训练的相同模型的X2超分辨率(使图像尺寸加倍)的十个示例,800个各种主题类别的高分辨率图像。
来自在不同类别的图像上训练的模型的示例一。在早期训练期间,我发现改善图像与人类的改善最少,并采取了更多的艺术平滑效果。然而,在通用类别数据集上训练的这个版本的模型已经设法很好地改善了这个图像,仔细观察脸部,头发,衣服的褶皱和所有背景中的附加细节。

在这里插入图片描述

   来自Div2K验证数据集的图像的超分辨率,示例1

示例二来自在不同类别的图像上训练的模型。该模型为树木,屋顶和建筑窗户增添了细节。再次令人印象深刻

在这里插入图片描述

  来自Div2K验证数据集的图像的超分辨率,示例2

示例三来自在不同类别的图像上训练的模型。在不同数据集的训练模型中,我发现人脸的结果最不令人满意,但是这里对不同类别图像进行训练的模型已经设法改善了脸部细节,并查看了添加到头发上的细节,这是非常令人印象深刻。

在这里插入图片描述
来自Div2K验证数据集的图像的超分辨率,示例3

示例四来自在不同类别的图像上训练的模型。镐轴,冰,夹克和头盔中的褶皱增加了细节,令人印象深刻:

在这里插入图片描述

   来自Div2K验证数据集的图像的超分辨率,例4

来自在不同类别的图像上训练的模型的示例五。花朵的改进在这里非常令人印象深刻,鸟眼,喙,毛皮和翅膀的细节:

在这里插入图片描述

   来自Div2K验证数据集的图像的超分辨率,例如5

示例六来自在不同类别的图像上训练的模型。该模型已设法为人们的手,食物,地板和所有物体添加细节。这真是令人印象深刻:

在这里插入图片描述

 来自Div2K验证数据集的图像的超分辨率,例6

来自在不同类别的图像上训练的模型的示例七。该模型使毛皮成为焦点并保持背景模糊:

在这里插入图片描述

  来自Div2K验证数据集的图像的超分辨率,例7

来自在不同类别的图像上训练的模型的示例八。该模型已经很好地加强了窗口之间的界限:

在这里插入图片描述
来自Div2K验证数据集的图像的超分辨率,例8
示例九来自在不同类别的图像上训练的模型。皮草的细节似乎真的被模型所想象。

在这里插入图片描述
来自Div2K验证数据集的图像的超分辨率,例9
示例十来自在不同类别的图像上训练的模型。对于结构和灯光线条而言,这似乎令人印象深刻。

在这里插入图片描述
来自Div2K验证数据集的图像的超分辨率,例如10。

示例11来自在不同类别的图像上训练的模型。羽毛的改善和锐化非常明显。

在这里插入图片描述

来自Div2K验证数据集的图像的超分辨率,例11。

来自在不同类别的图像上训练的模型的示例十二。这种内部图像几乎无处不在。

在这里插入图片描述

来自Div2K验证数据集的图像的超分辨率,例12。

来自在不同类别的图像上训练的模型的示例十三。这是本节中的最后一个示例,一个经过锐化和改进的复杂图像。

在这里插入图片描述
来自Div2K验证数据集的图像的超分辨率,例13。

此模型的预测已执行超分辨率

上面的所有图像都是在训练期间或训练结束时对验证图像集进行的改进。
已训练的模型已用于创建超过100万像素的放大图像,这些是一些最好的例子:
在第一个例子中,以高JPEG质量(95)保存的256像素方形图像被输入到模型中,该模型将图像升级为执行X4超分辨率的1024像素方形图像:
在这里插入图片描述
使用深度学习的超分辨率,例1

上面的图像集不一定做预测正义,在我的公共Google驱动器文件夹上查看完整大小的PDF:https:
//drive.google.com/open?id = 1g0o7uL7ZlLxKI_0GSz2C4qO4f71s6F5i
在下一个示例中,以低JPEG质量(30)保存的512像素图像被输入到模型中,该模型将图像放大到在较低质量的源图像上执行X2超分辨率的1024像素正方形图像。在这里我相信模型的预测看起来比目标地面实况图像更好,这是惊人的:

在这里插入图片描述

使用深度学习的超分辨率,例2

上面的图像集不一定做预测正义,在我的公共Google驱动器文件夹上查看完整大小的PDF:https:
//drive.google.com/open?id = 1FrO6n7DqFhqZW5-oTGTMgjUTMQGsGeaD
在这个非常基本的术语中这个模型:

  • 将图像作为输入
  • 通过训练有素的数学函数传递它,这是一种神经网络
  • 输出相同大小或更大的图像,这是对输入的改进。

这建立在Jeremy Howard和Rachel Thomas在Fastai课程中提出的技术的基础上。它使用Fastai软件库,PyTorch深度学习平台和CUDA并行计算API。

Fastai软件库为开始复杂的深度学习打破了很多障碍。由于它是开源的,因此可以根据需要轻松定制和替换架构元素以满足您的预测任务。这个图像生成器模型建立在Fastai U-Net学习者之上。

此方法使用以下内容,每个方法将在下面进一步说明:

  • 具有类似于DenseNet的交叉连接的U-Net架构
  • 基于ResNet-34的编码器和基于ResNet-34的解码器
  • 像素随机扩展ICNR初始化
  • 从预训练的ImageNet模型转移学习
  • 基于VGG-16模型激活,像素损失和克矩阵损失的损失函数
  • 判别学习率
  • 渐进式调整大小

该模型或数学函数具有超过4000万个参数或系数,允许其尝试预先形成超分辨率。

剩余网络(ResNet)

ResNet是卷积神经网络(CNN)架构,由下面描述的一系列残余块(ResBlock)组成,跳过连接区分ResNets与其他CNN。
当第一次设计ResNet赢得了当年的ImageNet竞争时,它解决了消失的梯度问题,因为它增加了更多的层次,训练速度慢,准确性不会提高甚至变得更糟。正是网络跳过了完成这一壮举的连接。
这些在下图中显示,并且在描述ResNet中的每个ResBlock时更详细地解释。

在这里插入图片描述

残留块(ResBlocks)和密集块

如果卷积网络包含靠近输入的层和靠近输出的层之间的较短连接,则卷积网络可以更深,更准确,更有效。
如果您可视化损失表面(模型预测的不同损失的搜索空间),这看起来像一系列丘陵和山谷,如下图中的左手图像所示。最低损失是最低点。研究表明,即使它是较大网络的精确部分,也可以忽略较小的最优网络。这是因为损失表面太难以导航。这意味着通过向模型添加图层,可以使预测变得更糟。

在这里插入图片描述

有和没有跳过连接的损耗表面。来源:可视化神经网络中的损失空间:https://arxiv.org/abs/1712.09913

一个非常有效的解决方案是在网络层之间添加交叉连接,允许在需要时跳过大部分。这会创建一个看起来像右侧图像的损耗表面。这样可以更轻松地训练模型以获得最佳重量以减少损失。

在这里插入图片描述

ResNet中的ResBlock。资料来源:用于图像识别的深度残留学习:https://arxiv.org/abs/1512.03385

每个ResBlock从其输入有两个连接,一个通过一系列卷积,批量标准化和线性函数,另一个连接跳过该系列的卷积和函数。这些被称为身份,交叉或跳过连接。两个连接的张量输出相加。

密集连接的卷积网络和密集块

在ResBlock提供作为张量加法的输出的情况下,可以将其改变为张量级联。通过每个交叉/跳过连接,网络变得更加密集。ResBlock然后变成DenseBlock,网络变成DenseNet。
这允许计算跳过体系结构的越来越大的部分。

在这里插入图片描述
密集网内的密集块。来源:密集连接的卷积网络:https://arxiv.org/pdf/1608.06993.pdf

由于串联,与其他体系结构相比,DenseBlocks消耗大量内存,非常适合较小的数据集。

U型网络

U-Net是一种卷积神经网络架构,专为生物医学图像分割而开发。已经发现U-net对于输出与输入具有相似大小并且输出需要该空间分辨率的任务非常有效。这使得它们非常适合于创建分割掩模和用于图像处理/生成(例如超分辨率)。
当卷积神经网络通常与图像一起用于分类时,使用一系列步幅两个卷积来拍摄图像并将其下采样到一个或多个分类中,每次减小网格尺寸。
为了能够输出与输入相同或更大尺寸的生成图像,需要有一个上采样路径来增加网格尺寸。这使得网络布局类似于U形,U-Net,下采样/编码器路径形成U的左手侧,并且上采样/解码器路径形成U的右手部分。
对于上采样/解码器路径,几个转置的卷积实现了这一点,每个在现有像素之间和周围添加像素。基本上执行下采样路径的反向。上采样算法的选项将在下面进行讨论。
请注意,此模型的基于U-Net的体系结构也具有交叉连接,这些交叉连接将进一步详述,这些不是原始U-Net体系结构的一部分。

在这里插入图片描述

U-Net网络架构。资料来源:http://deeplearning.net/tutorial/_images/unet.jpg

原始研究可在此处获得:https://arxiv.org/abs/1505.04597

上采样/转置卷积

网络的解码器/上采样部分中的每个上采样(U的右手部分)需要在现有像素周围添加像素,并且还在现有像素之间添加像素以最终达到期望的分辨率。
该过程可以从以下文章“用于深度学习的卷积算法指南”中可视化,其中在像素之间添加零。蓝色像素是原始的2x2像素,扩展到5x5像素。添加了围绕外部的2个像素填充,并且还添加了每个像素之间的像素。在此示例中,所有新像素均为零(白色)。

在这里插入图片描述

添加像素周围和之间的像素。资料来源:深度学习卷积算法指南:https://arxiv.org/abs/1603.07285

通过使用像素的加权平均值(使用双线性插值)对新像素进行一些简单的初始化可以改善这一点,否则会不必要地使模型难以学习。
在这个模型中,它使用一种改进的方法,称为像素混洗或子像素卷积与ICNR初始化,这导致像素之间的间隙被更有效地填充。这在论文“使用有效的亚像素卷积神经网络的实时单图像和视频超分辨率”中描述。

在这里插入图片描述

像素随机播放。来源:使用高效亚像素卷积神经网络的实时单图像和视频超分辨率,来源:https://arxiv.org/abs/1609.05158

像素混洗上升了2倍,使图像的每个通道中的尺寸加倍(在网络的该部分的当前表示中)。然后执行复制填充以在图像周围提供额外的像素。然后执行平均合并以平滑地提取特征并避免由许多超分辨率技术产生的棋盘图案。
在添加这些新像素的表示之后,随后的卷积改善其中的细节,因为路径继续通过网络的解码器路径,然后升级另一步骤并使尺寸加倍。

U-Nets和精美的图像细节

当仅使用U-Net架构时,预测往往缺乏精细细节,以帮助解决此交叉或跳过连接可以在网络块之间添加。
不是像ResBlock中那样每两个卷积添加跳过连接,跳过连接从下采样路径中的相同大小的部分跨越到上采样路径。这些是上图中显示的灰线。
原始像素与具有跳过连接的最终ResBlock连接,以允许在知道输入到模型中的原始像素的情况下进行最终计算。这导致输入图像的所有精细细节都位于U-Net的顶部,输入几乎直接映射到输出。
U-Net块的输出被连接起来,使得它们与DenseBlocks更类似于ResBlocks。然而,有两个步骤可以减少网格大小,这也有助于防止内存使用量增长过大。

ResNet-34编码器

ResNet-34是34层ResNet架构,在U-Net的下采样部分(U的左半部分)用作编码器。
具有编码器架构的Fastai U-Net学习器将自动构建U-Net架构的解码器侧,在这种情况下将ResNet-34编码器转换为具有交叉连接的U-Net。
对于图像生成/预测模型,要知道如何有效地执行其预测,如果使用预训练模型,则大大加快了训练时间。然后,该模型具有需要检测和改进的特征类型的起始知识。当照片用作输入时,使用在ImageNet上预先训练过的模型和重量是一个很好的开始。用于pyTorch的预训练ResNet-34可以从Kaggle获得:https://www.kaggle.com/pytorch/resnet34

损失函数

损失函数基于对实时样式转移和超分辨率的损失以及Fastai课程(v3)中显示的改进的研究。
本文重点介绍特征损失(本文称为感知损失)。该研究没有使用U-Net架构,因为机器学习社区当时并未意识到它们。

在这里插入图片描述

来源:卷积神经网络(CNN)实时样式转换和超分辨率的感知损失:https://arxiv.org/abs/1603.08155

这里使用的模型使用VGG-16进行了与纸张类似的损失函数的训练,但也结合了像素均方误差损失和克矩阵损失。Fastai团队发现这非常有效。

VGG-16

VGG是2014年设计的另一种CNN架构,16层版本用于损失功能,用于训练该模型。

在这里插入图片描述
VGG-16网络架构。资料来源:https://neurohive.io/wp-content/uploads/2018/11/vgg16-1-e1542731207177.png

VGG模型。在ImageNet上预先训练的网络用于评估发电机模型的损耗。通常这将用作分类器来告诉您图像是什么,例如这是一个人,一只狗或一只猫。
忽略VGG模型的头部,并且损失函数使用网络主干中的中间激活,其表示特征检测。进一步在培训部分进一步描述了网络的主干和骨干。

在这里插入图片描述
VGG-16中的不同层。资料来源:https://neurohive.io/wp-content/uploads/2018/11/vgg16.png

可以通过查看VGG模型找到所有最大池层来找到这些激活。这些是网格大小更改和检测到功能的位置。
可以在下图中看到可视化各种图像激活的热图。这显示了在不同网络层中检测到的各种特征的示例。

在这里插入图片描述
CNN中特征激活的可视化。资料来源:https 😕/arxiv.org/pdf/1311.2901.pdf第4页

该超分辨率模型的训练使用基于VGG模型激活的损失函数。与GAN的批评部分不同,损失函数在整个训练过程中保持不变。
特征图具有256个通道,28乘28,用于检测诸如毛皮,眼球,翅膀和类型材料等特征,以及许多其他类型的特征。使用均方误差或基本损失的最小绝对误差(L1)误差来比较(目标)原始图像和生成的图像在同一层的激活。这些都是功能损失。此错误功能使用L1错误。
这允许损失函数知道目标地面实况图像中的哪些特征,并评估模型的预测特征与这些特征匹配的程度,而不仅仅是比较像素差异。

训练细节

训练过程从如上所述的模型开始:基于ResNet-34架构的U-Net使用基于ImageNet上预训练的VGG-16架构的损耗函数预先训练在ImageNet上,并结合像素丢失和克矩阵。

训练数据

凭借超高分辨率,在大多数应用程序中幸运的是,可以创建几乎无限量的数据作为训练集。如果获取了一组高分辨率图像,则可以将这些图像编码/调整为较小的图像,以便我们具有具有低分辨率和高分辨率图像对的训练集。然后可以使用我们的模型的预测来评估高分辨率图像。
低分辨率图像最初是一半尺寸的目标/地面实况图像的副本。然后,使用双线性变换初始对低分辨率图像进行放大,以使其与目标图像具有相同的尺寸,以输入到基于U-Net的模型中。
在这种创建训练数据的方法中采取的行动是模型学会适应的(逆转过程)。
培训数据可以通过以下方式进一步增强:

  • 随机降低边界内图像的质量
  • 采取随机作物
  • 水平翻转图像
  • 调整图像的光照
  • 添加透视变形
  • 随机添加噪音
  • 随机在图像中打孔
  • 随机添加重叠的文本或符号

下面的图像是数据增强的一个示例,所有这些都是从同一源图像生成的:

在这里插入图片描述

数据扩充的示例

将质量降低和噪声改变为每个图像的随机性改进了所得到的模型,使其能够学习如何改善所有这些不同形式的图像劣化并更好地概括。

功能和质量改进

基于U-Net的模型增强了放大图像中的细节和特征,通过包含大约4000万个参数的功能产生改进的图像。

训练模型的头部和主干

这里使用的三种方法特别有助于培训过程。这些是逐步调整大小,冻结然后解冻主干中权重的梯度下降更新和判别学习率。
该模型的架构分为两部分,主干和头部。
骨干网是U-Net的左手部分,是基于ResNet-34的网络的编码/下采样部分。头部是U-Net的右手部分,是网络的解码器/上采样部分。
主干基于在ImageNet上训练的ResNet34进行了预训练,这是转移学习。
头部需要其权重训练,因为这些层的权重被随机初始化以产生期望的最终输出。
在一开始,来自网络的输出基本上是像素Shuffle子卷积之外的像素的随机变化,其中ICNR初始化被用作网络的解码器/上采样路径中的每个高级中的第一步。
一旦经过训练,头部位于骨干顶部就可以让模型学习如何通过骨干中的预训练知识做一些不同的事情。
冻结骨干,训练头部
网络主干中的权重被冻结,以便最初仅训练头部中的权重。
学习速率查找器运行100次迭代并绘制损失与学习速率的关系曲线图,选择最陡斜率下降到最小损失的点作为最大学习速率。或者,可以使用比最低点小10倍的速率来查看是否表现更好。

在这里插入图片描述

学习率对抗损失,最佳斜率与骨干冻结

合适的一个周期政策用于改变学习率和动力,详见Leslie Smith的论文
https://arxiv.org/pdf/1803.09820.pdf和Sylvain Gugger的帖子https://sgugger.github.io/the-1cycle-policy.html

渐进式调整大小

最初训练大量较小的图像然后扩大网络和训练图像的速度更快。将图像从64px到64px升级并改进128px到128px图像比在较大图像上执行该操作和在较大数据集上执行快得多的任务要容易得多。这称为渐进式调整大小,它还有助于模型更好地概括,因为可以看到更多不同的图像,并且不太可能过度拟合。
这种渐进式调整大小的方法基于Nvidia对渐进式GAN的优秀研究:https://research.nvidia.com/sites/default/files/pubs/2017-10_Progressive-Growing-of/karras2018iclr-paper.pdf 。这也是Fastai在ImageNet培训中击败Tech巨头的方法:https://www.fast.ai/2018/08/10/fastai-diu-imagenet/
该过程是用较大批量的小图像训练,然后一旦损失减少到可接受的水平,则创建新模型,其接受较大的图像,从较小图像上训练的模型转移学习。
随着训练图像尺寸的增加,批量大小必须减小以避免内存耗尽,因为每批包含较大的图像,每个图像的像素数是其四倍。
请注意,输入图像中的缺陷已随机添加,以改善模型的恢复属性并帮助其更好地概括。
这里以一些渐进大小显示了与训练集分离的验证集中的示例:
在每个图像大小训练中,执行10个历元的一个周期。这是骨干重量,冷冻。
图像大小加倍,模型使用额外的网格大小进行更新,以获得通过网络的较大图像的路径。重要的是要注意权重的数量不会改变。
步骤1:从32像素乘32像素到64像素乘64像素的高档。学习率为1e-2。
在这里插入图片描述
验证集中32px x 32px图像的超分辨率为64px×64px。左低分辨率输入,中间超分辨率模型预测,右目标/地面真实。

第2步:从64像素乘64像素到128像素乘128像素的高档。学习率为2e-2。

在这里插入图片描述

来自验证集的64px x 64px图像的超分辨率为128px×128px。左低分辨率输入,中间超分辨率模型预测,右目标/地面真实

步骤3:从128像素乘128像素到256像素乘256像素的高档。使用3e-3和1e-3之间的判别学习率。

在这里插入图片描述

来自验证集的128px×128px图像的超分辨率为256px×256px。左低分辨率输入,中间超分辨率模型预测,右目标/地面真实

步骤4:从256像素乘256像素到512像素乘512像素的高档。使用1e-3之间的判别学习率。

在这里插入图片描述

验证集中256px x 256px图像的超分辨率为512px×512px。左低分辨率输入,中间超分辨率模型预测,右目标/地面真实

解冻骨干

骨架分为两个层组,头部是第三层组。
然后解冻整个模型的权重,并用有辨别的学习率训练模型。这些学习率在第一层组中小得多,然后在第二层组中增加并且在头部(最后一层)组中再次增加。
学习速率查找器再次运行,主干和头解冻。

在这里插入图片描述

学习率与骨干和头部解冻的损失

使用1e-6和1e-4之间的判别学习率。头部的学习率仍然比上一学习周期少一个数量级,其中只有头部被解冻。这允许对模型进行微调,而不会有失去已经发现的大部分精度的风险。这被称为学习速率退火,其中当我们接近最佳损失时学习速率降低。
对较大输入图像的持续训练将提高超分辨率的质量,但是批量大小必须保持收缩以适应内存约束并且训练时间增加并且达到了我的训练基础设施的限制。
所有训练均在具有12GB RAM的Nvidia Tesla K80 GPU上进行,并且从开始到结束不到12小时,逐步调整大小。

结果

上述图像在逐步调整大小的训练部分,显示了基于深度学习的超级分辨率如何有效地改善细节,去除水印,缺陷和丢失细节。
基于图像形成DivTK数据集的接下来的三个图像预测都具有由相同训练模型对它们执行的超分辨率,表明深度学习超分辨率模型可能能够普遍应用。
注意:这些来自实际的Div2K训练集,尽管该集合被分成我自己的训练和验证数据集,并且模型在训练期间没有看到这些图像。进一步的实际Div2K验证集还有其他例子。
左:256 x 256像素输入。中:从模型预测512 x 512。右:512 x 512像素地面真实目标。看着火车前面的通风口,细节的改善很明显,非常接近地面真实目标。
在这里插入图片描述
256乘256像素超分辨率到512乘512像素图像,例1

左:256 x 256像素输入。中:从模型预测512 x 512。右:512 x 512像素地面真实目标。下面的图像预测功能改进非常惊人。在我早期的训练尝试期间,我几乎总结出人类特征的超分辨率将是一项过于复杂的任务。

在这里插入图片描述

256乘256像素超分辨率到512乘512像素图像,例2

左:256 x 256像素输入。中:从模型预测512 x 512。右:512 x 512像素地面真实目标。注意白色“Fire Exit”文本和镶板线是如何改进的。

在这里插入图片描述

256乘256像素超分辨率到512乘512像素图像,例3

Div2K验证集的超高分辨率

来自官方Div2K验证集的超分辨率示例。此处提供PDF版本:https://drive.google.com/open?id = 1ylselPp__emdYwIHpMlhw4fxjN_LybkQ

Div2K验证数据集的模型预测比较

Oxford 102 Flowers数据集的超高分辨率

超分辨率是由花卉图像数据集上的单独训练模型产生的,我认为非常出色,许多模型预测实际上看起来比在验证集上真正执行超分辨率的基本事实更清晰(在训练期间未看到的图像) 。

验证结果可以对来自102个花类别的Oxford 102 Flowers数据集进行升级

Oxford-IIIT Pet数据集的超高分辨率

以下示例从单独训练的模型中提取狗的低分辨率图像非常令人印象深刻,再次来自验证集,创建更精细的毛皮细节,锐化眼睛和鼻子,并真正改善图像中的功能。大多数放大的图像都接近于基本事实,当然比双线性放大的图像要好得多。

验证结果提升了来自Oxford-IIIT Pet数据集的图像,这是一个37类宠物数据集,每个类大约有200个图像。

我相信这些结果令人印象深刻,该模型必须已经开发了一组像素必须在照片/图像的原始主题中的“知识”。
它知道某些区域是模糊的,并且知道重建模糊的背景。
如果在损失函数的特征激活方面表现不佳,则模型无法执行此操作。实际上,模型已经反向设计了哪些特征匹配这些像素以匹配损失函数中的激活。

限制

对于要通过模型学习的类型的修复,它必须在训练数据中作为要解决的问题。当孔被打入训练模型的输入图像时,模型不知道如何处理它们并保持不变。
需要在图像上产生幻觉的特征或至少类似的特征必须存在于训练集中。如果模型是针对动物进行训练的,那么模型不太可能在完全不同的数据集类别(例如房间内部或花朵)上表现良好。
尽管在Div2K训练集中的一些例子确实看到了特征的良好改进,但是在近距离人脸训练的模型上的超分辨率结果并不是特别令人信服。特别是在X4超分辨率下,虽然特征比最近邻插值更锐利,但这些特征具有几乎绘制/艺术效果。对于非常低分辨率的图像或具有大量压缩伪像的图像,这可能仍然是优选的。这是我计划继续探索的一个领域。

结论

基于U-Net深度学习的超级分辨率使用诸如此类的丢失函数训练可以很好地执行超分辨率,包括:

  • 将低分辨率图像升级为更高分辨率的图像
  • 提高保持分辨率的图像质量
  • 删除水印
  • 消除图像中的破坏
  • 删除JPEG和其他压缩工件
  • 着色灰度图像(另一项正在进行的工作)

对于要通过模型学习的类型的修复,它必须在训练数据中作为要解决的问题。将孔打入训练模型的输入图像中,模型不知道如何处理它们并使它们保持不变,而当将打孔添加到训练数据中时,训练模型可以很好地恢复这些孔。

这里显示的所有超分辨率图像都是我训练过的模型的预测。

下面有五个例子,我相信模型的预测(中心)与目标(右)一样好或非常接近,来自验证集的原始地面实况图像。该模型适用于动物特征,如皮毛和眼睛,眼睛是一个非常难以锐化和增强的任务。

在这里插入图片描述

超级分辨率结束例1

在这里插入图片描述

超级决议结束例子2

在这里插入图片描述

超级分辨率结束例子3

在这里插入图片描述

超级分辨率结束例4

在这里插入图片描述

超级分辨率结束例5

验证集中有最后一个例子,在我看来,模型的预测(中心)和目标(右)一样,来自验证集的原始地面实况图像。

在这里插入图片描述

超分辨率结束例6,模型预测可能比地面真实目标更好?

下一步研究

我计划将模型移动到生产Web应用程序中,然后可能移动到移动Web应用程序中。
一旦进行了一些改进并进行了一些重构,我将发布我的源代码并训练模型。
我正在对Image Net数据集的较大子集进行培训,其中包含许多类别以生成有效的通用超分辨率模型,该模型在任何类别的图像上都表现良好。我也正在训练我在这里训练的相同数据集的灰度版本,模型在这里对图像进行着色。
我计划尝试使用ResNet-50等模型体系结构以及带有Inception stem的ResNet骨干网。

道德问题

通过在安全镜头,航空摄影或类似物等类别中使用的幻觉细节产生幻觉,然后从低分辨率图像生成图像可能会使其远离原始的真实主题。
想象一下,如果面部特征变得微妙但足以通过面部识别来识别一个人实际上并不存在,或者空中照片被改变得足以使另一个算法识别出建筑物不是它的东西。不同的训练数据应该有助于避免这种情况,尽管随着超分辨率方法的改进,它仍然是一个问题,因为缺乏机器学习研究界历史上使用的各种训练数据。

Fastai

感谢Fastai团队,没有您的课程和软件库,我怀疑我是否能够进行这些实验并了解这些技术。

展开阅读全文

没有更多推荐了,返回首页