0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过深度学习方法为黑白老照片自动上色,带我们重新忆起那段老时光!

电子工程师 来源:未知 作者:李倩 2018-09-07 10:13 次阅读

我们知道,深度学习几乎已经应用在每一个领域,但如果我们能够构建一个基于深度学习的模型,让它能够给老照片着色,重现我们童年的旧回忆,这该多么令人激动啊!那么我们要怎么做呢?本文的作者将为大家介绍一个教程,通过深度学习方法为黑白老照片自动上色,带我们重新忆起那段老时光!

现如今,给照片着色通常是在 PS 中手工完成的。

所以说,如果要给一幅照片着色的话,短时间内是不可能完成的。它需要广泛的研究,要知道,单是一张脸的着色,就需要多达20层粉色、绿色和蓝色的色调才能使照片拥有恰到好处的效果。

现在,我要介绍的这个简单的神经网络——Inception Resnet V2,已经训练了120万张图像,可以帮助我们完成着色的任务。为了能够实现着色,我们将用 Unsplash 的肖像来训练这个神经网络。

介绍

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

黑白图像可以用像素网格表示,每个像素都有与其亮度相对应的值。这些值的范围是0~255,对应的是从黑到白。

彩色图像是由三层组成:红色层、绿色层和蓝色层。你可以想象一下,在白色背景上将绿叶分成三个通道。直觉上,你可能会认为植物只存在于绿色层中。

但是,如下图所示,叶子在所有三个通道中都存在。这些层不仅决定了颜色,还决定了亮度。

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

和黑白图像一样,彩色图像中的每一层,也有0~255的值。值0表示这个层中没有颜色。如果像素网格所有颜色通道的值都为0,那么这个图像像素就是黑色的。

神经网络在输入值和输出值之间创建了一种关系。为了能够更为准确地完成着色任务,网络需要找到能够将灰度图像和彩色图像联系起来的特征。

总的来说就是,我们需要找到能够将灰度值网格链接到三个颜色网格的特征。

f()是神经网络,[B&W]是我们的输入,[R]、[G]、[B]是我们的输出

现在,随着数据集的增加,由于我们处理的是高分辨率图像,因此我们需要更多的计算能力。为此,我个人更喜欢使用 Deep Cognition 的 Deep Learning Studio jupyter notebooks,它为Amazon 的深度学习示例提供了GPU,可用来训练模型。

如果你不熟悉如何使用Deep Learning Studio,可以看看以下这些资料

Deep Learning made easy with Deep Learning Studio — An Introduction

http://u6.gg/eqfdu

Deep Learning made easy with Deep Learning Studio — Complete Guide

http://u6.gg/eqffa

A video walkthrough of Deep Cognition

http://u6.gg/eqfh7

python代码和数据集可以从 GitHub 中下载

https://github.com/Rajat2712/Deep-Learning-Studio

环境设置

Deep Learning Studio 最好的地方之一就是,只需单击 Deep Learning Studio Cloud,就可以轻松地完成安装,然后随时随地使用它们。

▌1.安装 Python 环境

要安装 Python 环境,请点击 DLS 中的 Environments 选项卡。

然后在 Available Environments 单击你要安装的环境。

对于这项任务,我们将安装以下环境:

Python3

Tensorflow-gpu-1.6.0

Keras-gpu-2.1.5

▌2.安装python包

单击启动环境。然后点击菜单的 Open New Terminal 打开终端。

在终端中键入以下命令:

1pipinstallscikit-image

上传数据集

打开文件浏览器,并为这个项目创建一个新文件夹。上传在 Github 存储库中可用的数据集。

如果需要自定义数据集,可以通过在 train 文件夹中上传高分辨率的彩色图像和test文件夹中的灰度图像来创建。

接下来我们开始编码

▌导入所有的库

