keras学习笔记-黑白照片自动着色的神经网络-Beta版

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

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

特征提取器

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

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

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

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

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

你仍然只有3×3个滤波器来扫描每个图像。但是,通过将新的9个像素与较低级别的滤波器相结合,可以检测更复杂的图案。一个像素组合可能形成一个半圆,一个小点或一条线。再一次地,你从图像中反复提取相同的图案。这次,你会生成128个新的过滤图像。

经过几个步骤,生成的过滤图像可能看起来像这样:

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

from keras.layers import Conv2D, Conv2DTranspose, UpSampling2D
from keras.layers import Activation, Dense, Dropout, Flatten, InputLayer
from keras.layers.normalization import BatchNormalization
from keras.callbacks import TensorBoard
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from skimage.color import rgb2lab, lab2rgb, rgb2gray
from skimage.io import imsave
import numpy as np
import osimport random
import tensorflow as tf
Using TensorFlow backend.
# Get imagesX = []
for filename in os.listdir('data/color/Train/'):
    X.append(img_to_array(load_img('data/color/Train/'+filename))) X = np.array(X, dtype=float)
# Set up train and test data
split = int(0.95*len(X)) Xtrain = X[:split] Xtrain = 1.0/255*Xtrainmodel = Sequential()
model.add(InputLayer(input_shape=(256, 256, 1))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(Conv2D(2, (3, 3), activation='tanh', padding='same')) model.add(UpSampling2D((2, 2))) model.compile(optimizer='rmsprop', loss='mse')
# Image transformerdatagen = ImageDataGenerator(         shear_range=0.2,         zoom_range=0.2,         rotation_range=20,         horizontal_flip=True)
# Generate training databatch_size = 10def image_a_b_gen(batch_size):     for batch in datagen.flow(Xtrain, batch_size=batch_size):         lab_batch = rgb2lab(batch)         X_batch = lab_batch[:,:,:,0]         Y_batch = lab_batch[:,:,:,1:] / 128         yield (X_batch.reshape(X_batch.shape+(1,)), Y_batch)
# Train model      
tensorboard = TensorBoard(log_dir="data/color/output/first_run") model.fit_generator(image_a_b_gen(batch_size), callbacks=[tensorboard], epochs=1, steps_per_epoch=10)
Epoch 1/1 10/10 [==============================] - 178s - loss: 0.5208      <keras.callbacks.History at 0x1092b5ac8>
# Save modelmodel_json = model.to_json()with open("model.json", "w") as json_file:     json_file.write(model_json) model.save_weights("model.h5")
# Test imagesXtest = rgb2lab(1.0/255*X[split:])[:,:,:,0]
Xtest = Xtest.reshape(Xtest.shape+(1,)) Ytest = rgb2lab(1.0/255*X[split:])[:,:,:,1:] Ytest = Ytest / 128
print(model.evaluate(Xtest, Ytest, batch_size=batch_size))
1/1 [==============================] - 0s 0.00189386657439
color_me = []for filename in os.listdir('data/color/Test/'):     color_me.append(img_to_array(load_img('data/color/Test/'+filename))) color_me = np.array(color_me, dtype=float) color_me = rgb2lab(1.0/255*color_me)[:,:,:,0] color_me = color_me.reshape(color_me.shape+(1,))# Test modeloutput = model.predict(color_me) output = output * 128# Output colorizationsfor i in range(len(output)):     cur = np.zeros((256, 256, 3))     cur[:,:,0] = color_me[i][:,:,0]     cur[:,:,1:] = output[i]     imsave("data/color/output/img1_"+str(i)+".png", lab2rgb(cur))
/usr/local/lib/python3.6/site-packages/skimage/util/dtype.py:122: UserWarning: Possible precision loss when converting from float64 to uint8   .format(dtypeobj_in, dtypeobj_out))

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

对比学习用 Keras 搭建 CNN RNN 等常用神经网络

参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习。 Keras 是一个兼容 Theano 和 Tens...

59880
来自专栏素质云笔记

keras系列︱图像多分类训练与利用bottleneck features进行微调(三)

不得不说,这深度学习框架更新太快了尤其到了Keras2.0版本,快到Keras中文版好多都是错的,快到官方文档也有旧的没更新,前路坑太多。 到发文为...

1.7K80
来自专栏大数据挖掘DT机器学习

用深度学习keras的cnn做图像识别分类,准确率达97%

Keras是一个简约,高度模块化的神经网络库。 可以很容易和快速实现原型(通过总模块化,极简主义,和可扩展性) 同时支持卷积网络(vision)和复发性的网络...

55560
来自专栏ATYUN订阅号

怎样在Python的深度学习库Keras中使用度量

Keras库提供了一种在训练深度学习模型时计算并报告一套标准度量的方法。 除了提供分类和回归问题的标准度量外,Keras还允许在训练深度学习模型时,定义和报告你...

48080
来自专栏AI科技大本营的专栏

一文解决图片数据集太少的问题:详解KerasImageDataAugmentation各参数

作者 | Professor ho 本文转自Professor ho的知乎专栏 图像深度学习任务中,面对小数据集,我们往往需要利用Image Data Aug...

44560
来自专栏AI科技大本营的专栏

用AI给黑白照片上色,复现记忆中的旧时光

【导读】我们知道,深度学习几乎已经应用在每一个领域,但如果我们能够构建一个基于深度学习的模型,让它能够给老照片着色,重现我们童年的旧回忆,这该多么令人激动啊!那...

58830
来自专栏Bingo的深度学习杂货店

球面均匀取点

写一个程序,在单位球面上随机取点,保证随机取到的点是均匀的。 解题思路: 这个题乍一看不知如何下手,但是看到题目中的单位球面,似乎有点思路。 我们知道,单位化是...

66950
来自专栏AI研习社

图片数据集太少?Keras Image Data Augmentation 各参数详解

图像深度学习任务中,面对小数据集,我们往往需要利用Image Data Augmentation图像增广技术来扩充我们的数据集,而keras的内置ImageDa...

77940
来自专栏AI深度学习求索

如何计算显存的占用,常常遇到out of memory?

最近一次组会上,师兄点评一篇文章显存占用过多,突然发现还不知道如何具体的计算显存,只好去学习一下。

87810
来自专栏JasonhavenDai

自然语言处理构建文本向量空间1.百科2.源代码3.参考:

1.百科 TF-IDF 2.源代码 系统环境 python 3.6 scikit-learn==0.19.1 # utf-8 import os im...

31760

扫码关注云+社区

领取腾讯云代金券