Inverse Graphics GANの論文要約

# Inverse Graphics GAN: Learning to Generate 3D Shapes from Unstructured 2D Data 


* Sebastian Lunz, Yingzhen Li, Andrew Fitzgibbon, Nate Kushman 
* リンク：
    * arxiv
        * https://arxiv.org/abs/2002.12674
        * (Submitted on 28 Feb 2020)本記事で読んでいるのはv1
    * 補足資料
        * https://lunz-s.github.io/iggan/iggan_supplemental.pdf


![スクリーンショット 2020-04-03 13.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/bb098574-1348-5adc-589f-b78a5f378608.png)
![スクリーンショット 2020-04-01 11.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/0c060464-3ca2-5a3b-699a-cce00eebffe9.png)



## ひとことまとめ

(落合先生のテンプレート使用)

* **どんなもの？** 
    * 2D画像から3Dオブジェクトを生成するモデルを，2D画像だけを使って訓練した

* **先行研究と比べてどこがすごい？**
    * 3D教師データがいらないこと 
    * 生成された3Dオブジェクト品質が高く，特に凹面で有利

* **技術や手法のキモはどこ？**
    * GANとニューラルレンダラから構成され，OpenGLのような既製品のレンダラを組み合わせて訓練

* **どうやって有効だと検証した？**
    * 2D画像から学習できる先行研究との比較
        * FIDスコアによる，生成3Dオブジェクトのレンダリング画像の比較
        * ShapeNetデータセットでの生成3Dオブジェクトの視覚的比較

* **議論はある？**
    * なし

* **次に読むべき論文は？**
    * Nguyen-Phuoc et al. 2018
        * RenderNet．本論文で使用されたニューラルレンダラの元論文
    * Rezende et al. 2016
        * 既製品レンダラ(OpenGLみたいなやつ)を使用した2D教師ありの3D生成
    * Liao et al. 2018
        * マーチングキューブアルゴリズムを単純に微分できない理由とかの議論


## abst

* 非構造化2D画像から3D形状を生成するモデルは，訓練時にレンダリング処理のラスタリゼーションを微分する必要がある(が，不連続なので通常は不可能である)
    * 既存手法は，この微分不可能な処理を色々な方法で対処する特殊モデルを開発してきた
        * そのため，彼らはゲームやグラフィック産業の作った高機能でリアルなレンダリングエンジンを利用できない
* 本研究は，2Dデータから3Dを生成するモデルで最初の，スケーラブルな訓練手法を導入する
    * 既製品の微分不可能レンダラーを使う
        * この微分不可能性に対処するため，微分不可能レンダラの出力にマッチさせる代理ニューラルレンダラーを導入する
    * さらに，ニューラルレンダラーがラスタリゼーションを適切に処理できるようにdiscriminator output matchingを提案する
    * 生成した3D形状からレンダリングされた画像でモデルを評価し，本モデルが既存手法よりよい形状生成を学習できることを示す(専用の非構造化2D画像で訓練している)


## 6. Conclusion

* 任意の既製品のレンダラを使って非構造化2Dデータから3D形状を生成する最初のスケーラブル手法を提案した
    * 新しい誤差関数，Discriminator Output Matchingを導入した
        * これは多くのデータセットで安定した訓練を実現し，既存手法よりはるかに良いFIDスコアをもたらす
    * レンダリングエンジンの露光や影の情報を使って，高品質な凸形状を生成できる
        * 先行研究が失敗していたバスタブやカウチなども生成
    * 本手法は理論的にはいかなる既製品レンダラと組み合わせることもできる
    * 色やマテリアル，ライティング予測等を組み込めば，より一般の実世界データにも拡張できるだろう

## 1. intro

* GANは2D画像で興味深い結果をもたらしている(Karras et al., 2019; Brock et al., 2019)
    * ゲーム等の応用では3Dモデルを入力にするが，このためにGANを単純に拡張すると3Dの訓練データが必要(Wu et al., 2016; Riegler et al., 2017)
        * 3Dデータはコストがかかるし，一般的な物体でしか豊富なデータはない
            * 理想は2D画像だけで訓練して3Dモデルを生成したい