1importkeras 2fromkeras.applications.inception_resnet_v2importInceptionResNetV2 3fromkeras.preprocessingimportimage 4fromkeras.engineimportLayer 5fromkeras.applications.inception_resnet_v2importpreprocess_input 6fromkeras.layersimportConv2D,UpSampling2D,InputLayer,Conv2DTranspose,Input,Reshape,merge,concatenate 7fromkeras.layersimportActivation,Dense,Dropout,Flatten 8fromkeras.layers.normalizationimportBatchNormalization 9fromkeras.callbacksimportTensorBoard10fromkeras.modelsimportSequential,Model11fromkeras.layers.coreimportRepeatVector,Permute12fromkeras.preprocessing.imageimportImageDataGenerator,array_to_img,img_to_array,load_img13fromskimage.colorimportrgb2lab,lab2rgb,rgb2gray,gray2rgb14fromskimage.transformimportresize15fromskimage.ioimportimsave16importnumpyasnp17importos18importrandom19importtensorflowastf

▌从Train文件夹中读取所有图像并加载初始权重值

1#Getimages2X=[]3forfilenameinos.listdir('Train/'):4X.append(img_to_array(load_img('Train/'+filename)))5X=np.array(X,dtype=float)6Xtrain=1.0/255*X7#Loadweights8inception=InceptionResNetV2(weights='imagenet',include_top=True)9inception.graph=tf.get_default_graph()

▌在融合层(fusion layer)两边分别创建编码器和解码器

Inception ResNet v2 是一个在120万张图像上训练的神经网络,也是现今最强大的分类器之一。与编码器并行,输入图像也通过 Inception ResNet v2 来运行。提取分类层并将其与编码器的输出合并。

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

将encoder_input输入到我们的编码器模型中,然后将编码器模型的输出与融合层中的 embed_input融合,用融合层的输出作为解码器模型的输入,最后返回最终的输出decoder_output。

1embed_input=Input(shape=(1000,)) 2#Encoder 3encoder_input=Input(shape=(256,256,1,)) 4encoder_output=Conv2D(64,(3,3),activation='relu',padding='same',strides=2)(encoder_input) 5encoder_output=Conv2D(128,(3,3),activation='relu',padding='same')(encoder_output) 6encoder_output=Conv2D(128,(3,3),activation='relu',padding='same',strides=2)(encoder_output) 7encoder_output=Conv2D(256,(3,3),activation='relu',padding='same')(encoder_output) 8encoder_output=Conv2D(256,(3,3),activation='relu',padding='same',strides=2)(encoder_output) 9encoder_output=Conv2D(512,(3,3),activation='relu',padding='same')(encoder_output)10encoder_output=Conv2D(512,(3,3),activation='relu',padding='same')(encoder_output)11encoder_output=Conv2D(256,(3,3),activation='relu',padding='same')(encoder_output)12#Fusion13fusion_output=RepeatVector(32*32)(embed_input)14fusion_output=Reshape(([32,32,1000]))(fusion_output)15fusion_output=concatenate([encoder_output,fusion_output],axis=3)16fusion_output=Conv2D(256,(1,1),activation='relu',padding='same')(fusion_output)17#Decoder18decoder_output=Conv2D(128,(3,3),activation='relu',padding='same')(fusion_output)19decoder_output=UpSampling2D((2,2))(decoder_output)20decoder_output=Conv2D(64,(3,3),activation='relu',padding='same')(decoder_output)21decoder_output=UpSampling2D((2,2))(decoder_output)22decoder_output=Conv2D(32,(3,3),activation='relu',padding='same')(decoder_output)23decoder_output=Conv2D(16,(3,3),activation='relu',padding='same')(decoder_output)24decoder_output=Conv2D(2,(3,3),activation='tanh',padding='same')(decoder_output)25decoder_output=UpSampling2D((2,2))(decoder_output)26model=Model(inputs=[encoder_input,embed_input],outputs=decoder_output)

现在,我们必须调整图像的大小来适应 Inception 模型。然后根据模型对像素和颜色值使用预处理器进行格式化。在最后一步中,我们通过 Inception 网络运行它并提取模型的最后一层。

1defcreate_inception_embedding(grayscaled_rgb): 2grayscaled_rgb_resized=[] 3foriingrayscaled_rgb: 4i=resize(i,(299,299,3),mode='constant') 5grayscaled_rgb_resized.append(i) 6grayscaled_rgb_resized=np.array(grayscaled_rgb_resized) 7grayscaled_rgb_resized=preprocess_input(grayscaled_rgb_resized) 8withinception.graph.as_default(): 9embed=inception.predict(grayscaled_rgb_resized)10returnembed

用ImageDataGenertor可以调整图像生成器的设置。如此一来得到不会重复的图像,从而提高了学习率。shear_rangetilts使图像向左或向右倾斜,其他设置为缩放、旋转和水平翻转。

