参考文献
- Building Autoencoders in Keras の Convolutional autoencoder のモデル
- かわいいフリー素材集 いらすとや
手順
- いらすとや(参考文献2)のカレー、ハンバーガー、ラーメンの画像を保存します。
- 画像を読み込んで 64×64 にリサイズします。
- 以下の自己符号器を学習します(参考文献1)。次元は少し異なります。エンコード後の shape は (8, 8, 8) です。
結果
上段が元画像(リサイズで解像度が落ちています)、下段がエンコード→デコード後の画像です。
エンコード→デコード後はぼやけていますがカレー、ハンバーガー、ラーメンが再現できていると思います。
2017-05-09 追記
学習した自己符号器でいらすとやの別のいらすとが再現できるかもテストしてみます。
いらすとやの別のハンバーガー、ラーメンをテストします(右側の2枚)。
→ 訓練用の3枚の再現に特化しすぎていて全然駄目でした。
スクリプト
# -*- coding: utf-8 -*- import numpy import cv2 import matplotlib.pyplot as plt import sys from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D from keras.models import Model if __name__ == "__main__": #============================================================ # 画像を読み込みます image_files = ['/Users/cookie/Downloads/food_curryruce.png', '/Users/cookie/Downloads/food_hamburger.png', '/Users/cookie/Downloads/food_ramen_iekei.png'] n_image = len(image_files) images = [] size = (64, 64) for image_file in image_files: image = cv2.imread(image_file) image = cv2.resize(image, size) # plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) # plt.show() image = image.astype('float32') / 255. images.append(image) images = numpy.array(images) #============================================================ # 自己符号化器を構築します input_img = Input(shape=(64, 64, 3)) x = Conv2D(16, 3, 3, activation='relu', border_mode='same')(input_img) x = MaxPooling2D((2, 2), border_mode='same')(x) x = Conv2D(8, 3, 3, activation='relu', border_mode='same')(x) x = MaxPooling2D((2, 2), border_mode='same')(x) x = Conv2D(8, 3, 3, activation='relu', border_mode='same')(x) encoded = MaxPooling2D((2, 2), border_mode='same')(x) x = Conv2D(8, 3, 3, activation='relu', border_mode='same')(encoded) x = UpSampling2D((2, 2))(x) x = Conv2D(8, 3, 3, activation='relu', border_mode='same')(x) x = UpSampling2D((2, 2))(x) x = Conv2D(16, 3, 3, activation='relu', border_mode='same')(x) x = UpSampling2D((2, 2))(x) decoded = Conv2D(3, 3, 3, activation='sigmoid', border_mode='same')(x) autoencoder = Model(input_img, decoded) print(autoencoder.summary()) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') autoencoder.fit(images, images, nb_epoch=10000, batch_size=3) #============================================================ # 結果を表示します decoded_images = autoencoder.predict(images) for i in range(n_image): # 元画像の表示 ax = plt.subplot(2, n_image, i+1) plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB)) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # エンコード→デコードした画像の表示 ax = plt.subplot(2, n_image, i+1+n_image) plt.imshow(cv2.cvtColor(decoded_images[i], cv2.COLOR_BGR2RGB)) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show()