10/15(火)-10/19(土) 岐阜県(南濃温泉「水晶の湯」)で自動運転車の実証実験を行います☆彡

2-4. DCGANでお寿司をモーフィングする(ソースコードあり)

やること

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つの画像を構成する乱数をだんだんと近づけていますので、色や幅がだんだん変化することが理想です。よくある失敗例として、「マグロ→マグロとサバが重なった画像→サバ」のように、単に画像が切り替わっている場合があり、「なんちゃってモーフィング」と呼ばれることがあります。

関連記事もご参照ください

タイトルとURLをコピーしました