深度学习自动上色,数月工作几秒完成

转载自:https://blog.floydhub.com/colorizing-b&w-photos-with-neural-networks/,有删节。

【嵌牛导读】:本文是作者对Reddit社区用户Amir Avni深度学习上色机器人的实现,看完本文后,你也能打造媲美大师级着色效果的自动上色神经网络应用。

【嵌牛鼻子】:自动上色 神经网络

【嵌牛提问】:自动上色有什么原理?以及哪些方式?

【嵌牛正文】:


深度学习自动上色,数月工作几秒完成_第1张图片

如今,上色都是人手工用Photoshop做的,一张图片要花好几个月才能完成,需要进行大量调查研究,光是其中的一张脸就需要多达20层图层。但是,基于深度神经网络的自动着色机器人,可以几秒钟就实现PS几个月的效果,而且成效越来越惊人。

下面,我们将分三个步骤展示如何打造你自己的着色神经网络。第一部分讲解核心逻辑。我们将构建一个40行代码的神经网络,作为“Alpha”着色机器人。

然后,我们将创建一个可以泛化的神经网络——“Beta”版本。Beta机器人能对以前没有看到的图像着色。

最后,我们将神经网络与一个分类器相结合,得到“最终”版本。我们将使用120万张图像训练过的Inception Resnet V2。为了让着色效果吸引眼球,我们将使用Unsplash(免费图库,里面的图片非常有艺术感和设计感)的人像作为数据,训练我们的神经网络。

核心技术拆解:自动着色=发现灰度与彩色间的特征

在本节中,我将概述如何渲染图像,数字颜色的基础知识以及神经网络的主要逻辑。

黑白图像可以在像素网格中表示。每个像素具有对应于其亮度的值,范围为0 - 255,从黑色到白色。


深度学习自动上色,数月工作几秒完成_第2张图片

彩色图像由三层组成:红色层,绿色层和蓝色层。直观地,你可能会认为植物只存在于绿色层。但是,如下图所示,绿色的叶子在三个通道中都有。这些层不仅可以确定颜色,还可以确定亮度。


深度学习自动上色,数月工作几秒完成_第3张图片

为了得到白色这个颜色,需要将所有颜色均匀分布。通过添加等量的红色和蓝色,绿色会变得更亮。因此,彩色图像使用三层对颜色和对比度进行编码:


深度学习自动上色,数月工作几秒完成_第4张图片

就像黑白图像一样,彩色图像中每个图层的值也都为0 - 255。值为0意味着该图层中没有颜色。 如果所有颜色通道的值都为0,则图像像素为黑色。

神经网络会创建输入值和输出值之间的关系。更准确地说,着色任务实际上就是网络需要找到链接灰度图像与彩色图像的特征。

因此,着色机器人要寻找的,就是将灰度值网格链接到三色网格的特征。


深度学习自动上色,数月工作几秒完成_第5张图片

Alpha版本:40行代码,实现基础着色机器人

我们从简单的神经网络开始,给一张女性脸部图像(见下)着色。


深度学习自动上色,数月工作几秒完成_第6张图片

只需40行代码,我们就能实现以下转换。中间的图像是用神经网络完成的,右边的图片是原始的彩色照片。当然,这里的网络使用了相同的图像做训练和测试,稍后我们将在Beta版本中再来讲这一点。

颜色空间

首先,我们使用一种算法来改变颜色通道,从RGB到Lab。L表示亮度,a和b分别表示颜色光谱,绿-红和蓝-黄。

如下所示,Lab编码的图像有一层灰度,将三层颜色层压成两层。这意味着我们可以在最终预测中使用原始的灰度图像。 此外,我们只有两个通道做预测。


深度学习自动上色,数月工作几秒完成_第7张图片

人类眼睛中有94%的细胞是确定亮度的,这是个科学事实。只有6%的受体被用作颜色的传感器。如上图所示,灰度图像比彩色层更加清晰。这也是我们最终预测中保持灰度图像的另一个原因。

从黑白到彩色

我们的最终预测是这样的。我们有一个输入灰度层,我们想预测Lab中的两个彩色层。要创建最终的彩色图像,我们将纳入用于输入的L/灰度图像,从而创建一个Lab图像。


深度学习自动上色,数月工作几秒完成_第8张图片

我们使用卷积滤波器将一层转成两层。你可以将它们视为3D眼镜中的蓝/红滤镜。每个滤波器确定我们在图片中看到的内容,可以突出显示或删除某些东西,从图片中提取信息。网络可以从滤波器中创建新的图像,也可以将多个滤波器组合成一个图像。

卷积神经网络的每个滤波器都自动调整,以帮助预期的结果。我们从堆叠数百个滤镜开始,然后将它们缩小为两层,即a层和b层。

Beta版本:为没有见过的图像着色

Alpha版本不能很好地给未经训练的图像着色。接下来,我们将在Beta版本中做到这一点——将上面的将神经网络泛化。

以下是使用Beta版本对测试图像着色的结果。


深度学习自动上色,数月工作几秒完成_第9张图片

我们没有使用ImageNet,而是在FloydHub上创建了一个高质量图像的公共数据集。图片来自Unsplash——公开的专业摄影师创意图片。这个数据集包括9.5万个训练图像和500个测试图像。

特征提取器

我们的神经网络要做的是发现将灰度图像与其彩色版本相链接的特征。

试想,你必须给黑白图像上色,但一次只能看到9个像素。你可以从左上角到右下角扫描每个图像,并尝试预测每个像素应该是什么颜色。


例如,这9个像素就是上面那张女性人脸照片上鼻孔的边缘。要很好的着色几乎是不可能的,所以你必须把它分解成好几个步骤。


深度学习自动上色,数月工作几秒完成_第10张图片

首先,寻找简单的模式:对角线,所有黑色像素等。在每个滤波器的扫描方块中寻找相同的精确的模式,并删除不匹配的像素。这样,就可以从64个迷你滤波器生成64个新图像。

如果再次扫描图像,你会看到已经检测到的相同的模式。要获得对图像更高级别的理解,你可以将图像尺寸减小一半。


深度学习自动上色,数月工作几秒完成_第11张图片

这个过程就像大多数处理视觉的神经网络,也即卷积神经网络的行为。结合几个过滤图像了解图像中的上下文。

最终版本

我们的最终版本着色神经网络有四个组成部分。我们将之前的网络拆分成编码器和解码器,在这之间使用了一个融合层。

与编码器相并列的是当今最强大的一个分类器——Inception Resnet v2,经过1.2M图像训练的网络。我们提取了分类层,并将其与编码器的输出进行合并。


深度学习自动上色,数月工作几秒完成_第12张图片

通过将学习从分类器转移到着色网络,网络可以了解图片中的内容。因此,使网络能够将对象表示与着色方案相匹配。

以下是一些验证图像,仅使用20张图像来训练网络。


深度学习自动上色,数月工作几秒完成_第13张图片

大多数图像变得很差,但是由于大量验证/测试集(2,500张图像),我设法找到了一些看上去还不错的图像。在更多的图像上进行训练可以获得更加一致的结果,但是大部分都是棕色的。

如果你还想了解更多,这里是着色机器人Alpha版本的Jupyter Notebook(https://www.floydhub.com/emilwallner/projects/color/43/code/Alpha-version/alpha_version.ipynb)。你还可以查看FloydHub(https://www.floydhub.com/emilwallner/projects/color/43/code)和GitHub上的这三个版本(https://github.com/emilwallner/Coloring-greyscale-images-in-Keras)。

你可能感兴趣的:(深度学习自动上色,数月工作几秒完成)