* 2Dデータだけで訓練するなら，3Dの表現は好きなものを使える
    * ゲーム用3Dモデル生成は3Dメッシュが普通だが，多くの手法はテンプレートメッシュの変形をベースとしており，任意のトポロジの形状は生成できない
        * voxelは任意のトポロジを表現でき，marching cubeアルゴリズムで簡単にmeshに変換できるのでこれを用いる
        * 各voxelを，占有確率を示す実数 $ \left[ 0, 1 \right] $で表現することで微分可能になる

 　

* end-to-endの微分可能モデルで学習するには，3Dモデルを2D画像にレンダリングする処理を通して微分する必要がある
    * レンダリング中のラスタリゼーションは本質的に微分不可能
        * そのため，先行研究は微分可能レンダラをゼロから作成してきたが，それではUnReal EngineやUnityなどのゲーム産業のリアルなレンダラが利用できない
     レンダリングプロセスで微分できないのは主に次の２点
            1. ラスタリゼーション処理．(3D->2D画像にするときに視点によって隠れる部分が必ずあるから)
            2. メッシュ生成のために，連続値ボクセルグリッドをサンプリングする処理
        * 通常の既製品レンダラの入力はメッシュ
            * 二値ボクセルグリッドは簡単にメッシュに変換できるが，連続値ボクセルはそうではない
                * 連続値ボクセルを既製品レンダラでレダリングするには連続値ボクセルで定義された分布から，二値ボクセルをサンプリングする必要がある
                    * (ニューラルな手法でボクセルを出力すると，普通は連続値になり，連続値ボクセルは既製品レンダラには入力できない．ニューラルと既製品レンダラを組み合わせるにはサンプリングが必要だが，それは微分不可能，という意味だと思う．)

　

* 本手法は2Dデータから3D生成モデルを訓練する初のスケーラブルな手法
    * キーとなるのは代理ニューラルレンダラ
        * ニューラルレンダリングの最近の成功(Nguyen-Phuoc et al., 2018)に基づいている
            * これは3D生成モデルの連続値ボクセルを直接レンダリングできる
* 本手法は次の２つの試みで微分不可能問題を解決した
    * **ニューラルレンダラを通した微分**
        * 代理ニューラルレンダラは，3Dメッシュを入力し，既製品レンダラの出力と一致するように訓練される
            * GANのdiscriminatorからのback-propがニューラルレンダラから生成モデルへと通ることでgradient descentで訓練できる
    * **Discriminator Output Matching**
        * ボクセルサンプリング処理を微分するために代理ニューラルレンダラにはdiscriminator output matchingという誤差関数も使った
            * 既製品レンダラ(二値入力専用)の出力に一致するように訓練されるニューラルレンダラは，そのままでは二値ではないボクセルグリッドに対しては任意の出力を生成しうる
                * ニューラルレンダラの出力画像をdiscriminatorに渡した時の誤差を計算することでこれに制約をかける
                    * この誤差は，「ランダムなしきい値で連続値ボクセルを二値ボクセルにして既製品レンダラに入力し，その出力画像をdiscriminatorに渡した場合の誤差の平均」と一致するように設計した
                        * 生成された個別の3D形状に対して微分可能な誤差を定義していない
                        * ニューラルレンダラに連続値ボクセルから画像を生成させる
                            * （ランダムなしきい値で二値化することで，ニューラルレンダラは「連続値ボクセルを既製品レンダラに入力できたと仮定したときのdiscriminatorの反応」と同じ反応をdiscriminatorに取らせるように学習する．その結果，連続値ボクセルを入力したときに既製品レンダラが出力しそうな画像を生成できるようになる，という意味だと思う．）

* ShapeNetデータセットの3Dモデルから生成した画像で本モデルを評価した
    * Chanterelle mushroomsデータセットの自然画像(Henzler et al. 2019)でも行った
    　Henzler et al.2019や2DのGANによるベースラインより，本手法が良い2D FIDスコアを出すような3Dメッシュを生成できることを示した

## 2. Related Work

### ジオメトリベースの手法(3D復元)

* 古典的な手法は，ジオメトリベースで単一物体が写った１枚または複数の画像から１つの３Dオブジェクトを復元するもの
    * Bleyer et al., 2011; De Bonet & Viola, 1999; Broadhurst et al., 2001; Galliani et al., 2015; Kutulakos & Seitz, 2000; Prock & Dyer, 1998; Sch ̈ onberger et al., 2016; Seitz et al., 2006; Seitz & Dyer, 1999
    * 学習する手法ではなく，画像に現れていない面については復元不可能

