[最新論文]NVIDIAさんがまた本気を出してしまった。

![gif6.gif](https://qiita-image-store.s3.amazonaws.com/0/315063/13a7f637-e9f6-2417-cb38-8494cc538054.gif)

#論文紹介・画像引用・GIF引用
NVIDIAより2019.3.18提出
https://arxiv.org/pdf/1903.07291v1.pdf
https://github.com/NVlabs/SPADE
https://www.youtube.com/watch?v=MXWm6w4E5q0&feature=youtu.be
https://gadgets.evolves.biz/2019/03/20/nvidia_smartpaintbrush/

#本研究について
・**セマンティックセグメンテーションマスクからリアルな画像**への変換

・エンコーダーを使うことでスタイルの選択も可能

・**SPADE**（後述）という正規化層を加えることによって、少ないパラメータで**意味情報を捉えた画像合成**ができるようになった

##欲しい画像を簡単につくれる
![image35.png](https://qiita-image-store.s3.amazonaws.com/0/315063/f1c8f528-5b7f-7ac8-1c68-f6644e34e742.png)

・ユーザーがセグメンテーションマスクを描くことで、それに対応する画像を生成することができる

・画像の全体的な見た目を調整するために、スタイル画像の選択もできる
これは入力のノイズをimage encoderによって計算されたスタイル画像の埋め込みベクトルにすることで可能になる（後述）

#SPADE
**SPatially-Adaptive (DE)normalization →SPADE**
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/93fe7ff8-18d8-de1b-76d1-d22bf1841924.png)

###SPADEの流れ

①出力をチャンネルごとに正規化する（上図のnormalization）

②セマンティックマスクから計算された$\gamma$と$\beta$で各ピクセルの値をスケーリング・バイアスをかける（上図のelement-wise）

###パラメータ（γとβ）の特徴
$\gamma\_{c,y,x}^{i}(m)$と$\beta_{c,y,x}^i(m)$について

・学習によって得られるパラメーター

・**位置($c,y,x$)によって異なる値を持てる**

・**$\gamma$と$\beta$はセグメンテーションマスクから計算されるため、意味情報を合成画像に加えることができる**

###計算式から見るSPADE
$n\in{N},c\in{C^i},y\in{H^i},x\in{W^i}$での出力の値は以下のようになる

**i番目の層の出力を正規化（平均を引いて標準偏差で割る）して、$\gamma$でスケーリング、$\beta$でバイアスをかけている**
$$\gamma\_{c,y,x}^{i}(m)\frac{h_{n,c,y,x}^i-\mu_c^i}{\sigma_c^i}+\beta_{c,y,x}^i(m)　　　　(1)$$
$m$：セマンティックセグメンテーションマスク
$N$：バッチサイズ
$h^i$：i番目のconvolution層の正規化前の出力
$C^i$：i番目のconvolution層のチャンネル
$H^i・W^i$：i番目のconvolution層の出力マップの高さと幅

$\mu_c^i$：チャンネル$c$の平均
$\sigma_c^i$：チャンネル$c$の標準偏差

平均と標準偏差を求める式は下記のようになる


$$\mu_c^i=\frac{1}{NH^iW^i}\sum_{n,y,x}h_{n,c,y,x}^i　　　　　　　(2)$$
$$\sigma_c^i=\sqrt{\frac{1}{NH^iW^i}\sum_{n,y,x}(h_{n,c,y,x}^i)^2-(\mu_c^i)^2}　　　(3)$$



##SPADEの構成
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/8f86c118-8f66-b505-a490-bba5616965dd.png)
3x3-Conv-k：3×3のフィルタ、フィルタセット数（出力のチャンネル数）が$k$の意味

$\gamma$の要素積と$\beta$の要素和ができるように、セグメンテーションマップをnearest-neighborダウンサンプリングでリサイズして解像度を合わせる

##SPADEと既存の正規化層の関係
SPADEを少し変えると既存の正規化層になる
###Conditional Batch Normalization層
①セグメンテーションマスク$m$をクラスラベルに変える
②パラメーターを空間不変にする

```math
\gamma_{c,y1,x1}^{i}\equiv\gamma_{c,y2,x2}^{i},　\beta_{c,y1,x1}^i\equiv\beta_{c,y2,x2}^i,　　　\\y_{1},y_{2} \in {\{1,2,...,H^{i}\}},　x_{1},x_{2} \in {\{1,2,...,W^{i}\}}
```


→SPADEからConditional BN層になる

###AdaIN
①セグメンテーションマスクを画像に変える
②パラメーターを空間不変にする
③バッチサイズを１にする

→SPADEからAdaINになる

#SPADE generator
入力：セマンティックマスクとランダムベクトル　→　出力：画像

![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/636f3c6a-9888-71a2-ebd8-1228c80b8a13.png)

