cedro-blog

StyleGANの学習済みモデルでサクッと遊んでみる

今回は、Google Colab を使って話題のStyleGANの学習済みモデルで、サクッと遊んでみたいと思います。

こんにちはcerdoです。
皆さん、StyleGANをご存じですか。最近、「写真が証拠になる時代は終わった」などと騒がれているあれです。

早速、学習済みモデルをちょっといじってみたわけですが、ランダムベクトルから生成される画像の完成度が半端なく、しかも解像度は1024×1024という高解像度で、ぱっと見るとリアルかフェイクか本当に分かりません。

さらに驚いたのは、2つのランダムベクトルの補完画像を細かく分割して見ても、実に自然な変化をするんです。

ということで、今回は、Google Colabを使って話題のStyleGANの学習済みモデルで、サクッと遊んでみたいと思います。

   

StyleGANとは?

これは、(a)今までのGAN(ProgressiveGAN) と(b) StyleGANのネットワーク構造を比較した図です。StyleGANは今までとは構造をがらりと変えて、Mapping network Synthesis network の2つで構成されています。

Mapping network は8層の全結合層から成り、潜在変数を潜在空間にマッピングします。

Synthesis networkは18層から成り、入力は4×4×512の定数で、そこへ「スタイル」(潜在変数にアフィン変換を掛けAdaIN処理を行ったもの)と
「ノイズ」が各層に入力されます。

「スタイル」が主に画像生成をコントロールし、「ノイズ」は画像の見た目に大きな影響を与えない特徴(髪質や髪の流れ、ヒゲ、そばかす、肌質など)をコントロールします。Synthesis networkの解像度は4×4から順次アップサンプリングし、最終的には1024×1024になります。

ちなみに、StyleGANの学習は、とてつもなくヘビーです。データセットは1024×1024の画像70,000枚を使って行うのですが、V100というかなりハイグレードのGPUを8台並列で使っても6日と14時間掛かるらしく、もし私のGTX1060でやるとすれば4~5ヶ月掛かるレベルです(GPUのメモリの制約から実際にはやれませんが)。

  

コードを動かす準備をします

今回は、Githubにある Nvlabs/stylegan のサンプルコードを使います。この後 Google Colab からGit Clone しますので、とりあえず、眺めてみるだけでOKです。

  

Google Colab に接続します。ファイル/python3 の新しいノートブックを開いたら、ランタイム/ランタイムのタイプを変更GPUを選択して保存します。

今回、学習済みモデルを動かすだけですが、StyleGANは学習済みモデルを動かすのでさえ、GPUが必須です。上記コマンドをコピペして実行します。

  

実行するとこんな表示が出ます。リンクをクリックし、アカウントを選択したら、authorization code が表示されるので、これを四角内にコピぺすれば、Googole Driveがマウントされます。  

   

Google Drive/My Drive にサンプルコードを git clone し、ディレクトリをstylegan に移すコマンドです。 1行づつコピペして実行します。

     

A画像からB画像へトランジションさせる

2つのベクトルと、その間を線形補間したベクトルを使って、A画像からB画像へのトランジションをやってみます。

seed の番号を指定してランダムベクトルを生成すると、毎回同じ順番で同じベクトルが生成されます。こうすると再現性があるので、seed の番号を指定してランダムベクトルを生成することにします。

   

seed = 10 の7番目のベクトル(latents6)の画像から1番目のベクトル(latents0)の画像へトランジションさせるコードです。

補間ベクトルは、latents0 と latents6 の差を39分割して作成しています。全部で40枚の画像(png)が生成され、results フォルダーに保存されます。このコードをコピペして実行します。

   

latents6 ベクトルの画像(photo0000.png)です。どうですか、不自然さは全くなく、しかも1024×1024という高解像度。正にリアル!

  

latents0 ベクトルの生成画像(photo0039.png)です。こういうレベルのフェイク画像が生成されるようになると、確かに写真は証拠にならないですよね。

   

results フォルダー内にある40枚の画像(png)を gif 動画に変換するコードです。gif動画はstyleganフォルダーの直下に、stylegan.gif という名前で保存されます。このコードをコピペして実行します。

  

latents6 から latents0 へのトランジションです。StyleGANが凄いのは、ベクトル補完の画像を細かく見ても、実に自然な変化をするということです。

なお、コードを実行して出来るオリジナルの gif 動画は1024×1024(45MB)と大きいので、ここでは500×500(11MB)に縮小したものを表示しています。

ただ、それでも結構大きなサイズなので、スマホで表示すると読み込みに多少時間が掛かり、動き出すまでしばらく待つ必要があるかもしれません。

   

Style-mixingをやってみる

StyleGANで面白いのが、Style-mixingです。これは、Synthesis networkの各層に入力されるスタイルの内、解像度の低い層(4×4〜8×8)、解像度が中程度の層(16×16〜32×32)、あるいは解像度の高い層(64×64〜1024×1024)を他の画像のベクトルに入れ替えることによって、2つの画像の特徴をミックス出来るのです。

解像度の低い層へ入力するスタイルをCoarse Style、解像度が中程度の場合はMiddle Style、解像度が高い場合はFine Style と呼んでいます。どんなミックスが出来るのか見てみましょう。

  

Style-mixing を試すコードです。3つのオリジナル画像(seed = 11, 701, 583)のCoarse Style の部分を、2つの画像をトランジションさせたベクトル(seed =503 → seed = 888)に置き換えます。

結果は、resultsフォルダーの中に、style_mix.pngという名前で保存されます。このコードをコピペして実行します。

   

   

最上段の3枚のオリジナル画像のCoarse Style部分を、左端のトランジション画像に入れ替えた時の変化を表示しています。

主に、髪の毛の色や量肌の色目と口元などが変化しています。一方、顔の形や顔の向き、メガネはオリジナルのままです。

次に、Middle Styleをみてみましょう。コードの60行目の [range(0,4)]*4 を [range(4,8)]*4 に修正して再度コードを実行します。

   

Middle Styleの部分を置き換えた場合です。顔の向きや顔の形に変化が現われます。メガネはなくなってしまいましたね。

さらに、Fine Styleをみてみましょう。コードの60行目の [range(4,8)]*4 を [range(8,18)]*4 に修正して再度コードを実行します。  

  


Fine Styleの部分を置き換えた場合です。もはや、トランジション画像の方が支配的になり、オリジナル画像から受け継ぐのは髪の毛の色と肌の色くらいになります。 

それにしても、画像の完成度がここまで上がり、ある程度スタイルの制御も可能になって来るとは本当に驚きです。

では、また。