### 3D教師ありで生成を学習

* 物体形状の分布を学習するのに訓練集合を使うタイプのもの
    * 多くの研究が，完全な3D教師データにアクセスできるシンプルな学習設定に着目した
        * **ボクセル**： Brock et al., 2016; Choy et al., 2016; Riegler et al., 2017; Wu et al., 2016; Xie et al., 2019
        * **点群**： Achlioptas et al., 2018; Fan et al., 2017; Jiang et al., 2018; Yang et al., 2019; Achlioptas et al., 2018; Li et al., 2018
        * **メッシュ**： Groueix et al., 2018; Pan et al., 2019; Wang et al., 2018
        * **暗黙的表現**（後述されるが，3Dオブジェクトそのものではなく，3D形状のレンダリング結果を2D画像で出力するなど，3D表現が暗黙的に学習されている手法のことらしい）：Atzmon et al., 2019; Chen & Zhang, 2019; Genova et al., 2019; Huang et al., 2018; Mescheder et al., 2019; Michalkiewicz et al., 2019; Park et al., 2019; Saito et al., 2019; Xu et al., 2019
    * 3Dデータの作成は，アーティストや特別なキャプチャ設定などが必要でコストが高い
        * 本手法ではコストが低くすでに利用できる非構造化2D画像のみを使用して学習を行う

### 2D教師ありで生成を学習

* 2D画像から3D形状を生成する手法は微分可能レンダラに着目してきた
    * 生成できる形状のトポロジに制限
        * **単一テンプレートメッシュの変形**： Kanazawa et al., 2018; Chen & Zhang, 2019; Genova et al., 2018; Henderson & Ferrari, 2019
        * **少数のかけらを使用**：Henderson & Ferrari, 2019
        * **低次元ポーズ表現**： Loper & Black (2014) and Palazzi et al. (2018)
    * **暗黙的モデル**：Niemeyer et al., 2019; Liu et al., 2019，は2D画像から学習できるが，画像にカメラ組み込みがあることを仮定している(？よくわからない)
        * 本手法はアノテーションなしの2D画像を用いる
    * **ボクセル表現**：Gadelha et al., 2017; Henzler et al., 2019，は本手法と近い
        * 任意のトポロジを表現できる
        * marching cubesでmeshに変換できる
        * スパース表現で結構な高解像度にスケールできる(Riegler et al., 2017)
    * Gadelha et al. 2017(**visual hull ベースの微分レンダラ**)や Henzler et al. 2019(**emission-absorptionベースのライティングモデル**)はライティングやシェーディング情報を利用できず，凹面の表現に難があった
        * 本手法は多機能な産業用レンダラを利用することが目的
            * Rezende et al. 2016は，知る限り唯一の，**既製品レンダラを2D教師ありの3D生成に利用した手法**．
                * 彼らはレンダリングの微分にREINFORCE 勾配(Williams, 1992)を使っていた
                    * しかしこの手法は入力が高次元になるとスケールしないので，シンプルなメッシュしか生成できない
                        * 本手法はよくスケールする

### Neural Rendering

* Neural Renderingは，明示的な3D表を省いて，現潜在空間から直接2D画像を生成することで，3Dをシミュレートすることに着目している
    * カメラアングルでコントロールするもの：Eslami et al., 2018; Nguyen-Phuoc et al., 2019; Sitzmann et al., 2019
    * 物体の性質でコントロール：Liao et al., 2019
* 本研究は3D形状そのものを生成することを目的としている．次のような場合に重要．
    * ゲームのようにレンダリングフレームワークが固定されている
    * CAD/CAMアプリケーションのように3D形状に直接アクセスする必要がある
* 本研究は，RenderNet (Nguyen-Phuoc et al. 2018)に直接の影響を受けている
    * これは既製品レンダラの出力に一致するよう制約して，3D形状から2D画像を生成するよう訓練されたネットワークである

## 離散判断を微分する

