cedro-blog

Retrieve in Styleで、顔画像の特徴だけを別のものに置き換える

1.はじめに

 「目があの人の様なパッチリした二重だったら」とか、「鼻があの人のような高い鼻だったら」などと思ったことはありませんか。

 今回ご紹介するのは、顔画像の特徴だけを別の画像のものに置き換えることができる Retrieve in Style(RIS)という技術です。

2.Retrieve in Style(RIS)とは?

 ソース画像に参照画像のある特徴 k を転送するときに、今までは大規模なデータからチャンネル c 寄与スコア Mk,c を平均的に求めて、補完ベクトルを取得していました。しかし、この方法はある特徴(髪の毛・ポーズ)では上手く行かないことが分かっていました。

 これは、チャンネルの寄与スコア Mk,c は画像によって異なるため、平均すると固有の特徴が破壊されることを示しています。そこで、サブメンバーシップというの概念を導入して、ソース画像と参照画像のみ(N=2)で寄与スコア Mk,c を求めて、補完ベクトルを取得するのが本論文の提案です。

 寄与スコア Mk,c は下記の様に表されます。ここで、Aは活性化テンソル、Uはクラスターメンバーシップ、sはソース、rは参照、kは特徴、cはチャンネル数、hは高さ、wは幅です。

 補完ベクトル q は下記の様に表されます。ここで、M は全ての特徴 k を積み重ねた寄与スコア、τ は温度です。

 では、コードを動かしてみましょう。

3.コード

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

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

 

 最初に、顔画像の特徴を抽出します。Generatorにランダムベクトルを入力して得られた顔画像(1024×1024)を32×32の大きさでクラスタリング処理します。

 目、眉、頬、口、髪の毛などがクラスタリングされていることがわかります。

 クラスタリング結果を顔の特徴としてラベルを付けし、関数を定義します。

 

 この後、顔画像の潜在変数を使ったデモを行います。自分で用意した画像を使用しない場合は、次のブロックだけパスして下さい。

 自分で用意した画像を使用する場合は、PCからその画像をドラッグ&ドロップで RetrieveInStyle/images へアップロードして(複数OK)から、下記を実行して下さい。得られた潜在変数は、RetrieveInStyle/inversion_codes に同じファイル名+拡張子ptで保存されます。

 

 それでは、顔の特徴の転送を行なってみます。まず、転送先のソース画像と転送元の参照画像を表示します。10行目、14行目を修正するとソース画像と参照画像を変更できます。

 ソース画像は 'brad_pitt'、参照画像は 'emma_watson''emma_stone''jennie' です。

 ソース画像へ参照画像から転送する特徴は、'eyes''nose''mouth''hair''pose' の5つです。

 ソース画像 'brad_pitt'の5つの特徴へ、参照画像のものが転送されています。

 今度は、ソース画像へ参照画像から特徴を転送する度合いを変化させてみましょう。まず、ソース画像と参照画像を表示させます。

 ソース画像が 'emma_stone'、参照画像が 'brad_pitt' です。

 ソース画像へ参照画像から「目」「髪型」を転送する度合いを変化させてみます。

 右端が参照画像、右から4列目がソース画像です。ソース画像から右へ行くほど参照画像の特徴に近くなり、左へ行くほど参照画像の特徴とは反対になります。

 今度は、大量の顔画像データベースの中から、ソース画像の指定した特徴に近い画像を検索してみましょう。まず、generator にランダムベクトルを入力し、5000個の顔画像データベースを作成します。

 

 ソース画像を表示させます。

 

 それでは、ソース画像の「目」、「口」、「髪型」の特徴に似ている画像を、5000個の顔画像データベースの中から検索してみましょう。

 特徴だけに絞って、検索できるといのは今までにはなかった取り組みです。

 では、また。

(オリジナルgithub)https://github.com/mchong6/RetrieveInStyle