1#Imagetransformer2datagen=ImageDataGenerator(3shear_range=0.2,4zoom_range=0.2,5rotation_range=20,6horizontal_flip=True)7#Generatetrainingdata8batch_size=10

我们使用 Xtrain 文件夹中的图像,根据上面的设置生成图像。然后,为X_batch提取黑色层和白色层,并为两个颜色层提取两种颜色。

为创建我们的 batch,我们使用经过调整的图像。将它们转换为黑白图像,并通过 Inception ResNet 模型运行它们。

1defimage_a_b_gen(batch_size):2forbatchindatagen.flow(Xtrain,batch_size=batch_size):3grayscaled_rgb=gray2rgb(rgb2gray(batch))4embed=create_inception_embedding(grayscaled_rgb)5lab_batch=rgb2lab(batch)6X_batch=lab_batch[:,:,:,0]7X_batch=X_batch.reshape(X_batch.shape+(1,))8Y_batch=lab_batch[:,:,:,1:]/1289yield([X_batch,create_inception_embedding(grayscaled_rgb)],Y_batch)

现在,我们将使用 “RMSProp” 优化器和均方误差作为损失函数来编译模型。

GPU 越强,得到的图像就越多。通过现在的设置,你可以使用50~100张图像。steps_per_epoch是通过将训练图像的数量除以 batch 大小来计算的。

1#Trainmodel2model.compile(optimizer='rmsprop',loss='mse')3model.fit_generator(image_a_b_gen(batch_size),epochs=50,steps_per_epoch=1)

1.0/255 表示我们使用的是 24 位 RGB 颜色空间,这意味着我们为每个颜色通道使用 0 ~ 255 之间的数字。这将会产生 1670 万种颜色的组合。

而人类只能感知 200 ~ 1000 万种颜色,因此,使用再大的颜色空间并没有多大意义。

与 RGB 颜色空间相比,LAB 颜色空间具有不同的范围。在 LAB 颜色空间中,颜色光谱 ab 范围从-128~128。通过将输出层中的所有值除以 128,将色谱范围限制在 -1 ~ 1 之间。

将它与神经网络相匹配,神经网络也返回 -1 ~ 1 之间的值。

在使用 rgb2lab 函数转换颜色空间之后,我们选择灰度层:[:,:,0],这是对神经网络的输入。[:,:,1:]选择两个颜色层:绿-红和蓝-黄。

1color_me=[]2forfilenameinos.listdir('Test/'):3color_me.append(img_to_array(load_img('Test/'+filename)))4color_me=np.array(color_me,dtype=float)5gray_me=gray2rgb(rgb2gray(1.0/255*color_me))6color_me_embed=create_inception_embedding(gray_me)7color_me=rgb2lab(1.0/255*color_me)[:,:,:,0]8color_me=color_me+.reshape(color_me.shape+(1,))

神经网络进行训练后,做出最终的预测,并将其转化为图像。

在这里,我们使用一个灰度图像作为输入,并通过训练好的神经网络来运行它。我们取在 -1 ~ 1 之间所有的输出值,然后乘以 128,就得到了 Lab 色谱中正确的颜色。

最后,用 三层 0 填充得到一个黑色的 RGB 画布。然后从测试图像中,复制灰度图层。然后将这两个颜色层添加到 RGB 画布上。再将这个像素值数组转换为图片。

1#Testmodel2output=model.predict([color_me,color_me_embed])3output=output*1284#Outputcolorizations5foriinrange(len(output)):6cur=np.zeros((256,256,3))7cur[:,:,0]=color_me[i][:,:,0]8cur[:,:,1:]=output[i]9imsave("result/img_"+str(i)+".png",lab2rgb(cur))

结果

在小型数据集上的结果,训练图像数 = 10,测试图像数 = 8;

▌测试数据:

▌经过50个轮数之后:

▌经过100个轮数之后:

▌经过1000个轮数之后:

▌经过2000个轮数之后:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4762

    浏览量

    100522
  • 图像
    +关注

    关注

    2

    文章

    1083

    浏览量

    40410
  • 深度学习
    +关注

    关注

    73

    文章

    5492

    浏览量

    120958