* 「離散判断を微分する」(Differentiating Through Discrete Decisions) 問題を扱った研究
    * (翻訳がまずいかもしれないが，レンダラに入力するためにボクセルの各画素において，物体あり/なしを二値で決定する必要があり，それをどうやって微分するかという意味だろう)
        * Maddison et al. 2017；Jang et al.2017はdiscrete decision上でのスムージングを扱った
            * Tucker et al. 2017はこれを，サンプリングを使って，バイアスを取り除いた勾配推定へ拡張した
        * Liao et al. 2018はなぜMarching Cubesを使って単純に微分できないのか，という問題を議論した
            * 3D形状の確率分布を生成するのに連続値ボクセルを使うことも提案している
                * 彼らは3D正解データを使えるので，これらの(生成した)確率を直接使って誤差を計算できる
                    * 本研究では彼らと異なり，ボクセルサンプリング処理を微分する必要がある

## 3. IG-GAN

![スクリーンショット 2020-04-02 12.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/d199f33a-ca8b-9847-ce88-f94389c6a6c6.png)


* 本モデルでは，既製品レンダラに入力したときに，2D訓練データの画像分布に一致する画像が出力されるような3D形状を生成したい
    * 生成モデル$ G_{\theta}(\cdot)$
        * ランダムベクトル$ \boldsymbol{z} \sim p(\boldsymbol{z})$を入力
        * 連続値ボクセルの3Dオブジェクト $x_{c} = G_{\theta}(z)$ を出力
        * ボクセル$ x_c$は微分できないレンダリングプロセスに入る
            * 離散値$ \boldsymbol{x_d} \sim p(\boldsymbol{x_d} |\boldsymbol{x_c})$に丸める
            * OpenGLのような既製品レンダラでレンダリングされ， $ \boldsymbol{y} = R_d(\boldsymbol{x_d})$を得る
        * これらの処理をまとめると，2D画像 $ \boldsymbol{y} \sim p_G(\boldsymbol{y})$が次のように生成される

```math        

\boldsymbol{x_c} \Leftrightarrow \boldsymbol{z} \sim p(\boldsymbol{z}), \boldsymbol{x_c} = G_{\theta}(\boldsymbol{z})] \\

\boldsymbol{y} \sim p_G(\boldsymbol{y}) \Leftrightarrow \boldsymbol{x_c} \sim p_G(\boldsymbol{x_c}), \boldsymbol{x_d} \sim p(\boldsymbol{x_d} | \boldsymbol{x_c}), \boldsymbol{y} = R_d(\boldsymbol{x_d}) \tag{1}

```

* 2D画像分布$ p_D(\boldsymbol{y})$と$ p_G(\boldsymbol{y})$からサンプルされた生成画像からdiscriminator $ D_{\phi}$が訓練される
    * 分類ベースのGAN cross-entropy目的関数を訓練に使う

```math

max_{\phi} L_{dis}(\phi) := \mathbb{E}_{p_D(\boldsymbol{y})} \left[logD_{\phi}(\boldsymbol{y})\right] + \mathbb{E}_{p_D(\boldsymbol{y})}\left[ log(1-D_{\phi}(\boldsymbol{y}))\right] \tag{2} 

```

* ,
    * ,
        * generator $ G_{\theta}(\cdot)$ はdiscriminatorに定義された誤差を最大化して訓練

```math

 max_{\theta} L_{gen}(\theta) := \mathbb{E}_{pG}(\boldsymbol{y})\left[ logD_{\phi}(\boldsymbol{y})\right] \tag{3} 

```

* 2DのGAN訓練ではgradient descentを使うが，勾配はreparameterization trick(Salimans et al., 2013; Kingma & Welling, 2014; Rezende et al., 2014)で計算される
    * (1)が離散変数 $ \boldsymbol{x}_d $を使っており微分不可能なので，この方法は利用できない
        * そこで考えつくのが(3)の誤差にREINFORCE gradient estimator(WIliams, 1992)を使うこと

```math

\nabla_{\theta} L_{gen}(\theta) = \mathbb{E}_{p_G(\boldsymbol{x}_c)} \left[    \mathbb{E}_{p(\boldsymbol{x}_d    | \boldsymbol{x}_c)} \left[ logD_{\phi}(R_d(\boldsymbol{x}_d)) \right] S_G(\boldsymbol{x}_c) \right]    \tag{4}

```

