keras學習筆記-黑白照片自動著色的神經(jīng)網(wǎng)絡-Beta版
Alpha版本不能很好地給未經(jīng)訓練的圖像著色。接下來,我們將在Beta版本中做到這一點——將上面的將神經(jīng)網(wǎng)絡泛化。
以下是使用Beta版本對測試圖像著色的結(jié)果。

特征提取器
我們的神經(jīng)網(wǎng)絡要做的是發(fā)現(xiàn)將灰度圖像與其彩色版本相鏈接的特征。
試想,你必須給黑白圖像上色,但一次只能看到9個像素。你可以從左上角到右下角掃描每個圖像,并嘗試預測每個像素應該是什么顏色。

例如,這9個像素就是上面那張女性人臉照片上鼻孔的邊緣。要很好的著色幾乎是不可能的,所以你必須把它分解成好幾個步驟。

首先,尋找簡單的模式:對角線,所有黑色像素等。在每個濾波器的掃描方塊中尋找相同的精確的模式,并刪除不匹配的像素。這樣,就可以從64個迷你濾波器生成64個新圖像。
如果再次掃描圖像,你會看到已經(jīng)檢測到的相同的模式。要獲得對圖像更高級別的理解,你可以將圖像尺寸減小一半。

你仍然只有3×3個濾波器來掃描每個圖像。但是,通過將新的9個像素與較低級別的濾波器相結(jié)合,可以檢測更復雜的圖案。一個像素組合可能形成一個半圓,一個小點或一條線。再一次地,你從圖像中反復提取相同的圖案。這次,你會生成128個新的過濾圖像。
經(jīng)過幾個步驟,生成的過濾圖像可能看起來像這樣:

這個過程就像大多數(shù)處理視覺的神經(jīng)網(wǎng)絡,也即卷積神經(jīng)網(wǎng)絡的行為。結(jié)合幾個過濾圖像了解圖像中的上下文。
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 os
import random
import tensorflow as tf
Using TensorFlow backend.
# Get images
X = []
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*Xtrain
model = 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 transformer
datagen = ImageDataGenerator(
shear_range=0.2,
zoom_range=0.2,
rotation_range=20,
horizontal_flip=True)
# Generate training data
batch_size = 10
def 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 model
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
model.save_weights("model.h5")
# Test images
Xtest = 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 model
output = model.predict(color_me)
output = output * 128
# Output colorizations
for 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))
本篇文章內(nèi)容來自:翻譯文章 原文
本人代碼用jupyter notebook全部通過,需要代碼和資料歡迎索要。