1.はじめに
今まで、少数の学習データで顔画像のスタイル変換を行う場合、モデルに目の形や線の太さなどの詳細を学習させることは困難でした。JoJoGANは、この問題点を改善したモデルです。
*この論文は、2021.12に提出されました。
2.JoJoGANとは?
スタイル変換モデルの学習には、大量のペアトレーニングデータセットを使うことが最適ですが、それには多大なコストが必要です。JoJoGANのポイントは、下記の様に1枚のスタイル参照画像から近似ペアトレーニングデータセットを生成して学習に利用することです。
まず、スタイル参照画像yをGAN反転し潜在変数wを取得します。但し、ここで使用するGAN反転器(e4eを使用)は実写でトレーニングされているため、潜在変数wで生成される画像はxは、yを近似したものであることに注意して下さい。
次に、この潜在変数wにランダム・スタイル・ミキシング(特定レイヤの潜在変数に乱数をミックスする)を行うことで、様々なペアトレーニングセットXを生成することが出来ます。そして、Xには同じカラープロファイルcが含まれています。

それでは、早速コードを動かしてみましょう。
3.コード(学習済みモデル)
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。なお、今回コードは非表示にしてありますので、見たい場合は「コードの表示」をクリックして下さい。
まず、セットアップを行います。

次に、スタイル変換をかけるためのサンプル画像を表示します。自分で用意した画像を使う場合は、その画像を事前にpicフォルダにアップロードしておいて下さい。


次に、サンプル画像をalign(所定の位置で顔画像を切り出す)し、潜在変数を取得します。


それでは、学習済みモデルでスタイル変換を行ってみましょう。pretrained で学習済みモデルの選択(8種類)、preserve_color で変換前後の色を保持するかの選択を行います。ここでは、pretrained は jojo、preserve_color はチェックで実行します。変換結果は results フォルダに保存されます。


せっかくですので、出力画像を見やす形に編集して、動画にしてみましょう。作成した動画は output.mp4 で保存されます。


サンプル画像のベースは残しつつ、承太郎の特徴が上手く適用されています。
4.コード(ワンショット学習)
今度は、ワンショット学習をやってみましょう。まず、スタイル画像のサンプルを表示します。自分の用した画像を使いたい場合は、その画像を事前にstyle_imagesフォルダにアップロードしておいて下さい。


次に、スタイル画像をalign(所定の位置で顔画像を切り出す)し、潜在変数を取得します。names にリスト形式で画像を選択します。1枚だけ選択しても良いですし、同様なスタイルを複数枚選択してもOKです。ここでは、001.jpgを1枚だけ選択し、ポルナレフGANを作ってみましょう!


次に、このデータを元にStyleGANをファインチューニングします。alpha で変換度合、preserve_color で変換前後の色保持の有無、num_iter で学習回数を設定します。ここでは、alphaは1.0、preserve_colorはチェック、num_iterは200で実行します。学習したパラメータは、model.pthで保存されます。

それでは、学習したパラメータ model.pthを読み込んで、サンプル画像をスタイル変換してみましょう。変換結果は results フォルダに保存されます。


せっかくですので、出力画像を見やす形に編集して、動画にしてみましょう。作成した動画は output.mp4 で保存されます。


たった1枚の画像からポルナレフGANが出来ました!
では、また。
(オリジナルgithub)https://github.com/mchong6/JoJoGAN
(twitter投稿)
今回もcolabデモをありがとうございます!
自分でも本記事のポルナレフGANのように独自の画像を用いてファインチューニングしてみましたが、パラメータ?(alpha係数、preserve_colorのon/off、num_iter)を色々かえても生成されたモデルのファイルサイズはいずれも129,614KBでした。
私が出会ってきた機械学習のプログラムでは、iterationはもちろん、設定をいじる度にできあがったモデルのファイルサイズは異なっていました。
なぜJoJoGANでは、保存されたモデルがすべて同じファイルサイズ(≒同じファイル)なのに、それぞれが特異な画像を生成することができるのでしょうか。
(転移学習におけるファインチューニングが、そもそも1KBの違いすら生まない手法なのでしょうか。)
今回のファインチューニングにより生成されたモデル(model.pth)と、jojo_preserve_color.ptやjojo_yasuho_preserve_color.ptでは拡張子が違うことも、何か区別があるのではないかと気になっています。
本記事の2番目のセクションを読んでも仕組みが理解できないあまり、ここで質問しますことをお許しください。
出川さん
今回のファインチューニングは、毎回同じモデルに新たなスタイル画像を追加学習しているだけなので、パラメータ数は変化せずどれも同じファイルサイズになります。
ありがとうございます。
メタラーニングするだけなら、ファイルサイズは変わらないんですね。
現状、ジョジョ立ちしている画像をpicフォルダに入れてもalignフォルダに入るのは顔だけなので、talking headsの領域を超えて全身画像が生成できる未来を楽しみに待つことにします。
初めまして。
記事を拝見し,実際にColabで動かそうとしたところセットアップで以下のようなエラーが発生します。
FileNotFoundError: [Errno 2] No such file or directory: ‘models/stylegan2-ffhq-config-f.pt’
対処法をご教示いただけないでしょうか。
よろしくお願いいたします。
ゆうきさん
エラーが復旧しましたので、お試しください。
原因:https://qiita.com/jun40vn/items/0f9bd5353197d3f14f3e
返信が遅くなりすみません.
ありがとうございます.
無事に動作確認できました!
ゆうきさん
このエラーは、stylegan2-ffhq-config-f.pt のダウンロードに失敗したために発生しています。
その原因は、google driveに保存されているファイルの共有リンクからのダウンロードが2/17からgoogle によって制限されいているからだと思われます。
しばらくすれば復旧すると思いますが、それまではエラーメッセージに表示されているURLからブラウザでファイル(stylegan2-ffhq-config-f.pt, e4e_ffhq_encode.p)をダウンロードして、適切なフォルダに保存して使用して下さい。