* .
    * .
        * .
            * 期待値 

```math

 \mathbb{E}_{p(\boldsymbol{x}_d | \boldsymbol{x}_c)} \left[ logD_{\phi}(R_d(\boldsymbol{x}_d)) \right] 

```

* .
    * .
        * .
            * は 

```math

 \boldsymbol{x}_c \sim p_G(\boldsymbol{x}_d)

```

* .
    * .
        * .
            * を生成した報酬と呼ばれる

* .
    * .
        * .
            * .
                * .
                    * (4)をgradient ascentで更新するとgeneratorが高い報酬をもたらす $ x_c$ を生成するため，discriminatorを欺くことができる
                * $ S_G(x_c) = \nabla_{\theta} log p_G(x_c)$ は$ p_G(x_c)$ のスコア関数
                    * しかし，この関数がintractableなので($ p_{G}(x_c)$ がネットワークによるノイズ変数の変換によって暗黙的に定義されるので)，REINFORCEを直接適用できない
        * 次に考えつくのが離散サンプリングステップ $ x_d \sim p(x_d | x_c)$ を連続値近似 (Jang et al., 2017; Maddi-son et al., 2017)で置き換えること．reparameterisation trickを使うために．
            * しかし既製品レンダラはブラックボックスであり，back-propが実装されているとは考えないほうが良い
                * しかもレンダラは入力に離散ボクセルしか受け入れないので，離散サンプリング処理は必要
                    * なのでこの方法は使えない

　

* 微分できない問題を解決するため，代理ニューラルレンダラ$ R_{\psi}(\cdot)$ をgenerator訓練のback-propの通り道として導入する
    * ニューラルレンダラ$ \tilde{y} = R_{\psi}(x_c)$ は連続値ボクセル$ x_c$を入力して2D画像$ \tilde{y}$を出力する
* 既製品によるリアルなレンダリングに近づけるため，離散ボクセルでのレンダリング結果との$ l_2$誤差で訓練する

```math

L_2(\phi) = \mathbb{E}_{p_G}(x_d|x_c) \left[ ||R_{\psi}(x_d) - R_d(x_d) ||_2^2 \right]    \tag{5} 

```

* .
    * 離散ボクセルのレンダリング結果が既製品と十分に一致すれば，(4)式で既製品 $ R_d(\cdot) $をニューラルレンダラ$ R_{\phi}(\cdot) $に置き換えられる

```math

\begin{align}
 \nabla_{\theta} L_{gen}(\theta) &= \mathbb{E}_{p_G(x_c)} \left[    \mathbb{E}_{p(x_d    | x_c)} \left[ logD_{\phi}(R_d(x_d)) \right] S_G(x_c) \right]  \\
 &\approx \mathbb{E}_{p_G(x_c)} \left[    \mathbb{E}_{p(x_d    | x_c)} \left[ logD_{\phi}(R_{\psi}(x_d)) \right] S_G(x_c) \right]    \tag{6} 
\end{align}

```

* .
    * .
        * $ S_{G(x_{c})}$ のintractabilityは解決しなければならない
            * ニューラルレンダラは離散・連続ボクセルどちらでも入力できるので，インスタンスレベル勾配$ \nabla_{x}logD_{\phi}(R_{\phi}(x)) $ はxが離散($ x_d $ )でも連続($ x_c $)でも計算できる
                * そこで，「報酬近似」

```math

\mathbb{E}_{p(x_d|x_c)} \left[ logD_{\phi}(R_{\psi}(x_d)) \right]\approx logD_{\phi}(R_{\psi}(x_c))

```

* . 
    * .
        * .
            * .
                * を用いる　
                    * これによりreparameterisation trickで$ S_{G(x_{c})} $を回避する


