StyleGANを使った画像編集をe4eで高速化する

1.はじめに

 以前、StyleGANを使った画像編集[1][2]についてご紹介しましたが、このとき時間が掛かるのが「潜在変数の推定」プロセスでした。今回は、このプロセスを高速に実行できる e4e(encoder4editing)という技術をご紹介します。

*この論文は、2021年2月に提出されました。

2.e4eとは?

 潜在変数を推定するアプローチには2つの方法があります。1つはある潜在変数をStyleGANに入力して得た画像と目的の画像の誤差を最小化するようなループを廻して潜在変数を推定する方法、もう1つは画像を入力すると目的の潜在変数を直接出力する専用エンコーダを作る方法です。

 ループを廻して潜在変数を推定する方法は、画像毎に行うため比較的精度は高いですが時間が掛かります。一方、今回ご紹介する、専用エンコーダを使う方法 e4e は、精度は若干落ちますが推定速度が圧倒的に早いのが特徴です。

 以下に、e4eの学習時のフローを示します。

 Encoderに画像を入力すると、1つの潜在変数 w とN個のオフセットが出力され、これらを合成してN個の潜在変数(FFHQの場合はN=18)とし、Pretrained StyleGAN に入力します。

 このとき、元画像と出力画像の誤差を表すロスに加えて、オフセットの分散(バラツキ)を表すロスを設定し、これら2つのロスの合計を最小化するように、Encoder のパラメータを学習します。オフセットの分散を減らすのは、推定した潜在変数の歪みを減らし画像の編集性を向上させるためです。

 それでは、実際にコードを動かしてみましょう。

3.セットアップ

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 まず、セットアップを行います。

4.事前準備

 ./images にある、事前に用意したサンプル画像は、以下の5枚です。ご自分が用意した顔画像があれば、このフォルダに追加(PC画面からドラッグ&ドロップでOKです)して下さい。


 StyleGANが学習した顔画像は、顔のランドマーク(目・鼻・口など)が所定の位置に合わせてあるものが使われています。そのため、潜在変数を推定する場合も、それと同じようになるようにサンプル画像から顔を切り出します。顔を切り出した画像は、./images と同じファイル名で ./align に保存されます。

 

 次に、切り出した顔画像から潜在変数を推定します。エンコーダ方式なので、あっと言う間に完了します(顔の切り出しスピードより遥かに早いです)。推定した潜在変数は、./align と同じファイル名(拡張子はjpg → pt)で ./vec に保存されます。潜在変数から生成した画像は、./align と同じファイル名で ./vec_pic に保存されます。

 

 それでは、「切り出した顔画像」「潜在変数から生成した顔画像」を並べて表示し、そのクオリティを比較してみましょう。

 上段が切り出した顔画像、下段が潜在変数から生成した画像です。完全に同じという訳には行きませんが、切り出した顔画像とほぼ同じ画像を生成できる潜在変数が素早く推定できたことが分かります。これで、編集できる潜在変数が手に入りました。

5.編集

  編集のために用意した潜在変数は、./editings/interfacegan_directions にあり以下の4つです。

  • age.pt : 年齢による顔の変化
  • pose.pt : 顔の水平方向の回転
  • smile.pt : 笑顔にする
  • age+pose.pt : 年齢による顔の変化+顔の水平方向の回転

 

 03.jpg を以下の設定で編集します。latent は対応する潜在変数 03.ptdirection は年齢による顔の変化の潜在変数 agemin は-50、max は50です。これは、潜在変数 03.pt に 潜在変数 age の-5 〜 5 倍(設定は内部で1/10されます)したものを加算して、StyleGANに入力し画像を生成するという設定です。

 潜在変数 age に掛ける数字を少しづつ変化させながら、StyleGANが出力する静止画を保存します。まず 0からmin まで変化させ、次に minからmax まで変化させ、最後に maxから0 まで変化させます。静止画は、000001.jpg という形の6桁の連番名で ./pic に保存します。

 

 ./pic に保存された静止画からmp4動画を作成します。作成された動画は、output.mp4 で保存すると共に、./movieage_03.mp4 という形で保存します。

 

 作成した、output.mp4 を再生します。

 子供の顔からおばあちゃんの顔まで連続的に変化する動画が出来ました。

 後は、「編集」以降を繰り返せばOKです。違う設定でやってみましょう。今度は、潜在変数 01.pt に 潜在変数 pose を使って編集してみましょう。

 

 今度は、潜在変数 02.pt に潜在変数 smile を使って編集してみましょう。smile の場合は、少し弱目にした方が良いので、min 0max 30 にしています。

 

 最後に、潜在変数 05.pt に 潜在変数 age+pose で編集してみましょう。これは年齢の変化と顔の回転が同時に編集できます。

 では、また。

(Twitterへの投稿)

4 件のコメント

    • 田中さん

      コメントありがとうございます。
      これは失礼しました。学習済みパラメータのダウンロードが上手くいっていなかったのが原因でした。リンク先を変更しましたので、もうOKです。
      お楽しみ下さい。

  • 釈迦に説法だと思うので恐縮ですが, 潜在変数空間上の属性ベクトル同士が必ずしも直交せず, ageを変化させるとglassも変化してしまうみたいな現象はInterFaceGANという論文で議論されています.変化させたくない属性ベクトルに対して並行に変化させることである程度抑制できるみたいです.

    https://arxiv.org/pdf/2005.09635.pdf <- Fig.2を参照

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。