Monthly Hacker's Blog

毎月のテーマに沿ったプログラミング記事を中心に書きます。

PokemonGAN

はじめに

こんにちは。修論で忙しいM2のさかぱ(@zacapa_23)です。今日はChainer Advent Calendar 2016 - Qiitaの17日目の記事としてGANをやります。

GANといえば去年のAdvent CalenderにDCGANを使ったイラスト生成の記事がありましたね。当時の僕はとても関心して、あのあともGAN系の手法を読んでいました。
qiita.com
qiita.com

ということで、今年は研究室の同期が実装したEBGANを使って新種のポケモンを探す冒険に出発しましょう。

f:id:ron_zacapa:20161211195758p:plain

データセット

以下の4つの方法でポケモン151匹の画像集め、96x96にリサイズしたデータセットを作成(7663枚)。参考としてランダムに100枚もってきました。
f:id:ron_zacapa:20161215134006p:plain

PokemonGOの相棒

PokemonGOの相棒ポケモンを表示する画面を角度を正面に対して水平方向に-45度~+45度に変え、ポケモンのアクション(タッチするとポケモンが動く)を使いながら30枚ずつスクリーンショットをして(これがだいぶ疲れた)、スクリーンショットのうち赤枠の部分を切り取った。現在138種類のポケモンを撮影済みなので4140(=138x30)枚用意しました。
f:id:ron_zacapa:20161211194032p:plain:w300f:id:ron_zacapa:20161211194252p:plain:w280

ポケモン図鑑

こちらのポケモン図鑑画像があるサイトから151枚を入手。

デコキャラシール

こちらのデコキャラシールカタログから671枚を入手。

ぼへみあ氏のデータセット

実は4ヶ月前に同じことに挑戦している方がいらっしゃって、データセット(2701枚)をいただきました。
bohemia.hatenablog.com

実験1: DCGAN

まずDCGANで試してみます。使ったコードはこちら。
github.com

学習は進んでいますが、はっきりとした画像になりません。
f:id:ron_zacapa:20161211194915p:plain

あれ、しばらくすると同じ画像ばっかり生成するようになってしまった...。
f:id:ron_zacapa:20161211195227p:plain

これはGANの課題の1つで、学習が十分に進むといくつかの画像しか生成しなくなります(Generatorの局所解や過学習みたいな感じです)。現在では様々な対象法が提案されていて、こちらの論文にまとめてあります。Improved Techniques for Training GANs(https://arxiv.org/pdf/1606.03498v1.pdf)

実験2: EBGAN

次に本題のEBGANで試します。こちらのコードをベースに作成しました。
github.com

以下pull-away termなしで行った結果です。dcganほど綺麗な画像ではないし、学習の初期段階から同じような画像ばかり生成しています。
f:id:ron_zacapa:20161216131423p:plainf:id:ron_zacapa:20161216131437p:plainf:id:ron_zacapa:20161216131451p:plainf:id:ron_zacapa:20161216131502p:plain

次にpull-away termあり。うーん、さっきよりも上手く行ってない...。
f:id:ron_zacapa:20161216162353p:plain

おわりに

最新手法を使えばもっとはっきりとしたポケモンを生成できると思って始めたのですが、かなり厳しかったですね。パラメータ等をいじくり回して、2週間ほど奮闘しましたがうーん。つい先日、TwitterでStackGANなるものがあると知りました、すごそうな感じ(まだしっかり読んでない)。これからもStackGANも含め、他の手法をつかって新種のポケモンを探し続けたいです。

ぼへみあ氏のデータセットを除いた画像データは差し上げますので、記事のコメント欄かTwitter:@zacapa_23に連絡してくださいな。

おまけ

とりあえず新種のポケモンはこちらのサイト(人工無能)で見つけてください。
ja.pokemon.alexonsager.net

ソースコード

修論が忙しくてきちんとリファクタリングしていないので後日。以下のtensorflow実装を参考にするとよいです。
github.com