```math

\begin{align}
\nabla_{\theta} L_{gen}(\theta) &\approx \mathbb{E}_{p_G(\boldsymbol{x}_c)} \left[    \mathbb{E}_{p(\boldsymbol{x}_d    | \boldsymbol{x}_c)} \left[ logD_{\phi}(R_{\psi}(\boldsymbol{x}_d)) \right] S_G(\boldsymbol{x}_c) \right] \\
& \approx \mathbb{E}_{p_G(\boldsymbol{x}_c)} \left[ logD_{\phi}(R_{\psi}(\boldsymbol{x}_c)) \nabla_{\theta}log p_G(\boldsymbol{x}_c) \right] \\
& = \mathbb{E}_{p_(\boldsymbol{z})} \left[ \nabla_{\theta} G_{\theta}(\boldsymbol{z})\nabla_{\boldsymbol{x}_c} logD_{\phi}(R_{\psi}(\boldsymbol{x}_c)) |_{\boldsymbol{x}_c = G_{\theta}(\boldsymbol{z})} \right] \\
& = \nabla_{\theta}\mathbb{E}_{p_G(\boldsymbol{x}_c)} \left[ logD_{\phi}(R_{\psi}(\boldsymbol{x}_c)) \right]:=    \nabla_{\theta} \tilde{L}_{gen}(\theta)    \tag{7} 
\end{align}

```

* .
    * .
        * .
            * .
                * .
                    * .
                        * 報酬近似のクオリティが生成モデルの性能のキーになる
                            * (7)でgradient ascentを使うとgeneratorが，ニューラルレンダラがリアルなレンダリング結果を返すような連続値ボクセル $ \boldsymbol{x}_c$ を生成するようになる


    * l2誤差(5)だけで訓練すると，ニューラルレンダラが任意の画像を出力できるので，良いレンダリング結果を得るためにボクセル$ x_{c}$が必ずしも理想の3D形状と似ていなくてもよくなる
        * 3D 生成モデル$ G_{\theta}(\cdot)$はよく離散ではないボクセルを生成するし，それを既製品レンダラでレンダリングしても訓練画像とは似ていない
            * 新しい誤差discriminator output matching(DOM)でこれを解決する．$ F(\cdot) = logD_{\phi}(\cdot) $として，


```math

L_{DOM}(\psi) = \mathbb{E}_{p_G(x_{c})p(x_{d}|x_{c})}\left[ (F(R_d(x_d)) - F(R_{\psi}(x_{c})))^2 \right] \tag{8} 

```

* .
    * .
        * .
            * .
                * 十分な容量のあるネットワークを使えば，最適なニューラルレンダラは完璧な報酬近似を達成する(つまりそのときのDOM誤差は0になる)


```math

logD_{\phi}(R_{\psi^*}(x_{c}))    =    \mathbb{E}_{p(x_{d}    | x_{c})} \left[ logD_{\phi}(R_{d}(x_{d})) \right] 

```
* .
    * .
        * .
            * .
                * .
                    * この手法は，(既製品レンダラによる)離散レンダリング画像を入力したときにdiscriminatorで定義されるpopulation statisticsを保存するよう，ニューラルレンダラを制約する
                        * なので，discriminatorを欺くためには，generatorは意味のある3D形状と一致する連続値ボクセルを生成しなければならない
                            * (ニューラルレンダラがDOM誤差により既製品レンダラと同じ性質を持つように制約されているので，discriminatorを騙すにはgeneratorは本物っぽい3D形状をつくるしかない．なんとなく，ニューラルレンダラが正しい3D形状の場合だけ正しい画像を出せるか，という部分で制約が足りない気がする・・・)
                            * ニューラルレンダラは２つの誤差の組み合わせで訓練する


```math
\underset{\psi}{min} L_{render}(\psi) := L_2(\psi) + \lambda L_{DOM}(\psi) \tag{9}
```

* 本手法はinverse graphics GAN(IG-GAN)と呼ぶ
    * back-prop時のニューラルレンダラが既製品レンダラをinvertして誤差を伝播させるから
    * 生成モデルの訓練時間を短縮するために，ニューラルレンダラを2D画像の一般データセット(生成モデルが使う画像とは全く違う)で事前訓練できる
    * モデル構造は図２


## 4. 実験

### 4.1. 実験の詳細

#### 既製品レンダラ

* 使用するレンダリングエンジンはOpenGLで作られたPyrender(Matl)を元にしている

#### アーキテクチャ

