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 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

从聚合-转移框架浅谈卷积神经网络的架构设计

本次Paper Reading我们并没有关注某些特定的paper,而是用一个视角对现有的代表性的卷积神经网络设计进行总结。

1022
来自专栏新智元

猫狗大战识别准确率直冲 Kaggle Top 2%,手把手教你在 Keras 搭建深度 CNN

猫狗大战 数据集来自 kaggle 上的一个竞赛:Dogs vs. Cats,训练集有25000张,猫狗各占一半。测试集12500张,没有标定是猫还是狗。 ?...

5687
来自专栏素质云笔记

NLP+2vec︱认识多种多样的2vec向量化模型

1、word2vec 耳熟能详的NLP向量化模型。 Paper: https://papers.nips.cc/paper/5021-distributed...

3677
来自专栏天天P图攻城狮

移动端将胶片底片转为数码照片的尝试

胶片底片需要通过暗室显影才能呈现出色彩,该过程就是传统所说的相片冲洗工艺。本文利用移动端图像处理工具,尝试在手机上实现彩色负片(常用的135mm胶片种类)的数码...

951
来自专栏Petrichor的专栏

深度学习: 从 RoIPooling 到 RoIAlign

对RoI进行pooling的操作最早由SPPNet中的SPP layer提出:

1082
来自专栏云时之间

机器学习算法推导「代码已经更新」

在重新实现机器学习算法时,重新认识到理论和数学的可理解性,通过非常简单的编程就可以实现BP、Lagrange multiplier、Newton's metho...

3307
来自专栏吉浦迅科技

深度学习GeForce GTX 1080/Titan X(Maxwell)/ Titan X (Pascal)比较

【新智元导读】深度学习计算该买哪款GPU,选择哪个平台?这篇文章为你提供对比指南。 购买用于运行深度学习算法的硬件时,我们常常找不到任何有用的基准,唯一的选择是...

6835
来自专栏目标检测和深度学习

手把手教你搭建目标检测器-附代码

962
来自专栏机器之心

资源 | 对比ResNet: 超深层网络DiracNet的PyTorch实现

3054
来自专栏GAN&CV

手把手教你创建自己的object detector

本文译自:http://www.hackevolve.com/create-your-own-object-detector/

851

扫码关注云+社区