1.はじめに
通常、GANでアニメキャラを生成するというと顔のみです。しかし、今回ご紹介するのは、なんとアニメキャラの上半身を生成するGANです。
2.手法
先週、AIアーティストAydaoさん(@AydaoAI)が作成したGANモデルを使った、This Anime Does Not Exist というHPが公開されました。このHPでは、GANを使って、この世界に存在しないアニメキャラクターを生成することが出来ます。

HPを開くと、この様に画面一杯にアニメキャラクターがスクロールする形で生成されます。そして、生成するときの創造性(Creativity)と画面のスクロール速度(Speed)をスライダーで設定出来ます。
GANをちょっとでも触ってみた人であれば、顔だけでなく上半身を画像生成することがどれほど大変なことか直ぐ分かると思います。Aydaoさんは、これを STyleGAN2を使い、膨大な学習データと転移学習・拡張によって実現しています。凄い!!!
Aydaoさんの作ったモデルの学習済みの重みは公開されていますので、今回はそれを元に Google Colab でAydaoワールドを覗いてみたいと思います。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 |
# github からコードをコピー !git clone https://github.com/cedro3/stylegan2.git |
1 2 3 |
# 学習済みの重みのダウンロード import gdown gdown.download('https://drive.google.com/u/1/uc?id=1_NUX9_xRGjce1KbCxT4frUsFWctlN4ZC', 'network-tadne.pkl', quiet=False) |
1 2 3 4 |
# TensorFlow_plugin セッティングと関数定義 %tensorflow_version 1.x %cd /content/stylegan2 from function import * |
最初に、seedで指定した2枚の画像をブレンドした画像を生成してみましょう。seed は整数であれば何でもかまいません。
blending = 0.5 はブレンドするときの src_seed の比率です。 truncation_psi = 0.8 は画像を生成するときに学習画像からどれだけ離すか(創造的か)の設定です。
1 2 3 4 5 6 7 8 9 |
# seedで指定した2枚の画像をブレンドした画像を生成する src_seed = 6677 dst_seed = 7561 blending = 0.5 truncation_psi = 0.8 generate_images([src_seed, dst_seed], truncation_psi) print("Blended image (", blending, ")") blend_images(src_seed, dst_seed, blending=blending, truncation_psi=truncation_psi) |

「清楚なお嬢さん」と「ワイルドなお姉さん」を50:50でブレンドすると、「ワイルドなお嬢さん」が出来上がります。
次に、seedで指定した2枚の画像をモーフィングする動画を生成してみます。duration_sec = 5.0 は モーフィング時間(sec)、mp4_fps = 20 は動画のフレームレートです。
1 2 3 4 5 6 7 8 9 |
# seedで指定した2枚の画像をモーフィングする動画を生成する src_seed = 5126 dst_seed = 5805 truncation_psi = 0.7 duration_sec = 5.0 mp4_fps = 20 generate_images([src_seed, dst_seed], truncation_psi) output_filename = interpolate_between_seeds(seed_array=[src_seed, dst_seed], truncation=truncation_psi, duration_sec=duration_sec, mp4_fps=mp4_fps) |

1 2 |
# 生成した動画を再生する display_mp4(output_filename) |
2枚の画像の完成度が高いだけでなく、その中間画像も連続的で綺麗なことが分かります。
最後に、創造性に関係する truncation_psi をもっと大きく(最大2.0)して、ランダムにグリッドでモーフィングする画像を生成してみましょう。ここで、random_seed は乱数の系列を表します。
grid_width = 2 はグリッドの横の大きさ、grid_height = 2はグリッドの高さの設定です。 (ちなみに、grid_width = 1, grid_height = 1 だと動画を1つだけ生成します)
1 2 3 4 5 6 7 8 |
# ランダムにグリッドでモーフィング画像を生成する random_seed = 822 duration_sec = 5 mp4_fps = 30 grid_width = 2 grid_height = 2 output_filename = make_video(grid_size=[grid_width,grid_height], duration_sec=duration_sec, mp4_fps=mp4_fps, random_seed=random_seed) |
1 2 |
# 生成した動画を再生する display_mp4(output_filename) |
モーフィングの途中でtruncation_psi を大きくしているので、より創造的な(変化の大きい)画像が生成されていることが分かります。また、学習データの中には、漫画のコマ割りの様なデータも含まれているようです。random_seed の数字を色々変えて楽しんでみて下さい。
それにしても、Aydao ワールド、魅力的過ぎます。もう現実に戻って来れないかも。。。。
では、また。
twitterへの投稿
コメントを残す