SPADEの$\gamma$と$\beta$がセグメンテーションマスクの意味情報をエンコードしているため、generatorの入力層にはセグメンテーションマスクを与える必要はない

そのため、SPADEを使うgeneratorはエンコーダーがない形でも使える
→パラメータ数が減る

入力として受け取るランダムベクトルは生成画像の多様性を生み出す役割を持つ

##SPADE ResBlkの構成
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/27ce6593-f4a2-9519-9545-8cb0ae385709.png)

ResBlkの前後でチャンネル数が変わった場合でも足し合わせができるように、スキップ構造にもconvolution層を使う

##SPADE generatorの構成
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/0be61187-2144-bc84-9e19-96a5eb755685.png)

・入力はランダムベクトル

・セマンティックマスクは入力層に与えるのではなく、各SPADE ResBlkに与える

・nearest neighborアップサンプリングを使って解像度を大きくしていく



#SPADEの良いところ
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/709f5563-9234-3c40-8f35-f5e6637d3fde.png)

SPADE：意味情報を捉えたテクスチャを生成
pix2pixHD：正規化層による**意味情報の損失**により、入力の内容に関係なく同じ出力になる

**一様なセグメンテーションマスク（上図のような画像全体が同じ意味情報のとき）に従来の様な正規化層が適用されると、意味情報を洗い流してしまう傾向がある**

###従来の正規化層が良くない理由

例）上図のような単一のラベルからなるセマンティックマスクの入力を
convolutionと正規化層のモジュールで処理する場合を考えてみる

①convolotion層
convolution層で入力が処理されても、同じラベルは同じ値になる

今回の場合は一様な入力のため、すべてのピクセルが同じ値を持つ
イメージ）skyが入力＝すべてのピクセルの値が５、grassが入力＝すべてのピクセルの値が１０

②従来通りの正規化層
①の出力を正規化する（平均を引いて標準偏差で割る）

skyの場合
すべての値が５のため、平均も５　→　正規化後の値は０になる
grassの場合
すべての値が１０のため、平均も１０　→　正規化後の値は０になる

**正規化された値は、セマンティックラベルが何であってもすべての値が０になってしまう**
**＝意味情報を失っている**

###意味情報を捉えるSPADE

SPADEを使ったgeneratorの場合は
前回の出力だけが正規化されて、SPADEの入力である**セグメンテーションマスクは正規化されない**

**→正規化と意味情報の反映の両立が可能**

#多様な画像合成
![image35.png](https://qiita-image-store.s3.amazonaws.com/0/315063/e1ada05f-ca7c-b558-2d47-f5a1ea497245.png)
入力：セマンティックマスクとランダムベクトル（スタイル画像をエンコードしたもの）→出力：画像

エンコーダーとSPADEありのgeneratorを組み合わせることで上図の様な画像合成ができる

セグメンテーションマップの中にある画像は本物画像
##画像合成の流れ
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/8a9056b2-00c6-678b-c93a-3984d0acda2c.png)

①Image Encoderが入力画像を潜在表現にエンコードする
誤差逆伝播ができるようにreparameterization trickを使うため、平均と分散を出力とする

②reparameterization trickでサンプリングした潜在表現をgeneratorの入力とする

③generatorの各SPADE ResBlkへセグメンテーションマスクを入力する

④discriminatorはセグメンテーションマスクとgeneratorの出力をconcatenationしたものを入力にして、偽物として識別することを目的とする

###Image Encoder
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/13ebd68c-9faa-9f72-c3ec-630d70d64325.png)

・本物画像を平均$\mu$と分散$\sigma^2$にエンコード

・画像のスタイルを捉える

・Image Encoderありのフレームワークの時は、目的関数にKL Divergenceを加える
$$L_{KLD}=D_{KL}(q(z|x)||p(z))$$
$p(z)$：事前分布・ガウス分布
$q(z|x)$：学習によって得られる平均と分散から決められる分布・xを生み出すzの分布



###Generator
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/0be61187-2144-bc84-9e19-96a5eb755685.png)
・reparameterization trickによって計算されたランダムベクトルを入力とする

・**エンコードされたスタイル**と**SPADEから得られるセマンティックマスクの意味情報**を組み合わせた画像を生成する

・nearest neighborアップサンプリングを使って解像度を大きくしていく
###Discriminator
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/0d2f4664-bace-be52-fd58-35bc773bdd0a.png)

・セグメンテーションマップと画像をconcatenationしたものを入力とする

・PatchGAN（パッチごとに本物かどうかの識別をする）に基づいたdiscriminatorのため、最終層はconvolution層になる

・マルチスケールdiscriminatorを使う

#実験
###データセット
・COCO-Stuff
・ADE20K
・ADE20K-outdoor
・Cityscapes
・Flickr Landscapes
###評価指標
**合成画像に対してセマンティックセグメンテーションを実行し、予測マスクが正解マスク（入力）とどのくらい合致しているかを比べる**

