【GANをカスタマイズ】数枚～数十枚のスケッチから特定構図が生成できる派生モデルを作る

[2021年のディープラーニング論文を1人で読むAdvent Calendar](https://qiita.com/advent-calendar/2021/solo-dl-papers)11日目の記事です。今回紹介するのはGANのカスタマイズです。

GANというと乱数から画像を生成するモデルを1から訓練するものが想像されますが、今回は**GもDもファインチューニング**です。この論文では、スケッチ画像と写真という対応で訓練させていますが、特徴抽出のネットワークがあれば普遍的に応用できる研究です。カスタマイズされた派生モデル間の補間などかなり興味深いことも出てきます。見ていきましょう。

著者はカーネギーメロン大学とMITコンピュータ科学・人工知能研究所の方です。ICCV2021に採択されています。

* タイトル：**Sketch Your Own GAN**
* URL：https://openaccess.thecvf.com/content/ICCV2021/html/Wang_Sketch_Your_Own_GAN_ICCV_2021_paper.html
* 出典：Sheng-Yu Wang, David Bau, Jun-Yan Zhu; Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 2021, pp. 14050-14060
* プロジェクトページ：https://peterwang512.github.io/GANSketching/
* コード：https://github.com/peterwang512/GANSketching

<iframe width="711" height="400" src="https://www.youtube.com/embed/1smwQ-tSCjM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 問題設定
よくあるGAN：乱数から画像を生成

![11_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/86bc5951-437c-5afc-b29b-d9227d02d314.png)

このGAN：**訓練済みGANをファインチューニング**して、ユーザーのスケッチをベースにポーズや構図をコントロールしたモデルを作る

![11_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/62c6060d-aad2-6dca-f2b2-09c8a28a3f8e.png)

この図でいう$G'$というのがこの論文で作りたいモデルです。$G$は構図や向きが何でもありのGANですが、これを$G'$のように**スケッチで構図をある程度縛った画像を生成**したいのです。これをするにはどうすればいいのですか？というのがこの論文の主題です。

## 大量の画像と、数枚～数十枚のスケッチがあれば良い
スケッチ→写真というと、Image to image translationの問題に属します。この手の問題は、スケッチと写真で1対1のペアが作られているPairedなデータセット、ペアを作っていないUnpairedなデータセットの2種類のケースに分類できます。この論文では**Unpaired**なデータセットを想定しています。

教科書的なやり方だと、Pairedな例はPix2pix、Unpairedな例はCycleGANが挙げられます。一見CycleGANみたいなやり方をするのかと思われますが、**写真→スケッチに戻すための訓練可能なネットワークやCycle Consistency Lossなどが必要ありません**。CycleGANでやろうとすると、画像が数千枚あったとしたら、スケッチも同じぐらい必要になります。この論文は、**画像は大量に使うが、スケッチは数枚～数十枚でうまくいく**というのが特徴です。根本的に発想が異なる点は**GANのファインチューニング**にあるという点です。

また大きく異なるのが、**スケッチを入力に入れない**という点です。あくまでやるのはファインチューニングして構図を縛るということであって、スケッチを入力に入れて任意にコントロールではありません。構図の変更はモデルの再訓練が必要になります。[6日目のスタイル変換の記事](https://qiita.com/koshian2/items/18b2201c15c603e02a01)で出てきた「Per-Style-Per-Model」と発想は近いかもしれません。

## モデル全体と訓練について
![11_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/957e9e88-2420-ba2a-666e-14c9d1c9bb11.png)

図のような比較的簡単なモデル構成になります。$G'$というのは乱数から画像を生成するGeneratorで、訓練済みGANをファインチューニングします。具体的には**StyleGAN2**のマッピングのネットワークを再訓練したとのことです。位置づけ的にはStyleGAN2のカスタマイズであり、訓練済みStyleGAN2の活用という点では[3日目の論文](https://qiita.com/koshian2/items/c69cd51a2087d9fa898a)と似ているかもしれません。

スケッチと画像の分岐があります。スケッチ側は$F$という、**訓練済みのスケッチの抽出ネットワーク**を使います。これは[Photosketch](https://arxiv.org/abs/1901.00542)を利用しています。$F$は単なる特徴量の抽出として用い、再訓練しません。生成画像を$F$を通して得られた偽のスケッチと、本物のスケッチを使い敵対的なロス$\mathcal{L}_{sketch}$を得ます。

生成画像についても敵対的な訓練をします。これは普通のGANと一緒で、$\mathcal{L}_{image}$というロスになります。スケッチのみだと出力画像の画質や多様性が大きく落ちるとのことです。

また、2つの**Discriminator**$D_X, D_Y$**についても訓練済みネットワーク**を利用します。特に$D_Y$を訓練済みネットワークを利用せずに、ランダムに初期化すると大きく結果が悪くなるとのことです。オリジナルのGANのDを使うと書いてあったので、$D_X$はStyleGAN2のD、$D_Y$はPhotosketchのDを使うものと考えられます（PhotosketchもGANベース）。

全体の損失関数は次のようになります。

$$\mathcal{L}=\mathcal{L}\_{sketch}+\lambda\_{image}\mathcal{L}\_{image}$$

ここで$\lambda_{image}$は0.7としています。

## スケッチのデータについて
この論文では人間が描いたスケッチを使うことを想定していますが、人間が描いたものを使うと定量評価が困難になるため、訓練で使った写真をPhotosketchに通したものから、構図が近いものを30枚手動で選んだとのことです。

また、スケッチについてはData Augmentationを使用したほうが良いこともあるとのことです。Photosketchで機械的に生成した30枚のスケッチに対しては、必ずしもしなくてもいいとのことでしたが、**人間が描いたスケッチの場合、スケッチのData Augmentationは有効に機能**します。私見ですが、性能を上げるための増強というよりも、Photosketchと手描きのデータ分布のギャップを埋めるための増強という意味合いのほうが強いと思います。

## 定量評価
![11_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/68259cd8-604f-bb3d-4e78-a4ba271fae6a.png)

この定量評価では、他の研究との比較より、この研究での実装手法間の比較に注目すべきでしょう。Oursの中の「1-sample」「5-sample」というのは、スケッチのサンプル数です。当然ながらスケッチのサンプル数を増やせば増やすほど、高画質な画像が生成されます（FIDが低くなる）。

「D scratch」というのは、スケッチについてのDiscriminator$D_Y$をランダムに初期化した場合、つまり訓練済みDを使わない場合を示しています。このケースでは仮にスケッチのサンプル数が30あったとしても、訓練済みのDを使う＋1サンプルのケースよりも劣る結果となっています。つまり、**D、特に$D_Y$においても訓練済みのモデルを使うことは重要だ**ということがわかります。

「W-shift」というのはG（StyleGAN2）の$\mathcal{W}$だけ訓練するということを意味します。ここでStyleGANの構造を振り返ると（以下の図はV1です）、

![03_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/1086605f-7228-07b7-7309-551fa6ae5509.png)

W-shiftというのは「A」のことを指していると思われますが、StyleGAN2自体が相当優秀なので、Wのシフトの部分のみを訓練すればいいということを言いたいのだと思われます。実際訓練するGのパラメーターを減らすと、FIDが落ちていることが確認できます。

Augmentationについては、このケース（Photosketchから機械的に生成した30枚のスケッチを訓練画像としたケース）の場合は、ないほうが良いこともありましたが、人間が描いたスケッチの場合はあったほうが良いです。

![11_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/806d81c6-8e34-d550-fe6c-6428136a53df.png)

これは人間のスケッチ（具体的にはQuickdrawデータセット）を用いたものですが、Data Augmentationがない場合だと必ずしもポーズのアラインメントが取れていないケースがあります。スケッチに対するData Augmentationを入れることでこの問題を解決できます。

### 生成画像について敵対的な訓練を行う意義
また、生成画像についての敵対的な訓練（$\mathcal{L}\_{image}$）の意義についても見てみましょう。$\mathcal{L}\_{image}$を論文では、「**画像正則化（Image Regularization）**」と呼んでいます。

![11_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/de58fb2f-c869-bcf3-ef51-c5fe24700a85.png)

「Same Iteration」というのは同一エポックでの生成画像、「Optimal Iteration」というのは各パターンで最良の結果です。Same Iterationのほうがわかりやすくて、一番上の$\mathcal{L}_{sketch}$だけの場合は、明らかに背景や馬のバリエーションがおかしいです。

$\mathcal{L}_{weight}$というのは、画像正則化ではなく、

$$\mathcal{L}_{weight}=\|\theta'-\theta\|_1$$

といわゆるL1正則化を適用したケースです。理想的には**L1正則化ではなく、画像正則化を適用したほうがより綺麗**になります。画像正則化の場合は、生成画像について敵対的な訓練を行う必要があるため、$G$を訓練した画像データが手元にある必要があります。

![11_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/038dff34-a0e1-737d-e125-d89a47c5ff98.png)

定量評価はこの通り。$\mathcal{L}\_{sketch}+\mathcal{L}\_{image}$がほとんどのケースで良いです。このケースではスケッチは機械的に作成したものなので、Data Augmentationの効果はそれほど現れていません。

## 応用例
潜在空間を主成分分析することで、猫に毛を足すというような演算ができます。[これは既存の研究と同じ手法なので、詳細が気になる方は論文を参照](https://arxiv.org/abs/2004.02546)してください。

![11_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/49094f3b-65fa-5ac3-de65-7005c892c3ee.png)

また生成画像に対応する乱数（逆元）を計算することで、以下のような面白いこともできます。

![11_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/11ac46c8-658b-6c5f-9bc8-f948d3b9a3cd.png)

(a)は本物の画像です。(b)は**元の（例：StyleGAN2）のモデル**での対応する逆元を計算し、画像を生成したものです。(c)は**スケッチを使ってポーズをカスタマイズしたモデル**に(b)で計算した乱数を与えたものです。ここで(b)と(c)の乱数は同一です。(b)と(c)の乱数が同一の空間にあることがどうやって保証されるのか不思議なところではありますが、「W-shift」の部分だけ訓練するという点がこれを保証しているのかもしれません。(d)は先程と同じ毛を付け足したものです。逆元計算についは[こちらの研究](https://arxiv.org/abs/2005.01703)を使っています。

実際に異なる2つのモデルで「$\mathcal{W}$の空間（ノイズ）」と「係数」それぞれの線形補間をした例が以下のとおりです。

![11_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232088/b14302c4-c2e9-9ecd-5e52-ad069679be29.png)

Model 1, Model 2はそれぞれ異なるスケッチで訓練したモデルです。ノイズの補間も係数の補間もほとんど同じ結果を示しています。別のモデルをノイズをざっくりと流用しても変な出力はしないよということが言えるのではないでしょうか（はやりキーはW-shiftのみ訓練？）。

このように、逆元計算とノイズ操作でGANの出力結果をジャックしていくのが、[3日目の論文](https://qiita.com/koshian2/items/c69cd51a2087d9fa898a)とよく似ているのですが、最近のトレンドなんでしょうかね。

なお、モデルの訓練には最低3万ステップ必要なため、リアルタイムのモデル生成に関してはまだできないとのことです。ただ3万ステップ程度で済むなら結構すごいことだと自分は思います（まっさらな状態から訓練すると1桁違いそう）。

## まとめ
単にスケッチからGANをコントロールする論文かと思いきや、StyleGAN2をFine tuneすることでGAN任意にカスタマイズできることを示したなかなか奥深い論文でした。結局Photosketchのような特徴抽出のネットワークがあればいいので、例えばこれをポーズ検出のネットワークに変えれば、任意のポーズで出力できるGANに変えられるかもしれません。そういう点ではかなり可能性のある研究だと思います。

[3日目の論文](https://qiita.com/koshian2/items/c69cd51a2087d9fa898a)でも見た通り、やはりStyleGAN2強いですね。あくまでこれは一過性のトレンドかもしれませんが、この傾向が続けばStyleGAN2がまるで訓練済みのResNetやVGGのようにコモディティ化するのではないか、と個人的には思っています。StyleGAN2を任意のデータで訓練できることは、あたかも訓練済みImageNetに相当するような価値を今後持ってくるかもしれません。

単に画像を生成して「存在しない人物を作った」「写真が証拠となる時代は終わった」で終わるのではなく、この論文のようなカスタマイズモデルの作成、逆元計算やノイズ操作のように、Disentangle性が重要視されているように思います。そういう点では、GANは新しいステージへと向かっているのかもしれません。

## 告知
このアドベントカレンダーが本になりました！
**https://koshian2.booth.pm/items/3595424**
Amazonでも扱いあります詳しくは👉　https://shikoan.com