原文标题:用AI给黑白照片上色,复现记忆中的旧时光

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    前面板自动上色

    利用ini文件前面板自动上色
    发表于 01-07 22:54

    深度学习介绍

    在未来的某个时候,人们必定能够相对自如地运用人工智能,安全地驾车出行。这个时刻何时到来我无法预见;但我相信,彼时“智能”会显现出更“切实”的意义。与此同时,通过深度学习方法,人工智能的实际应用能够在
    发表于 11-11 07:55

    开源神经网络图片上色技术解析 解密深度学习自动上色

    如何利用深度神经网络给图片自动上色,本文介绍了开源神经网络图片上色技术,解析深度学习自动上色
    发表于 01-10 13:21 1.2w次阅读

    模型驱动深度学习的标准流程与学习方法解析

    模型驱动的深度学习方法近年来,深度学习在人工智能领域一系列困难问题上取得了突破性成功应用。
    的头像 发表于 01-24 11:30 4891次阅读
    模型驱动<b class='flag-5'>深度</b><b class='flag-5'>学习</b>的标准流程与<b class='flag-5'>学习方法</b>解析

    人类无法做到的事AI却轻易做到了

    他们给遭遇战火前的冲绳照片重新上色,还原已经逝去的美景。 利用 AI 技术可以完成一些人类无法做到的事情,比如给黑白照片重新
    的头像 发表于 03-29 16:25 3834次阅读

    深度解析机器学习三类学习方法

    在机器学习(Machine learning)领域。主要有三类不同的学习方法:监督学习(Supervised learning)、非监督学习(Unsupervised learning
    发表于 05-07 09:09 1.4w次阅读

    如何通过MEC构造基于深度学习自动驾驶汽车缓存

    本文通过使用部署在多接入边缘计算(MEC)结构上的深度学习方法自动驾驶汽车提出了基于深度
    的头像 发表于 10-10 09:26 4504次阅读

    Xilinx FPGA如何通过深度学习图像分类加速机器学习

    了解Xilinx FPGA如何通过深度学习图像分类示例来加速重要数据中心工作负载机器学习。该演示可通过Alexnet神经网络模型加速图像(从ImageNet获得)分类。它可
    的头像 发表于 11-28 06:54 3772次阅读

    AI上色对比人工调色 结果令人难以置信

    老照片力求还原真实色彩的目的不同,视频调色中的黑白上色,会融入更多调色师的主观意志和创意想法,除了保留真实感外,还要好看,具有观赏性,甚至为故事服务。
    的头像 发表于 04-29 14:18 6106次阅读

    你想修复你的老照片

    时代在进步,技术在发展,AI自动修复老照片APP软件的运用将会越来越智能。
    发表于 07-26 08:43 2702次阅读

    深度讨论集成学习方法,解决AI实践难题

    集成学习方法是一类先进的机器学习方法,这类方法训练多个学习器并将它们结合起来解决一个问题,在实践中获得了巨大成功,并成为机器学习领域的“常青
    发表于 08-16 11:40 760次阅读
    <b class='flag-5'>深度</b>讨论集成<b class='flag-5'>学习方法</b>,解决AI实践难题

    AI修复黑白老照片,再现历史风貌

    新冠肺炎疫情的这段期间人工智能技术的应用也帮助了人们更好的去进行疫情的防控工作。但是其实人工智能技术也能够帮助我们去复原那些在岁月当中留下的老照片
    发表于 09-02 16:24 2253次阅读

    汽车背后的故事 通过深度学习提高和发展车辆感知

    汽车背后的故事 通过深度学习提高和发展车辆感知
    发表于 11-01 08:24 2次下载
    汽车背后的故事 <b class='flag-5'>通过深度</b><b class='flag-5'>学习</b>提高和发展车辆感知

    使用深度学习方法对音乐流派进行分类

    电子发烧友网站提供《使用深度学习方法对音乐流派进行分类.zip》资料免费下载
    发表于 02-08 10:02 1次下载
    使用<b class='flag-5'>深度</b><b class='flag-5'>学习方法</b>对音乐流派进行分类

    深度学习中的无监督学习方法综述

    应用中往往难以实现。因此,无监督学习深度学习中扮演着越来越重要的角色。本文旨在综述深度学习中的无监督
    的头像 发表于 07-09 10:50 486次阅读