リアルな合成画像であれば、学習済みのセマンティックセグメンテーションモデルは正解と同じラベル予測をするはず

**セグメンテーションの精度**を測るために以下の指標を使う
・mean Intersection-over-Union (mIoU) 
・pixel accuracy (accu)

合成画像と本物画像の**分布の距離**を測るために以下の指標を使う
・Frechet Inception Distance (FID)

###ベースライン
・pix2pixHD
GANベースの条件付き画像合成のSOTA

・CRN
低解像度から高解像度まで繰り返し出力を調整するディープネットワークを使用

・SIMS
本物画像からセグメントを合成し、境界を調整するセミパラメトリックアプローチ

##スコア比較
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/2cb535d4-1f15-5e07-d770-14dd732ef2eb.png)

・すべてのデータセットで現在の**SOTAであるpix2pixHDを大幅に上回るスコア**になっている

###SIMSのFIDスコアが良い理由
SIMSでは本物画像のデータセットからの画像パッチをつなぎ合わせることで画像合成を行っている
→**本物画像のパッチを使っているため、合成画像の分布は本物画像の分布と合致しやすい**

###SIMSのセグメンテーションスコアが悪い理由
画像を生成する上で欲しいパッチ（例えば特定のポーズをとっている人）がデータセット内に存在しないこともある
→**意味情報が異なるオブジェクトをコピーする傾向**

##画像比較
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/a660da35-952e-4861-16ec-c2890e656f46.png)
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/bfdfd028-e98a-9ae3-18d2-81b04ee86888.png)

・**本研究の生成画像は鮮明でリアルな画像**になっている

・SIMSもきれいな画像が生成できているが、入力ラベルの意味情報を反映できていない（プールの形が変わってしまっている）

他にも以下のような多様な画像が生成できている
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/29fd3950-6d4c-1d9f-199c-c4270fe24e95.png)
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/89bd2734-dd06-3d24-6acc-e641730c4f7f.png)

##人間が合成画像を見て評価した場合

![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/3b3fc239-c0b2-7f97-9b9c-7b36d371d98e.png)

上表の数字はユーザーが本研究の方法による合成画像を選んだ割合を表す

**すべてのデータセットでユーザーは本研究の方法による合成画像を選ぶ確率が高い**

###評価手順とルール
Amazon Mechanical Turk (AMT) を利用する

①被験者にセグメンテーションマスクと異なる方法から合成された２枚の画像(例：OursとCRN)を見せる
②**セグメンテーションマスクと適切に対応している方**を選んでもらう

・被験者は時間制限なく画像選択ができる
・各データセットで５００の質問をランダムに作る
・各質問を異なる５人に答えてもらう
・タスク承認率が９８%以上の人のみ参加できる

##SPADEの効果
![image34.png](https://qiita-image-store.s3.amazonaws.com/0/315063/1179d670-6699-a4ae-a74d-8674608075f2.png)
それぞれのモデルのmIoUスコア

pix2pixHD++　：　pix2pixHDの性能を高めるすべての手法（SPADEを除く）を組み合わせたモデル

pix2pixHD++ w/ Concat　：　セグメンテーションマスクを中間層でチャンネル方向にconcatenationして入力するモデル

pix2pixHD++ w/ SPADE　：　pix2pixHD++とSPADEを組み合わせたモデル

compact ～　：　～のモデルのチャンネル数を減らしてパラメーター数を減らしたもの

---

・本研究提案のデコーダーのみのアーキテクチャでもpix2pixHD++（エンコーダーとデコーダーで構成されている）でも**SPADEを追加することで性能が上がっている**

・concatenationの方法ではSPADEと同様の効果は得られない

・本研究提案のデコーダー（SPADEあり）は少ないパラメーターであってもpix2pixHD++（SPADEなし）を上回る性能になる

##SPADE generatorの構成を変えた場合
![image35.png](https://qiita-image-store.s3.amazonaws.com/0/315063/bad60b3b-221b-08f3-219f-2a5e5a298010.png)

①generatorへの入力
ランダムノイズかダウンサンプリングしたセグメンテーションマップ
どちらを選択しても同じ性能
→　**SPADEだけでセグメンテーションマップの情報は十分得られている**ことがわかる

②SPADE前の正規化層
どの正規化層でも上手く機能する

③セグメンテーションマップに使うカーネルサイズ
1×1のカーネルを使うとラベルに関しての広範な情報が利用できないため性能が落ちる

④generatorのパラメーター数
convolution層のフィルタセット数（チャンネル数）を減らすことで調整
モデルの大きさに関わらず高い性能になっている

#まとめ

・**SPADEを用いることでセマンティックマップの意味情報を失わなくなる**ため、屋内・屋外・風景・街路などあらゆるシーンの画像をリアルに生成することができる

・ユーザーがセマンティックマップを描くことで、それに対応した画像を生成できる
・スタイルの選択もできるため、より多様な画像になる