* generatorは$ 64^3$の解像度を持つ3D畳み込みGAN(Wu et al., 2016) 
    * (スペース一杯に生成すると視点を変えられないので，)rigid boy transformationdで$ 64^3$を$ 128^3$に埋め込む
    * 生成物はRenderNet (Nguyen-Phuoc et al., 2018) でレンダリングする
        * 3Dで2つのresidual blockを使い，2Dで4つのresidual blockを使うように修正した
    * discriminatorはDCGANに従う
        * $ 128^3$解像度を入力する
        * 訓練安定化のため，spectral normalization(Miyato et al., 2018)を使う

#### ハイパーパラメータ

* generator, discriminator, neural renderer を1:1:1の比率で更新する
    * 前者２つは2e-4，rendererは2e-5の学習率
    * Discriminator Output Matching 誤差は$ \lambda = 100$を使った
        * $ \lambda$ の値を変えても訓練は安定しており，膨大なチューニングは不要    
    * 二値化に使う分布$ p(\boldsymbol{x}_d | \boldsymbol{x}_c) $はglobal thresholdingで
        * 一様分布$ \left[ 0, 1 \right] $ から選ばれる
            * (ボクセルごとに閾値を決めないで，ボクセル全体で同じ閾値を使うという意味だろう)


### 4.2. データセット

* ShapeNet(Chang et al., 2015)の3Dモデルから作った合成データと，chanterelle mushrooms(Henzler et al., 2019)の実世界データでモデルを評価する
    * ShapeNetの３つのカテゴリ(椅子，カウチ，バスタブ)から画像を生成する
        * 各カテゴリについて，３つのデータセットを作る
            1. 500:
                * 500の異なる物体から撮られた500枚の画像からなる小さいデータセット
                * それぞれ同じ1つの視点から撮影されている
            2. モデルにつき１つ
                * 3Dデータセットの中の各オブジェクトを固定視点から１度サンプルする
                    * オブジェクトは先に上げた３カテゴリで，バスタブのみ数が少ないので4視点から４枚撮影する
                        * 椅子6777, カウチ3173, バスタブ3424枚の画像になる
            3. 無限
                * 学習中に各エポックで異なる視点からオブジェクトをレンダリングする
                    * 理論的に無限の画像データを供給できる
                    * ShapeNetの立体をレンダリングするため，カメラの下45度かつカメラの左右45度の位置から２つのビームライト光源で立体を照らす
                    * 回転は360度から一様にサンプル，高さは15から60度の間(バスタブは-30から60度)からサンプル
            * LVP
                * limited viewpoint(LVP)設定も考えた
                    * 椅子について，中心からの方位角の回転が60度に限られ，高さが15から60度に限られる
                        * この設定は自然な写真が持つ視点バイアスをシミュレートする(普通はこの角度で撮影される写真が多いという意味)
    * Chanterelle Mushrooms(アンズタケ)
        * 画像が$ 128^2$になるようにクロップとリサイズする
            * 平均intensityを加法的にunifyする（？）
        * 元のオープンソースデータセットでは画像の背景はマスクされている

### 4.3. ベースライン

* 3Dボクセル生成モデルを2Dデータから学習するsota手法と比較する

#### Visual Hull

* Gadelha et al. 2017
    * スムーズ化した物体の影から学習

#### Absorbtion Only

* Henzler et al. 2019
    * ボクセルが占有率のfractionによって光を吸収することを仮定している


#### 2D-DCGAN

* Radford et al. 2016
    * 2D画像のみで，3Dオブジェクトの生成はできない
    * 生成画像の品質の比較に使う
* これらのモデルは著者らが再実装した
    * Gadelha et al. 2017にspectral normalizationを使用してみたところ，より良い性能を出したから
    * Henzler et al.2019のコードが著者らの最初の結果を出したときに利用できなかったから
* 各ベースラインはShapeNetから作った画像(それぞれに必要なレンダリングをした上で)で訓練した

### 4.4 評価手法

* 生成した3Dモデルの評価は，2D画像へとレンダリングしてFrechet Inception Distance(FID)(Heusel et al. 2017)で行う
    * 視覚的品質の評価であり，オブジェクトの見えない部分は考慮しない
        * 本論文のすべてのFIDスコアは一つのInception networkで計算している
            * このネットワークはニューラルレンダラの出力画像を分類するよう訓練した
                * オリジナルのImageNetデータとはドメインが異なり，このようにしたほうが視覚的品質の意味が著者らの意味にマッチする
                * ShapeNetの21カテゴリを95.3%のaccuracyで分類できる

