論文まとめ：Farm3D: Learning Articulated 3D Animals by Distilling 2D Diffusion

# はじめに
3DIMPVT 2024より、以下のまとめ
[1] Tomas Jakab, et. al. Farm3D: Learning Articulated 3D Animals by Distilling 2D Diffusion


paper
https://arxiv.org/pdf/2304.10535

project page
https://farm3d.github.io

評価に関するコードのgithub
https://github.com/tomasjakab/animodel

# 概要
- 牛や馬など動物のあるカテゴリーに特化して、その種の3D形状を復元するしくみ
- １枚の画像を入力として、そこから3D形状、albedo、illumination、viewpointを推定する
- 学習データとして用いるのは、off-the-shelfなstable diffusionモデルから生成したもの、のみ
- 入力画像に対し、学習対象のencoderでshape, appearance, viewpoint(R, t), lightを推定し、それをrenderingロジックで再構築させ、reconstruction lossを求める

以下の図のでは、本論文のしくみで可能なことが明示されている。

図の左側では左側のinput画像１枚からその右側、shapeやそれにtextureを貼った3Dモデルが構築できている。さらにその右（Novel view）は、この3Dモデルを回転させたもの。

![スクリーンショット 2024-07-08 3.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/62f8d1a7-274d-6621-95eb-e746599b32d6.png)

図の右側では推定した3Dモデルを変化させることにより可能となる応用例を表している。

一番上の例では、Input画像の馬に対し、その右、3D Assetと書かれた3D model が作成される。それに光源を変化させたものが右のRelitである。さらに、本3D model はposeも持っているので、その右のようなAnimatedのようにposeを変化させることが可能となる。

した2つの例は、Stable Diffusionに対して特定のpromptを与えて画像を生成し、その生成画像に対して3D modelを推定している。


# モデル
## 全体像
以下がモデルの全体構造。
![スクリーンショット 2024-07-08 3.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/ea16d18c-ccf6-9683-5aab-33aa4613135f.png)

## Generating Trainng Images
まず左の緑部分。
![スクリーンショット 2024-07-08 4.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4075eaf5-e29c-8430-d7a3-cae20b55155e.png)
Stable Diffusionでtraining dataを生成させる。牛のカテゴリーなら、"cow"などのpromptを与える。"cow, walking away from the camera" などのpromptにすると、異なった向きの動物が得られる。

このStable Diffusion自体をカテゴリーで再学習させるか否かは明言されてないが、モデルの横に鍵マークがついてるので学習させないという意味か？

以下は生成したデータの例。
![スクリーンショット 2024-07-08 6.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/5708cb2f-c456-9b61-1661-363dc980e922.png)


## Articulated Category Model
次に真ん中の青い部分。
![スクリーンショット 2024-07-08 4.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/fbbeb919-4aeb-38bb-0c02-ef7da945523e.png)
生成した入力画像をencoder $f_{\theta}$ に入れて、shape, appearance, viewpoint, lightを推定させる

入力画像：$I \in \mathbb{R}^{3 \times H \times W}$ として
```math
(s, a, v, l) = f_\theta (I)
```
とそれぞれを推定させる。

## Virtual Multi-view Supervision
次に右上のこの部分。ここが１番の特色か。
![スクリーンショット 2024-07-08 4.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/4a3c85fb-5ad2-f96f-c502-f78503087902.png)
まず、encoderから出力されたviewpointとlightを変えた形でrendeingさせる。
```math
\tilde{I} = R(s,a,\tilde{v}, \tilde{l}) = R \circ {\rm subst}_{\tilde{v}, \tilde{l}} \circ f_\theta (I).
```
<font color="blue">以下の解釈に自信がないので、おかしいと思う方はコメントください。</font>この向きと明かりを変えた3D modelをレンダリングしたものは、noiseを加えるとStable Diffusionで再構築できるはず。なぜなら、もともと同じStable Diffusionで生成されたものを変化させてるだけなので。ただし、その間 encoderを通っているので、encoderが正確に3D形状を復元できなければ、Stable Diffusionは再構築できないだろう。つまり、Stable Diffusionが再構築できるようにencoderを学習させれば、encoderは3D形状を正確に推定できるような学習をするだろう。

```math
\nabla_\theta \mathcal{L}_{\rm SDS} (\theta | \tilde{v}, \tilde{l}, I, y) = \mathbb{E}_{t, \epsilon} \left[ w_t \cdot (\hat{\epsilon_t} (z_t | y) - \epsilon_t) \frac{\partial z_t}{\partial \theta} \right], \tag{2}
```

