論文まとめ：Anything-3D: Towards Single-view Anything Reconstruction in the Wild

# はじめに
arXivにあがっている以下の論文
[1] Q. Shen, et. al. Anything-3D: Towards Single-view Anything Reconstruction in the Wild
のまとめ。

submit先は不明。学生の論文？

github
https://github.com/Anything-of-anything/Anything-3D

# 概要
- 画像１枚から物体の3Dモデルを復元するしくみで、Anything-3Dという
- 単眼のみならず、あらゆる物体に対してin the wildで、教師なしに学習・推論できるのが特徴
- stable diffusion, BLIP, SAM, Point-E等既存の学習モデルをうまく組み合わせることで、Nerf空間に3Dモデルを形成させる

以下の図は入力画像に対して Anything-3Dを用いた3Dデータ作成例。

![スクリーンショット 2024-07-14 4.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c7180302-ab55-e6c0-16ab-ac07d1545f08.png)
左、入力画像と、それをsegmentatinoしたもの。
その右、promptと作成された3Dモデル。

# モデル
## 全体像
以下はモデルの全体図。
![スクリーンショット 2024-07-14 4.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a8af4e28-0c4b-2a48-95d8-748bd14e28c5.png)

## 入力画像に対するセグメント
入力画像に対してSAM（[2]）というセグメンテーション・モデルで物体をセグメントする。
![スクリーンショット 2024-07-14 4.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/56e5866b-ecde-2337-6219-ab7fe68691a9.png)

正確には、このSAMモデルは内部でpromptを作成し、それに相当する物体をsegmentするらしい（？）。生成したsegmentationのmaskで画像を切り取る

```math
\begin{eqnarray}
M &=& {\rm SAM} (I, p), \\
I' &=& {\rm Affine}(M \odot I;b),
\end{eqnarray}
```

## 切り取った物体画像からのprompt生成
BLIPというimg2txtモデルでpromptを生成する。
![スクリーンショット 2024-07-14 4.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f9ddd450-7c02-c634-ec73-e66188dc631c.png)

```math
T = {\rm BLIP} (I'),
```
ただし、BLIPから出力されるpromptは物体の正確な情報ではない等あるため、以下の２点を用いる。
１）promptは入力部分のみ用いる
２）textual inversion([3])という仕組みを用いる

### textual inversion
学習済みdiffusion modelを用いて、promptを最適化する。
具体的には
$e_0 = {\rm EMBEDDING}(T)$：tokenをembeddingしたvector
$\epsilon \sim \mathcal{N}(0, {\bf I})$：正規分布からサンプリングしたノイズ
$I_t = \sqrt{\bar{\alpha}}I' + \sqrt{1 - \bar{\alpha}} {\bf \epsilon}$：ノイズを加えた画像

として、

```math
e^* = {\rm arg}\min_{e} \| \epsilon_{\phi}(I_t, e) - {\bf \epsilon} \|_2^2
```

として最適化する。つまり、promptが適切であれば、学習済みのdiffusion modelが須くnoiseを取り除けるだろうということで、noiseを最も取り除けるようなpromptを求める。

## 粗い3Dモデルの作成
学習済みPoint-Eモデルを用いて粗い3Dモデルを作成し、これをdiffusion modelで用いる。
![スクリーンショット 2024-07-14 5.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3b48e356-a845-3495-d3a8-2508579978c2.png)

作成した粗い3Dモデルに対し、camera pose $\pi$ でdepth mapを求めたものを diffusion modelの制約として用いる。

```math
P = \mathcal{P}({\rm Point-E}(I'), \pi),
```


## Diffusion modelによる詳細な2D imageの作成
学習済みのdiffusion model(stable diffusion model）を用いて詳細な2D imageを生成する。

![スクリーンショット 2024-07-14 5.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c0e30a13-3e22-dbab-be51-aba82f3e3642.png)

入力部分に最適化したpromptを用い、constrainとしてdepth mapをprojectした画像を用いる。depth mapはdepth encoder $E_\rho (\cdot)$ を用いてencodeする。具体的にはCo3D([5])を用いる。

## Nerfの更新
カメラposeが π のときに、Nerfでπとしてprojectした画像と、stable diffusionから生成した画像とは一致するはずなので、その差が最小化するようにNerfを更新する。

![スクリーンショット 2024-07-14 6.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/17417a2c-566d-65bd-0e18-17599a4b3c32.png)

$\theta$：Nerfのパラメータ
$R_\theta (\pi)$ カメラポーズπでNerfをレンダリングした画像

```math
\nabla_\Theta {\rm L}_{SDS} (\theta, x = R_\theta (\pi )) = \mathbb{E}_{t, p} \left[ \tilde{w}(t) (\epsilon_\phi (x_t, E_\rho (P), e^*) - {\bf \epsilon}) \frac{\partial x}{\partial \theta} \right] 
```
式の導出は拙著こちら
https://qiita.com/masataka46/items/ccfeb89ed20a074dd0ab
の Virtual Multi-view Supervision など参照。

# 実験と結果
## データセット
- SA-1B dataset
in-the-wildの11 millionの画像からなる。この中からセレクトして用いた。

## 定性的評価
以下が一例。
![スクリーンショット 2024-07-14 6.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b7183275-2a89-20fb-96b7-b6febe7a3eee.png)

# 読んだ感想
- 学習済みモデルを上手く組み合わせるという発想は実用的である
- ただ新規性の乏しさ、定量的評価がない点、など考慮すると、学生論文の可能性が高い

# reference
[2] lexander Kirillov, Eric Mintun, Nikhila Ravi, Hanzi Mao, Chloe Rolland, Laura Gustafson, Tete Xiao, Spencer White- head, Alexander C. Berg, Wan-Yen Lo, Piotr Dolla ́r, and Ross Girshick. Segment anything. arXiv:2304.02643, 2023.

[3] Rinon Gal, Yuval Alaluf, Yuval Atzmon, Or Patash- nik, Amit H Bermano, Gal Chechik, and Daniel Cohen- Or. An image is worth one word: Personalizing text-to- image generation using textual inversion. arXiv preprint arXiv:2208.01618, 2022.

[4] Alex Nichol, Heewoo Jun, Prafulla Dhariwal, Pamela Mishkin, and Mark Chen. Point-e: A system for generat- ing 3d point clouds from complex prompts. arXiv preprint arXiv:2212.08751, 2022.

[5] Jeremy Reizenstein, Roman Shapovalov, Philipp Henzler, Luca Sbordone, Patrick Labatut, and David Novotny. Com- mon objects in 3d: Large-scale learning and evaluation of real-life 3d category reconstruction. In Proceedings of the IEEE/CVF International Conference on Computer Vision, pages 10901–10911, 2021.