次の画像は、女優の波留をディズニー顔に変換したモノです。
ちょうど光の加減で目が緑色に変化して、本当にアニメのキャラクターみたいです。
Toonify Yourselfを使えば、このようにディズニー風に加工ができます。
本記事の内容
- Toonify yourselfとは?
- Toonify yourselfのシステム要件
- Toonify yourselfのインストール
- Toonify yourselfの動作確認
それでは、上記に沿って解説していきます。
Toonify yourselfとは?
Toonify yourselfは、顔をディズニー顔にするシステム(プログラム)のことです。
そのシステムでは、ディープラーニングと敵対的生成ネットワークの技術が用いられています。
ディープラーニングは、もうここで語るまでもありませんね。
深層学習というキーワードは、お馴染みになりました。
それに対して、敵対的生成ネットワークは、ディープラーニングほど普及していません。
敵対的生成ネットワークは、GANと呼ばれています。
Genera tive Adversarial Networksの略称です。
GANについて詳細を知りたい方は、Googleで検索してください。
素人の私が語るより、詳しく解説している記事は他にたくさんあります。
この記事では、Toonify yourselfの動かし方をメインで解説していきます。
Toonify yourselfが、GANの技術を用いているのは説明しました。
ただ、GANにもいろいろと種類があります。
そのGANの中でも、Toonify yourselfはStyleGAN2を採用しています。
以上が、Toonify yourselfの説明となります。
次は、Toonify yourselfのシステム要件を確認します。
Toonify yourselfのシステム要件
当記事では、WindowsでToonify yourselfを動かすことを前提にしています。
と言っても、Linuxでもそれほど変わりませんけどね。
Toonify yourselfを動かすための要件は、以下。
- StyleGAN2
- Scipy
- Dlib
- CMake
StyleGAN2が、ほぼすべてです。
StyleGAN2に関しては、インストールも含めて以下の記事で解説しています。
StyleGAN2が動かないと何も始まりません。
上記記事を参考に、StyleGAN2が動くようにしましょう。
あとは、pipコマンドでインストール可能です。
以下のコマンドでインストール可能です。
Scipyに関しては、次の記事で説明しています。
では、Toonify yourselfのインストールを行っていきましょう。
Toonify yourselfのインストール
Toonify yourselfのインストールと言っても、StyleGAN2が動く時点でほぼ完了しています。
それ以外は、pipコマンドでパッケージをインストールするぐらいです。
pip install scipy pip install cmake pip install dlib
もし、上記のコマンドを使うと、Numpyが最新のバージョンに置き換わります。
そのため、以下のコマンドでバージョンをもとに戻しておきます。
pip install numpy==1.16.5
StyleGAN2では、TensorFlow 1.14.0(GPU版)を利用しています。
そして、TensorFlow 1.14.0(GPU版)のインストールの際には、Numpy 1.16.5を指定しています。
だから、上がったNumpyを元のバージョンに戻しておきます。
Toonify yourselfの動作確認
StyleGAN2を設置したフォルダに移動します。
ここでは、「stykegan2」フォルダとします。
stykegan2フォルダに、次のフォルダを作成しましょう。
- aligned
- generated
- raw
次に、加工したい画像をrawフォルダに配置します。
今回は、現在(2021年時点1月)の首相の画像を使います。
※画像は、実際のものより小さくしています。
test.jpg
rawフォルダに画像を設置したら、次のコマンドを実行。
python align_images.py raw aligned
rawフォルダにある画像を以下のように加工します。
顔を認識して、正方形に切り抜いているようです。
test-01.png
加工された画像は、alignedフォルダに保存されます。
自動的にpngに変換されて、ファイル名も変わります。
次に、以下のコマンドを実行します。
python project_images.py --num-steps 500 aligned generated
このコマンドにより、潜在変数を探索します。
「–num-steps」を大きくすれば、その分だけ潜在変数の探索が行われます。
そして、その結果をgeneratedフォルダにtest-01.npyという名称で保存します。
潜在変数に関しては、簡単にいうと特徴です。
顔の特徴をデータに置き換えたモノだと考えれば、とりあえずはOKでしょう。
最後は、以下のプログラムを実行します。
import numpy as np from PIL import Image import dnnlib.tflib as tflib from pathlib import Path import pretrained_networks blended_url = "https://drive.google.com/uc?id=1H73TfV5gQ9ot7slSed_l-lim9X7pMRiU" _, _, Gs_blended = pretrained_networks.load_networks(blended_url) latent_dir = Path("generated") latents = latent_dir.glob("*.npy") for latent_file in latents: latent = np.load(latent_file) latent = np.expand_dims(latent,axis=0) synthesis_kwargs = dict(output_transform=dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=False), minibatch_size=8) images = Gs_blended.components.synthesis.run(latent, randomize_noise=False, **synthesis_kwargs) Image.fromarray(images.transpose((0,2,3,1))[0], 'RGB').save(latent_file.parent / (f"{latent_file.stem}-toon.jpg"))
実行すると、 generatedフォルダにtest_01-toon.jpgファイルが作成されます。
test_01-toon.jpg
以上が、Toonify yourselfの動作確認となります。
ちなみに、潜在変数を探索する回数「–num-steps」を1000にした結果は以下。
若干、変わりましたね。
でも、菅首相は驚くような変換ではありません。
じゃあ、波留で1000回探索した結果は?
冒頭の画像(500回)と比較すると、結構変わりました。
折角なので、1500回も探索してみましょう。
さらに変わりました。
それぞれ好みが別れるでしょうね。
個人的には、最初の500回探索したモノが好みです。