はじめに
最近、欅坂46にハマり推しメンが増えてきました.そこでDeeplearningを使い自分の推しメンを学習させ最強の推しメンの画像を生成しようと考えました.
開発環境
- macOS High Sierra 10.13.5
- python 3.6
データセットを作る
1. アイドルの画像を集める
Deeplearningのモデル学習させるためには大量のデータが必要です.そこでこちらのサイトを参考にしてアイドルの画像をネットから集めました.ターミナルでこちらを実行すれば画像をスクレイピングできます.
$ pip3 install bs4
$ python3 collect.py "ここに好きなアイドルの名前"
2. 集めた画像から顔を切り出す
今回はアイドルの顔画像を生成したいため集めた画像から顔だけを切り出します.こちらを参考にopencvを使い顔画像を切り出しました.ターミナルでこちらを実行すれば切り出しできます.
$ brew install opencv
$ python3 crop.py
このような感じで顔画像が切り出されます.顔画像ではないものも切り出されるため人力で削除しましょう.
3. 画像サイズを揃える
ネットワークに入力するには画像のサイズが同じではないといけません.そのため以下のコードで画像をリサイズします.
import os
import glob
from PIL import Image
files = glob.glob('リサイズしたい画像があるディレクトリ名/*.jpg')
a = 0
for f in files:
a = a+1
img = Image.open(f)
img_resize = img.resize((70, 70))
ftitle, fext = os.path.splitext(f)
img_resize.save('リサイズ後の画像を保存するディレクトリ名/' + str(a) + '_(70)' + fext)
DCGANとは
DCGANはGANのモデルの一つです.GANとはGenerator(生成器)とDiscriminator(識別器)の2つのネットワークで構成されています.Generatorは訓練データに似たデータを生成します.一方、Discriminatorは入力されたデータが Generatorによって生成されたデータか本物のデータかを識別します.
この関係は紙幣の偽造者と警察の関係によく例えられます。偽造者は本物の紙幣とできるだけ似ている偽造紙幣を造ります。警察は本物の紙幣と偽造紙幣を見分けようとします。
次第に警察の能力が上がり、本物の紙幣と偽造紙幣をうまく見分けられるようになったとします。すると偽造者は偽造紙幣を使えなくなってしまうため、更に本物に近い偽造紙幣を造るようになります。警察は本物と偽造紙幣を見分けられるようにさらに改善し…という風に繰り返していくと、最終的には偽造者は本物と区別が付かない偽造紙幣を製造できるようになるでしょう。
GANではこれと同じ仕組みで、generatorとdiscriminatorの学習が進んでいきます。最終的には、generatorは訓練データと同じようなデータを生成できるようになることが期待されます。このような状態では、訓練データと生成データを見分けることができなくなるため、discriminatorの正答率は50%になります。
以上のことはこちらのサイトに書いています.詳しいことが知りたい方はサイトを見てください.
KerasでDCGANのコードを書く
今回は簡単にDeeplearningのモデルが書けるKerasというフレームワークを使います.以下のコマンドで簡単にインストールできます.
$ pip3 install tensorflow
$ pip3 install keras
実装したコードはGitHubに載せています.
生成された画像
怖いです.それに同じ画像が多く出力されています.他の方の記事を見るともっと綺麗で可愛い女の子を出力できていました.おそらくチューニングがうまくできていない、訓練画像の枚数が足りていないなどの問題があると考えています.うまく出来たらまた更新します.
#追記 2018/7/25
こちらのソースコードを使い顔画像生成したところ綺麗な顔画像が生成されました.
同じデータセットを使ったため自分のコードでうまく生成できなかったのはデータせセットのせいではないみたいです.