やること
DCGANでお寿司のモーフィング(画像がだんだん変化するアレ)を行います。
使うもの
Google Colaboratoryが利用可能です。
Google Colab
WinPython3.6をおすすめしています。
WinPython - Browse /WinPython_3.6/3.6.7.0 at SourceForge.net
Portable Scientific Python 2/3 32/64bit Distribution for Windows
こちらの勉強会を参考にしています。
AIワークショップ|初心者だけどDCGANできちゃった (2019/01/18 18:00〜)
# 【注意】偽札を作るワークショプではありません【喚起】 警察関係者の立ち入りを禁止します() ## オンラインコミュニティ 情報交換・質問・クレームなどはAI FASHIONのSlack(自由参加)でお願いします。 ## 概要 GANが難しすぎる、というあなた。残念ながらマジで難しいです。技術・予算・時間ど...
AI勉強会|GANやVAEが書けるようになりたい (2019/10/11 19:30〜)
## 久しぶりに本郷で開催します こちらがライブ配信のアーカイブ動画です。 ## 参加方法 抽選や承認はありませんので、好き勝手にお越しください。 ## オンラインコミュニティ 情報交換・質問・クレームなどはAI FASHIONのSlack(自由参加)でお願いします。 ビネクラの公式Twitterもよろし...
ソースコード
学習で保存されたジェネレータの重みを指定してください(generator_1200.h5)。実行すると、「DCGAN_morph」フォルダに画像が保存されていき、さらにmorph.gifも保存される親切設計です。
import os
import numpy as np
import numpy.random as nr
from PIL import Image
import matplotlib.pyplot as plt
from keras.models import load_model
#パラメータ
#======================================
#使用する重み
para = 'DCGAN_para/generator_1200.h5'
#乱数列の次元
z_dim = 100
#補完数(58だと60枚出ます)
img_num = 58
#モーフィングを保存するフォルダ
img_f = 'DCGAN_morph/'
#======================================
#乱数列1
a = np.clip(nr.randn(z_dim), -1, 1)
print(a)
#乱数列2
b = np.clip(nr.randn(z_dim), -1, 1)
print(b)
#間の補完
#======================================
zs = np.zeros((img_num+2, z_dim))
for i in range(img_num+2):
zs[i] = a * ((img_num+1-i)/(img_num+1)) + b * (i/(img_num+1))
#======================================
#generatorで画像を生成
#======================================
model = load_model(para)
imgs_array = model.predict(zs)
imgs = []
for i in range(len(imgs_array)):
img = Image.fromarray(np.uint8(imgs_array[i] * 127.5 + 127.5))
imgs.append(img)
#======================================
#保存用フォルダ作成
if not os.path.isdir(img_f):
os.makedirs(img_f)
#保存
#======================================
for i in range(len(imgs)):
print(i)
#画像の表示と保存
imgs[i].save(img_f + str(i) + '.png')
plt.imshow(imgs[i], vmin = 0, vmax = 255)
plt.show()
#gif保存
imgs[0].save('morph.gif', save_all=True, append_images=imgs[1:], optimize=False, duration=1, loop=0)
#======================================
結果
ランダムに生成された2枚の画像と、その中間の画像(枚数指定可)が保存されます。ネタの色や幅がだんだん変化するのが理想のモーフィングですが、ごくシンプルな実装ですからそこまでは望みません。
豪華4寿司ループも作ってみました。
余談
モーフィングでは2つの画像を構成する乱数をだんだんと近づけていますので、色や幅がだんだん変化することが理想です。よくある失敗例として、「マグロ→マグロとサバが重なった画像→サバ」のように、単に画像が切り替わっている場合があり、「なんちゃってモーフィング」と呼ばれることがあります。