将神经网络训练成一个“放大镜”

摘要: 想不想将神经网络训练成一个“放大镜”?咱们就训练了一个这样炫酷的神经网络,点击文章一块儿看下吧!git

低分辨率蝴蝶的放大github

当咱们网购时,咱们确定但愿有一个贴近现实的购物体验,也就是说可以全方位的看清楚产品的细节。而分辨率高的大图像可以对商品进行更加详细的介绍,这真的能够改变顾客的购物体验,让顾客有个特别棒的购物之旅。idealo.de是欧洲领先的比价网站,也是德国电子商务市场最大的门户网站之一,在此基础上,咱们但愿可以在此基础上为用户提供一个用户友好、有吸引力的购物平台。算法

在这里,咱们利用深度学习来评估数百万酒店图像的美学层次和技术质量,另外,那些没有任何信息的、特别难看的小的产品图像对咱们来讲是无效的,所以须要想办法解决。数组

购物网站上并非全部的商店都能为顾客提供高质量的图像,相反,商家提供的图像特别小、分辨率特别低、质量也很低。为了向用户展现高质量的高分辨率图像,咱们基于2018年的论文《图像超分辨率的RDN网络》,训练了一个特别先进的卷积神经网络。服务器

咱们的目标很简单:拍摄一些特别小的图像,而后就像使用放大镜同样,对图像进行放大,而且还要保持高分辨率。网络

本文对实现这一目标作了详细介绍,另外,具体实现的细节,请查看GitHub框架

总概ide

与大多数深度学习项目同样,咱们的深度学习项目主要有四个步骤:函数

1.回顾前人对该项目所作的贡献。性能

2.实施一个或多个解决方案,而后比较预先训练的版本。

3.获取数据,训练并测试模型。

4.针对训练和验证结果对模型进行改进和优化。

具体来讲,本文主要有如下几方面的内容:

1.介绍模型训练的配置,如何评估模型的性能

2. 查看早期训练和测试结果,了解从哪方面进行改进。

3.指出后续须要探索的方向。

训练

与以往“标准”的监督深度学习任务不一样,咱们这个“放大镜”深度学习模型输出的不只仅是类标签或一个分数,而是一整幅图像。这就意味着训练过程以及评估会跟以往略有不一样,咱们要输出的是原始高分辨率图像,为了更好的对模型进行评估,咱们须要一种测量缩放输出图像“质量”的方法,该方法更详细的优缺点将在后面进一步作详细阐释。

损失函数

损失函数是用来评估神经网络的性能究竟如何,这个有不少方法能够评估。这个问题的本质为你们留下了创造力空间,若有些聪明的人会用高级特征和对抗网络。对于第一次迭代,咱们使用标准方法:网络的超分辨率(SR)输出和高分辨率输出(HR)之间的像素均方差(MSE)。

评估

咱们用峰值信噪比(PSNR)来评估输出图像的质量,峰值信噪比是基于两个图像之间的像素均方差(MSE)。因为峰值信噪比是最经常使用的评估输出图像质量的方法,所以咱们也使用这一评估标准,以便将本文模型与其余模型做比较。

开始

咱们在p2.xlarge AWS EC2实例上进行训练,直到验证损失函数收敛,训练结束,这大概须要90个周期(一个周期24小时),而后使用Tensorboard跟踪训练数据集及验证数据集的损失函数和PSNR值。

90个训练时期的Tensorboard图

如上图所示,左上角为在每一个周期结束时,反向传播到神经网络上的训练损失函数。右上角为跟踪泛化性能的非训练数据及的损失。左下角为训练数据集的PSNR值。右下角为验证数据集的PSNR值。

结果

输出的结果以下所示,咱们先看看模型的输出结果,再考虑如何对该模型进行改进。左侧是验证数据集中的整个图像,中间是卷积神经网络的输出提取图像块,右侧是使用标准过程将中间输出提取图像块按比例放大后的输出,这里使用了GIMP的图像缩放功能

LR图像(左),重建SR(中),GIMP基线缩放(右)。

这个结果确定不是特别完美:蝴蝶的天线周围有些不必的噪声,蝴蝶的颈部和背部的毛发及翅膀上有些斑点轮廓,神经网络的输出图像(中)看起来要比GIMP基线输出图像(右)更加清晰。

结果分析

为了进一步理解模型有哪些优缺点,咱们须要从验证数据集中提取具备高PSNR值的图像块和具备低能量度值的图像块。

不出所料,性能最佳的图像块是具备较多平坦区域的图像块,而较为复杂的图像块难以准确再现。所以,咱们重点关注这些较复杂的图像块,以便对结果进行训练和评估。

