読者です 読者をやめる 読者になる 読者になる

自己符号化器でイラストが再現できるかな

参考文献
  1. Building Autoencoders in Keras の Convolutional autoencoder のモデル
  2. かわいいフリー素材集 いらすとや
手順
  • いらすとや(参考文献2)のカレー、ハンバーガー、ラーメンの画像を保存します。
  • 画像を読み込んで 64×64 にリサイズします。
  • 以下の自己符号器を学習します(参考文献1)。次元は少し異なります。エンコード後の shape は (8, 8, 8) です。

f:id:cookie-box:20170507222625p:plain:w720

結果

上段が元画像(リサイズで解像度が落ちています)、下段がエンコード→デコード後の画像です。
エンコード→デコード後はぼやけていますがカレー、ハンバーガー、ラーメンが再現できていると思います。

f:id:cookie-box:20170508220651p:plain:w480

2017-05-09 追記
学習した自己符号器でいらすとやの別のいらすとが再現できるかもテストしてみます。
いらすとやの別のハンバーガー、ラーメンをテストします(右側の2枚)。
→ 訓練用の3枚の再現に特化しすぎていて全然駄目でした。
f:id:cookie-box:20170509061643p:plain:w800

スクリプト
# -*- 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()