ここで
$z_t$：stable diffusionのdiffusion部分の t ステップの latent。
$\epsilon_t$：同 t ステップのノイズ
この（２）式は諸々省略されているが、以下で導かれるか？

```math
\begin{eqnarray}
\nabla_\theta \mathcal{L}_{\rm SDS} (\theta | \tilde{v}, \tilde{l}, I, y) &=& \nabla_\theta \mathbb{E}_{t, \epsilon} \left[ w_t \cdot \| \hat{\epsilon_t} (z_t | y) - \epsilon_t \|^2_2 \right],  \tag{2.1}\\

&=&  \mathbb{E}_{t, \epsilon} \left[ w_t \cdot \frac{\partial}{\partial \hat{\epsilon_t}} \| \hat{\epsilon_t} (z_t | y) - \epsilon_t \|^2_2 \frac{\partial \hat{\epsilon_t}}{\partial z_t} \frac{\partial z_t}{\partial \theta} \right],    \tag{2.2}\\

&=&  \mathbb{E}_{t, \epsilon} \left[ w_t \cdot (\hat{\epsilon_t} (z_t | y) - \epsilon_t)  \frac{\partial \hat{\epsilon_t}}{\partial z_t} \frac{\partial z_t}{\partial \theta} \right],    \tag{2.3}\\

&=&  \mathbb{E}_{t, \epsilon} \left[ w_t \cdot (\hat{\epsilon_t} (z_t | y) - \epsilon_t) \frac{\partial z_t}{\partial \theta} \right],    \tag{2.4}\\

&=& \mathbb{E}_{t, \epsilon} \left[ w_t \cdot (\hat{\epsilon_t} (z_t | y) - \epsilon_t) \frac{\partial z_t}{\partial \theta} \right], \tag{2}
\end{eqnarray}
```
(2.2)式から(2.3)式において、2を $w_t$ に入れた。また(2.3)式から(2.4)式において、diffusionのUnetは学習させないので、$\frac{\partial \hat{\epsilon_t}}{\partial z_t}$ は $w_t$ に吸収。

## Reconstruction losses
最後は右下のlossの部分。
![スクリーンショット 2024-07-08 5.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a6580039-475f-17f8-5f21-cd41c837fb65.png)

左側はinput imageと再構築したimageとをmask（PointRendというモデルで作成するらしい）に通したものをVit-DINOというモデルで特徴量をとり、その特徴量でのlossを計算する。

右側ではmask同士でlossをとるのか？

それとは別に（？）、正則化項があり、SDFのEikonal lossを用いる。以下は論文中のlossの式だが、右辺シグマ内の第１項が特徴量ベースとmaskのlossか（？）。第２項が正則化項。

```math
\mathcal{L}(\theta | \mathcal{D}) = \frac{1}{|\mathcal{D}|} \sum_{(I,M) \in \mathcal{D}} \mathcal{L}(f_\theta (I) | I, M) + \mathcal{R}(f_\theta (I)),
```

# 定性的評価
## 3D再構築の結果
以下は動物ごとの推論結果。かなり正確かつリアルな3Dが生成されている。
![スクリーンショット 2024-07-08 6.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b5a7fff2-85d4-aa80-8f1b-5097d3623e68.png)

## 他のモデルとの比較
以下はMagicPonyモデルとの比較。
![スクリーンショット 2024-07-08 6.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d5ea2283-4c30-0ebc-2553-6251878fb5c9.png)
MagicPony*はrealなimageを学習データに混ぜたもの。realなimageにはocculusionや体が切れているものが多いため、結果がnoisyになるとの見解。本論文のしくみではSDからの合成画像しかつかわないが、このようなocculusionや体が切れる画像はほとんど生成されないらしい。

# 定量的評価
２種類の定量的評価を用いている。
1. keypoint transfer・・・Pascal datasetのようなkeypointがついてる画像を入力し、正解との差を求める
2. Chamfer distance・・・3D articulated animal datasetを用いて、3D shapeの正確さを求める

結果は以下。下２行が本論文の手法であり、一番下はSDS lossを除いたもの。
![スクリーンショット 2024-07-08 6.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e7ca343f-6700-be6b-2842-0da5cbc2977f.png)
他のSOTAモデルと比肩し得る、という感じか。

この定量的評価のみを見ればSDS lossの効果は微妙〜。