一样的,咱们也可使用热图(heatmap)突出显示原始HR图像和神经网络输出SR图像之间的偏差,颜色较暗的部分对应于较高的像素均方偏差(较差的结果),颜色较浅的部分对应于较低的像素均方偏差(或较好的结果)

HR-SR像素偏差热图。颜色越暗,偏差越大。

咱们能够看到,具备多种模式的区域的偏差会更大,可是看起来“更简单”的过渡区域则是至关黑暗的(例如云、天空),这是能够改进的,由于它与idealo的目录用例相关。

浅谈深度学习任务中的非真实数据

与常见的分类问题或输出为一个分值的监督式深度学习任务不一样,咱们用于评估神经网络输出的真实数据是原始HR图像。

这既有好处,也有坏处。

坏处:像Keras这样的当前较为流行的深度学习框架没有预先制定训练解决方案,好比生成器。实际上,它们一般依赖于从一维数组中获取训练和验证标签或文件,或者是直接从文件结构中派生出来的,这会涉及到一些额外的编码算法。

好处:没有必要花太多时间来得到标签,给出一个HR图像池,咱们能够对其进行简单的缩小,得到咱们所须要的LR训练数据,并使用原始HR图像来评估损失函数

一般来讲,使用图像数据对神经网络进行训练时,须要从训练数据集中随机的选择多个图像来建立训练批次。而后将这些尺寸从新缩小到一个较小的尺寸,通常来讲,大小约为100*100像素。咱们随时使用随机变换对图像进行加强,并反馈到神经网络中。在这种状况下,没有必要向神经网络反馈整张图像,而且这也很是不可取。这是由于,咱们不能将图像从新缩放到100*100的小像素点。毕竟,咱们想要对图像进行放大。同时,咱们也没法用较大尺寸的图像进行训练,好比大小为500*600像素的图像,由于处理这种大图像须要很长的时间。相反,咱们能够从整个图像中提取一个很是小的随机色块,好比大小为16*16像素块,这样一来,咱们就有了更多的数据点,由于每一个图像均可以提供数百个不一样的色块。

咱们之因此可以处理这种小色块,是由于咱们不须要将一堆图像进行分类,好比:腿+尾巴+胡须+死老鼠=猫。所以,模型的末端就没有全链接层。咱们只须要使用神经网络来构建这些模式的抽象表示,而后学习如何对其进行放大,除此之外,还要对块进行从新组合,使组合后的图像变得有意义。这种抽象表示由卷积层和放大层来完成,其中,卷积层是该网络中惟一的一种层类型。

咱们还要说明的是,全卷积结构使该网络的输入大小相互独立。也就是说,这意味着它与普通的分类卷积神经网络有所不一样,你能够向彻底卷积神经网络中输入任何大小的图像:不管输入图像原始大小是什么,网络都会输入一个输入图像大小2倍的图像。

有关图像超分辨率的RDN网络更加详细的介绍,请查看文末连接。

另外一方面,咱们还须要思考如何从图像中提取这些块。思路以下:从数据集中提取出n个随机图像,而后从每一个图像中提取p个随机快。咱们尝试了几种方法,以下图所示:

提取块的不一样方法

首先,从一个均匀的网格中提出块,并建立一个完整的块数据集。在训练的时候,咱们随机的提取其batch_size,并对其进行放大,反馈给网络。这种方法的缺点是须要静态的存储很是大的数据集,若是要用云服务器进行训练,这种方法其实并不理想:移动和提取数据集是一项至关耗时的操做,而且具备肯定性定义的数据集可能并非最佳数据集。

另外一种方法是随机选择batch_size大小的图像,并从中提取单个块。这种方法须要从磁盘中读取数据,这就大大下降了训练时间(咱们设置的每一个训练时间为15min-1h)。

最后,咱们将原始数据集中随机提取的单个图像块进行融合,并从中提取动态的batch_size块,这不只能存储原始数据集,同时,也能保持较快的训练速度。

拓展

这是放大idealo网站产品目录的第一步,咱们已经完成了。

下面是咱们将产品图像中低质量、低分辨率的图像进行放大,并输出。

凉鞋的低分辨率图像

凉鞋的放大图像

从上图中,咱们能够看到,图像中较为平坦的地方会产生较为明显的噪声,文本也会略有失真。这就是咱们计划要改进的地方。

在下一步的探索中,咱们将在本身的产品图像数据集上对神经网络进行训练。

相关连接

Github: Image Super Resolution

Paper: Residual Dense Network for Image Super-Resolution (Zhang et al. 2018)

Dataset: DIVerse 2K resolution high quality images

原文连接

相关文章
相关标签/搜索