## 5. 結果

### 5.1. 量的評価

![スクリーンショット 2020-04-03 13.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/e230821b-0d43-4641-afc5-169aaeb99c85.png)


* すべてのデータセットで，本手法が他手法を上回った
    * カウチやバスタブ等，多くの凹面を持つデータセットで特にその差が大きい
        * データセットが小さく，視点が少ない場合に本手法のメリットが生きる
     本手法は画像中のライティングやシェーディングの手がかりから有用な情報を取り出せる
    * 無限データセットでは他手法もデータ量が多いので良い結果を示すが，本手法のほうがFIDスコアがずっと良い
        * 2D-DCGANのFIDが小さいのは，生成画像中のリアルでないアーティファクトをInceptionネットワークが簡単に見破ってしまうからだろう


### 5.2. 質的評価


![スクリーンショット 2020-04-03 13.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/36dbe3fd-0c92-b166-63f4-04f8ece16f20.png)
![スクリーンショット 2020-04-03 13.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/c2b3a6c1-7e23-c3b3-940e-4fdd3dea7016.png)
![スクリーンショット 2020-04-03 13.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/a134b6c0-61d4-85a2-3ac5-382784ffffcd.png)


* 図6からベースラインよりも本手法の3D形状が優れていることがわかる
    * 凹面を持つ物体で特に顕著
        * visual hullやabsorptionレンダリングの手法は，物体内部のshadingを手がかりにできないので，バスタブのような物体で失敗する
            * 本手法は露光の差で内部構造がわかるので凹面や空洞を捉える
                * (ベースラインにはvisual hullやabsorptionではなく，もっとスタンダードな3D生成手法を用いるべきだったのでは？，と思ったが，本手法は2D画像だけで訓練していることに注意．3D教師データなしで比較できる相手を選んでいるものと思われる)
* 椅子データセットについては，本手法の平面における利点が明確になる
    * 平らでない表面が誤って生成された場合，discriminatorによって直ちに検知できる
        * 平らでなければ，すぐにレンダリング結果の露光に影響が出るからである
            * 他手法はそのようなことはできないので，結果として平らでない平面を生成してしまう
                * 限られた視点(LVP)で顕著．

#### 自然画像での訓練

* 提案手法は自然画像でも訓練できる
    * 図５のChanterelle mushroomsデータセットでの結果を参照

### 5.3.アブレーションスタディ

#### Discriminator output matching


![スクリーンショット 2020-04-03 13.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/af34f777-3d45-f884-eb70-514534091215.png)
![スクリーンショット 2020-04-03 13.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/b9658b01-6bce-2038-c06c-b554b94db03e.png)



* DOM誤差の効果を確認する
    * 図7は生成結果の連続値ボクセルがランダム閾値の変更によって，OpenGLによりさまざまなレンダリング結果になることを示している 
        * DOM誤差がなければ，ニューラルレンダラはこれらの平均を学習してしまい，詳細を欠いた結果画像になるだろう
            * そうなればgeneratorに伝わる勾配は弱いものになり，3Dオブジェクトの品質が落ちる
    * 表２はDOM誤差なしで訓練したモデルのFIDスコア
        * DOM誤差が高品質な3Dオブジェクト生成に不可欠なことがわかる
        * OpenGLではなくニューラルレンダラでdiscriminatorを訓練した結果も示している
            * こうすればmode collapseを避けられるが，generatorが２値ボクセルを生成しやすくなり，局所解に陥り，生成品質が下がる

#### 事前訓練

![スクリーンショット 2020-04-03 13.56.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296108/2c6b2a0f-decc-4f6a-ffdb-af27b89d6688.png)


* ニューラルレンダラの色々な事前訓練について調査
    * 今までの実験はShapeNetのデータで事前訓練していたが，ここでは椅子データと，ランダムにサンプルされたシンプルなキューブのデータを使う
        * 結果は表３で，ドメインと同じデータで事前訓練するとそのドメインで良い結果を出し，それ以外では性能が落ちる
            * 本手法は3Dデータが入手できないことを仮定しているので，本来は対象ドメインのデータで事前訓練することはできない
                * 椅子の３Dデータから訓練画像を生成するというプロセスができない)