2024. 9. 21. 17:52ㆍDevelopers 공간 [SOTA]
- Paper : https://arxiv.org/pdf/2305.02463
- Authors
- OpenAI, arxiv’23
- Main Idea
- 기존과 다르게 NeRF와 Textured Mesh 두가지 모두로 render되는 implicit function 파라미터를 생성합니다.
- 기존 Point-E 모델에 비해 빠르게 Converge하면서도 좋은 퀄리티의 모델링이 가능합니다.
- Tasks : Text-To-3D Object Generation
- Results : Rendered From RGBA data
<구성>
0. Before Start...
a. INR(Implicit Neural Representations)
b. 3D Representation with SDF
c. Point-E
1. Problem
2. Approach
a. Encoder
b. Diffusion Model
3. Results
a. Encoder Evaluation
b. Point-E와 비교
c. 다른 3D Generative 방법과 비교
글효과 분류1 : 논문 내 참조 및 인용
글효과 분류2 : 폴더/파일
글효과 분류3 : 용어설명
글효과 분류4 : 글 내 참조
글효과 분류5 : 글 내 참조2
글효과 분류6 : 글 내 참조3
0. Before Start...
Shap-E는 Diffusers에 소개되어있어 다양한 결과를 확인하기 쉽습니다.
** https://huggingface.co/docs/diffusers/using-diffusers/shap-e
Shap-E에서는 SDF라는 INR을 활용하므로 이에 관련된 용어에 관해 설명하고 본 논문으로 넘어가고자 합니다.
a. INR(Implicit Neural Representations)
최근 3D Asset을 encoding하는데 있어 INR(Implicit Neural Representations)이 가장 많이 사용됩니다.
INR은 3D 좌표 정보와 해당 location의 color, density와 같은 정보를 mapping하는 방식을 활용하는데, 고정된 grid의 정보가 아니라 임의의 input point 등에 의해 요청되기 때문에 Resolution-independent합니다.
본 논문에서는 아래와 같은 두가지 INR을 이야기합니다.
1. NeRF(Neural Radiance Field)
** Nerf: Representing scenes as neural radiance fields for view synthesis (arxiv’20)
NeRF는 3D scene을 표현하기 위해 (Coordinates, Viewing Direction)($x,y,z,\theta, \phi$)과 (RGB, Density)($RGB\sigma$)를 mapping하는 function network를 활용합니다.
$$F_\theta:(x,d)\rightarrow (c,\sigma)$$
즉, camera ray $\boldsymbol{r}(t)$를 통한 임의의 view point를 통해 color $\boldsymbol{c}$, density $\boldsymbol{\sigma}$와 같은 정보를 얻어낼 수 있습니다.
$$\boldsymbol{r}(t)=\boldsymbol{o}+t\boldsymbol{d}=\boldsymbol{x}\rightarrow \boldsymbol{\sigma}(x), \boldsymbol{c}(x,d)$$
이를 활용해 해당 camera ray에서 예상되는 RGB color는 아래와 같고, 이를 활용해 Volume Rendering이 가능합니다.
** $T_i$는 ray의 transmittance로, 본 논문에서는 opacity나 alpha를 보완하기 위해 사용합니다.
$$\begin{aligned}
\hat{C}(r)&=\int^\infty_0 T(t)\boldsymbol{\sigma}(r(t))\boldsymbol{c}(r(t),d)dt & where\ T(t)=exp(-\int^t_0 \boldsymbol{\sigma}(r(s))ds)\\
&=\sum^N_{i=1} T_i(1-exp(-\boldsymbol{\sigma}(r(t_i))\delta_i))\boldsymbol{c}(r(t_i),d) & where\ T_i=exp(-\sum^{i-1}_{j=1}\boldsymbol{\sigma}(r(t_j))\delta_j)\\
\end{aligned}$$
2. STF(SDF and Texture Fields)
STF는 textured 3D mesh를 표현하기 위해 (Coordinates)와 (Texture Color, Signed Distance, Vertex Offset)을 mapping하는 function을 활용합니다.
** mesh에 대해 알고 싶으시면 아래 더보기를 참조하세요
----------------------------------------------------------------
<mesh란?>
mesh란 3D 데이터를 아래의 두가지로 구성하는 것입니다.
- face : 표면을 의미하며, 3개(triangle) 혹은 4개(quad)의 vertices로 구성되어있습니다.
- vertex : 꼭지점을 의미하며, 3D 포인트를 의미합니다.
이런 mesh를 구성하는 data structure는 아래로 구성되어있습니다.
- face의 list : face는 vertex의 index로 이루어져 있습니다.
- vertices의 list : vertex는 3D point의 좌표로 이루어져 있습니다. 이 vertex들은 여러개의 face에 의해 공유되기 위한 index를 가지고 있습니다.
----------------------------------------------------------------
STF는 SDF(Signed Distance Function)와 Textured Field로 이루어져있는데, SDF는 기존의 classic한 방법으로 x 좌표를 넣었을 때 가장 가까운 surface까지의 거리인 d로 표현합니다. 이렇게 sign(부호) 값을 가지는 distance의 field를 만들어내기 때문에 SDF(Signed Distance Field)라고 부르기도 합니다.
$$f(x)=\left\{\begin{matrix}
\text{inside of the shape} & d>0\\
\text{boundary of the shape} & d=0 \\
\text{outside of the shape}& d<0
\end{matrix}\right.$$
이렇게 얻어진 SDF는 이후에 marching cubes나 marching tetrahedra를 활용해 mesh를 구현할 수 있습니다.
아래에서 SDF를 활용한 사례를 살펴보면서 더 자세히 알아볼 수 있습니다.
b. 3D Representation with SDF
위 말인 즉슨, SDF만 얻어내면 mesh를 얻어낼 수 있다는 것인데, 이 SDF 값을 네트워크를 활용해 예측하고 mesh를 구성하는 방식 두가지를 살펴보겠습니다.
1. DMTet
** Deep Marching Tetrahedra: a hybrid representation for high-resolution 3d shape synthesis (arxiv’21)
본 논문은 아래와 같은 task를 진행하기 위해 제안된 논문입니다.
- coarse voxel inputs → 3D mesh representation synthesis
- point cloud → 3D mesh representation synthesis
최근에 NIR 기법들은 SDF(Signed Distance Field)나 OF(Occupancy Field)를 통해 shape를 표현했는데, 이들은 복잡한 geometry나 topology를 표현할 수 있다는 장점이 있습니다.
** Geometry(기하학) : 공간에 존재하는 점(points), 선(lines), 면(surfaces), 각도(angles), 입체(solids) 등의 특성(properties), 치수(measurement), 서로 간의 관계(relations) 등 우리에게 익숙한 개념을 다루는 수학
** Topology(위상수학) : tearing(찢기)이나 gluing(붙이기)가 아닌, stretching(늘이기), crumpling(구기기), bending(구부리기) 등 연속적인 변형(continuous transformation)이 가해져도 보존되는 공간적 특성을 다루는 수학으로, 결국 어떻게 연결되었는지를 중요하게 다루는 방법입니다.
하지만 이와 같은 Implicit 방법들은 보통 타겟의 surface에 대한 explicit한 supervision을 직접적으로 활용할 수 없어 학습에 제한이 있습니다.
** Explicit Representation : parameter 자체의 관계성을 해석 할 수 없는 경우이며, 예를 들어 Voxel grid나 Poin set같이 Discrete한 Spatial 구조에서 빛의 distribution을 나타내면 공간상 위치에 저장할 수 있습니다. Mesh는 Explicit한 Represenation입니다.
** Implicit Representation : parameter 자체의 관계성을 해석 할 수 없는 경우이며, 예를 들어 NeRF와 같이 쿼리를 통해 얻어낸 값은 명시적으로 공간상에 위치시킬 수는 없습니다.
따라서 이를 해결하기 위해 MC(Marching Cubes)나 MT(Marching Tetrahedra)를 활용하곤 하는데, 본 논문에서는 미분가능하면서도 implicit + explicit한 3D representation을 새로 제안합니다.
즉, Deformable Tetrahedral grid를 활용하는 implicit function을 활용해 surface를 표현함으로써 랜덤성을 가진 topology를 표현하면서도, 이를 MT를 활용해 explicit한 mesh로 표현이 가능하므로 위 두가지를 섬렵한 것입니다.
** tetrahedron(plural : tetrahedra) : 사면체로, 4개의 vertices와 4개의 faces로 이루어져있습니다. 그리고 이런 사면체로 이루어진 grid를 tetrahedral grid라고 합니다.
** Marching Tetrahedra에 대해 궁금하시면 아래 더보기를 참조하세요.
------------------------------------------------------------------
<Marching Tetrahedra>
3차원 공간의 정보를 활용해 3D mesh를 생성하는 알고리즘에는 대표적으로 Marching Square, Marching Cube, Marching Tetrahedra 등이 있습니다.
이들은 surface를 어떤 도형을 활용해 표현할 것인지에 따라 나뉘는데 가장 기본적인 Marching Cube를 먼저 살펴보겠습니다.
1. MC(Marching Cube)
MC는 3차원 공간 내 각 점에 대한 밀도 값들로 3D mesh를 생성하는 알고리즘입니다. 아래와 같은 순서로 진행됩니다.
- Step1. 먼저 Cube Grid에 어떤 특정한 3D Object가 존재한다고 생각하겠습니다.
- Step2. Cube Grid에 존재하는 각각의 Cube는 당연히 8개의 vertex로 구성될텐데, 이 Cube의 어떤 vertex를 선택하는지에 따라 미리정의된 여러가지의 surface polygon을 만들어 낼 수 있습니다. 이를 surface typology(표면유형)이라고 하겠습니다. 이 중에 어떤 surface polygon을 선택할지 정합니다.
** 아래 그림은 가능한 $2^{8}$가지의 surface polygon 중 가능한 15개의 unique한 case입니다.
- Step3. 이렇게 Polygon을 선택하고 나면 해당 Polygon의 vertex가 가지는 값들을 기존의 scalar field의 값의 interpolation등을 활용해 결정합니다.
- Step4. 모든 Cube Grid의 polygon들이 결정되면 3D mesh로 만들어낼 수 있습니다.
2. MT(Marching Tetrahedra)
위에서 2D Polygon을 활용한 것을, 3D Tetrahedron으로 대체한 것입니다.
- Step1. 먼저 Tetrahedral Grid에 어떤 특정한 3D Object가 존재한다고 생각하겠습니다.
- Step2. Tentrahedral Grid에 존재하는 각각의 tetrahedron은 당연히 4개의 vertex로 구성될텐데, 이 tetrahedron의 어떤 vertex를 선택하는지에 따라 미리정의된 여러가지 surface typology를 만들어 낼 수 있습니다. 이 중에 어떤 surface typology를 선택할지 정합니다.
** 아래 그림은 $2^{4}$가지의 surface typology 중 rotation symmetry를 고려한 3개의 unique한 case입니다.
- Step3. 이렇게 선택된 해당 iso-surface의 vertex가 가지는 값들을 기존의 scalar field의 값의 interpolation등을 활용해 결정합니다.
** iso-surface(등가면) : 3차원의 점들이 모여 만든 연속된 표면 - Step4. 모든 tetrahedron의 isosurface들이 결정되면 3D mesh로 만들어낼 수 있습니다.
------------------------------------------------------------------
또한 추가적으로 Subdividing Tetrahedra 방법을 활용해 computation 또한 향상시키기도 합니다.
그럼 이와 같이 본 논문에서 제안한 3D reprentation이 mesh가 되는 과정을 아래와 같이 네 단계로 나누어 설명하겠습니다.
- Step1. Deformable Tetrahedral Grid
- Step2. Selective Volume Subdivision
- Step3. Marching Tetrahedra
- Step4. Surface Subdivision
Step1. Deformable Tetrahedral Grid
먼저 "Mesh로 deformable" 할 수 있는 Tetrahedral Grid를, SDF를 활용해 정의합니다.
사실 이방법은 DefTet이라는 논문에서 이미 소개되었는데, DefTet에서는 mesh를 표현하기 위해 tetrahedral grid를 활용해 표현한 뒤에, 각 tetrahedron의 SDF가 아닌 Occupancy를 학습했었습니다.
** DefTet에 대해 궁금하시면 아래 더보기를 참조하세요
------------------------------------------------------------------
<DefTet>
** Learning deformable tetrahedral meshes for 3d reconstruction (NIPS’20)
먼저 용어에 대해 살펴보겠습니다.
- Tetrahedron : $T_k=[v_{a_k},v_{b_k},v_{c_k},v_{d_k}]$, $k\in [1,\dots,K]$
- tetrahedron이란 사면체로, 4개의 vertices와 4개의 faces로 이루어져있습니다. 이렇게 tetrahedron으로 구성된 grid를 tetrahedral grid라고 합니다.
- 위 식과 같이 vertex의 집합으로 표현할 수 있습니다.
- Vertex : $v_i=[x_i,y_i,z_i]^T$, $i\in [1,\dots,N]$
- 3차원 좌표의 집합으로 표현할 수 있습니다.
- Face : $f_s=[v_{a_s},v_{b_s},v_{c_s}]$, $s\in [1,\dots,F]$
- vertex의 집합으로 표현할 수 있습니다.
- Occupancy of tetrahedron : $O_k=O_k(e(T_k))$
- 식에 e라는 function이 있는 이유는, occupancy는 tetrahedron의 centroid에 대해 정의할 수도 있는데, 이 centroid가 tetrahedron 안으로 정의할지 밖으로 정의할지에 따라 다르게 정의될 수 있기 때문에 들어가게 되었습니다.
그렇 어떻게 Tetrahedral Mesh를 만들어낼까요?
Surface Mesh를 얻어내는 과정은 아래와 같은 순서로 진행됩니다.
- Step1. QuarTet을 활용해 initial tetrahedralization을 위 그림 가운데와 같이 정의합니다.
** [QuarTet] Isosurface stuffing improved: acute lattices and feature matching (SIGGRAPH’13) - Step2. 아래 식과 같이 이미지 혹은 point cloud인 Input Observation $\boldsymbol{I}$가 있을 때, DefTet을 활용해 각 vertex에 대한 상대적인 offset과 각 tetrahedron의 occupancy을 얻어내고, 해당 vertex를 업데이트를 해줍니다.
$$\begin{aligned}
h(\boldsymbol{v},\boldsymbol{I};\theta)&=\{\Delta x_i, \Delta y_i, \Delta z_i\}^N_{i=1},\{O_k\}^K_{k=1}\\
v'_i&=[x_i+\Delta x_i, y_i+\Delta y_i, z_i+\Delta z_i]^T
\end{aligned}$$ - Step3. Occupancy가 서로 다른 두개의 tetrahedron이 있다면 그 face는 object의 surface라고 볼 수 있습니다.
Loss는 아래와 같습니다.
$$L_{all}(\theta)=\lambda_{recon}L_{recon}+\lambda_{vol}L_{vol}+\lambda_{lap}L_{lap}+\lambda_{sm}L_{sm}+\lambda_{del}L_{del}+\lambda_{amips}L_{amips}$$
- $L_{recon}$ : Reconstruction Loss는 surface face를 GT와 비슷하게 align하기 위해 사용합니다. 어떤 것을 reconstruction하고 싶은지에 따라 다른 loss를 가집니다.
- $L_{vol}$ : regularization인 EquiVolume loss로, 각각의 tetrahedron의 volume차이를 penalty 주기 위해 사용합니다.
- $L_{lap}$ : regularization인 Laplacian loss로, 근접한 vertices간의 상대적인 position의 변화를 penalty주기 위해 사용합니다.
- $L_{sm}$ : regularization인 Smoothness loss로, 근접한 face간의 normal차이를 penalty 주기 위해 사용합니다.
- $L_{del}$ : regularization인 Delta loss로, vertice들의 큰 deformation을 penalty주기 위해 사용합니다.
- $L_{amips}$ : regularization인 AMIPS loss로, 각 tetrahedron의 distortion을 penalty주기 위해 사용합니다.
------------------------------------------------------------------
하지만 DMTet은 각 tetrahedron의 vertex의 SDF값을 활용합니다. Occupancy 대신 SDF를 활용하면 surface를 좀더 유연하게 표현할 수 있다고 합니다.
또한 Tetrahedron 내부의 point 값들에 대한 SDF값도 interpolation을 통해 알아낼 수 있는데, 이때는 barycentric interpolation을 활용하면 됩니다.
** Biarycentric Interpolation에 대해 궁금하시면 아래 더보기를 참조하세요
------------------------------------------------------------------
<Barycentric Interpolation>
아래 그림과 같이 Barycentric Coordinates라는 삼각형 내부의 점을 표현하는 질량 중심 좌표계를 활용해, 각 vertex들의 질량중심으로 interpolation하는 방법입니다.
** Bary- 는 "weight", centric은 "중심"을 의미합니다.
------------------------------------------------------------------
실제 구현시에는 먼저 각각의 Tetralhedral Grid의 vertex인 $v$에 대해 feature vector인 $F_{vol}(v, x)$을 아래 두 Input의 Trilinear Interpolation을 통해 얻어냅니다.
- Point Cloud : PCD(Point Cloud Data) Encoder를 통해 좌표 $x$에 대한 3D feature의 volume인 $F_{vol}(x)$을 얻어냅니다. 본 논문에서는 PVCNN을 활용합니다.
** Point-voxel cnn for efficient 3d deep learning (NIPS’19) - Voxel : 해당 voxel들의 surface에서 point를 sample해 사용합니다.
그리고 위 값을 활용해 해당 vertex $v$에 대한 initial SDF $s(v)$와 feature $f(v)$를 FC Network를 통해 얻어냅니다.
** feature $f(v)$는 다음 Step에서 surface를 refine하는데 활용할 예정입니다.
$$s(v)=MLP(F_{vol}(v,x),v)$$
Step2. Selective Volume Subdivision
이제 SDF가 있으니 다음단계로 넘어가도 되지만, 위와 같이 표현된 값들의 memory나 computation 효율성을 위해 선택적으로 각각의 tetrahedron을 subdivide합니다.
** 아래 그림에는 subdivision 뿐아니라 surface refinement 과정(c)도 포함되어 있는데 이는 이후에 설명하겠습니다.
즉, 먼저 기존에 Tetrahedra 집합 $T$가 있다고 할때, 실제 3D Object의 Surface에 포함되는 tetrahedra인 $T_{surf}$를 SDF를 활용해 찾아냅니다.
** tetrahedron의 4개의 vertex가 서로다른 SDF를 가지고 있다면 내부에 surface가 포함되었다는 뜻이므로, SDF를 활용해 $T_{surf}$를 골라낼 수 있습니다.
그리고 해당 $T_{surf}$에 대해서는 다음 그림과 같이 mid point들을 잡고, 기존 SDF를 기반으로 새로운 vertex의 SDF값을 구해냄으로써 subdivision을 진행합니다.
하지만 본 논문에서 실제 구현시에는 위 volume subdivision을 하기 전과 후에 Surface Refinement라는 것을 합니다. 즉, 위 전체 과정에 대한 그림에서 볼 수 있듯이, 해당 초기화된 Tetrahedral grid의 vertex를 그대로 사용하는 것이 아니라, 조금씩 vertex의 위치를 변형해준 뒤 활용하겠다는 것입니다.
방법으로는, 해당 tetrahedra들 $T_{surf}$의 edge $E_{surf}$와 vertex $V_{surf}$를 활용해 Graph를 만들어내고, 이 Graph를 GCN을 통과시켜 position offset $\Delta v_i$와 SDF residual 값인 $\Delta s(v_i)$을 얻어냅니다.
** 아래 식에서 $N_{surf}$는 총 vertex의 개수를 의미하며, $\bar{f}(v_i)$는 해당 vertex의 update된 feature를 의미합니다.
** [GCN] Fast interactive object annotation with curve-gcn (CVPR’19)
$$\begin{aligned}
{\color{blue}G}&=(V_{surf}, E_{surf})\\
{\color{blue}f'_{v_i}}&=concat(v_i, s(v_i),F_{vol}(v_i,x),f(v_i))\\
({\color{red}\Delta v_i}, {\color{red}\Delta s(v_i)}, \bar{f}(v_i))_{i=1,\dots N_{surf}} &={\color{red}GCN}(({\color{blue}f'_{v_i}})_{i=1,\dots N_{surf}}, {\color{blue}G})
\end{aligned}$$
그리고 이렇게 얻어낸 ${\color{red}\Delta v_i}, {\color{red}\Delta s(v_i)}$를 활용해 기존의 vertex의 위치와 해당 vertex의 SDF를 업데이트해 refine을 해주는 것이 Surface Refinement입니다.
이렇게 volume subdivision의 앞과 뒤에 refine을 해주면 아래와 같은 두가지 장점이 있습니다.
- SDF의 sign 값을 flip하기도 하면서 local typology를 refine할 수 있습니다.
- vertice를 움직이면서 local geometry를 향상시킬 수 있습니다.
결과적으로 (surface refinement → volume subdivision → surface refinement)를 모두 진행하고 나면 모든 과정에서 subdivided되지 않은 tetrahedra들이 생기는데 이런 tetrahedera들을 drop해줌으로써 memory와 compuation을 향상시킬 수도 있습니다.
Step3. Marching Tetrahedra
이제 SDF로 표현된 implicit representation을 MT의 과정을 활용해 어떻게 triangular mesh를 표현합니다.
MT과정에서 당연한 과정은 회색으로 두고, 본 논문에서 특별히 다른 부분만 설명해 보이겠습니다.
- Step1. 먼저 tetrahedral Grid에 어떤 특정한 3D Object가 존재한다고 생각하겠습니다.
- Step2. 각각의 tetrahedron은 당연히 4개의 vertex로 구성될텐데, 이 tetrahedron의 어떤 vertex를 선택하는지에 따라 미리정의된 여러가지 surface typology를 만들어 낼 수 있습니다.
- Step3. 이렇게 선택된 해당 iso-surface의 vertex가 가지는 값들을 기존의 scalar field의 값의 interpolation등을 활용해 결정합니다.
- 이 때 vertex의 위치는 linear interpolation하는 중간의 zero crossing에서 찾아낼 수 있습니다.
** Zero Crossing : 함수 그래프에서 축의 절편으로 표현되는 수학 함수의 부호가 변경되는 지점으로, 여기서는 SDF값이 바뀌는 지점 - 단, $s(v_a)=s(v_b)$가 되는 singularity 지점이 발생하지 않는 것이 중요한데, 본 논문에서는 학습 중에 절대 발생하지 않는다고 합니다.
- 이 때 vertex의 위치는 linear interpolation하는 중간의 zero crossing에서 찾아낼 수 있습니다.
Step4. Surface Subdivision
이렇게 만들어진 surface mesh는 마지막으로 미분가능한 Surface Subdivision module을 통해 parameterized surface로 변환해 visual quality와 shape를 향상합니다.
** Surface Subdivision에 대해 궁금하시면 아래 더보기를 참조하세요.
------------------------------------------------------------------
<Surface Subdivision이란>
Surface Subdivision란, polygon mesh에서 시작해 새로운 face와 vertices를 반복적으로 만들어냄으로써 표면을 refine하는 과정입니다.
Surface Subdivision에는 다양한 많은 알고리즘이 존재하는데 아래와 같이 분류할 수 있습니다.
- Approximating 방법 vs Interpolating 방법
- Face Splitting 방법 vs Vertex Splitting 방법
이중에 Approximating 방법과 Face Splitting방법을 활용하는 것이 Loop Subdivision입니다.
------------------------------------------------------------------
본 논문에서는 Loop Subdivision Method를 활용했는데, subdivision의 고정된 파라미터를 활용하지 않고, learnable parameter를 활용해 이를 진행했다고 합니다.
** Smooth subdivision surfaces based on triangles (’87)
이를 실제 구현하기 위해 본 논문에서는 mesh의 vertex인 $v’_i$와 생성된 surface의 smoothness를 control할 수 있는 파라미터 $\alpha_i$를 예측하도록 GCN을 학습하고, 이 값들을 활용해 position을 update해가며 Loop Subdivision을 진행함으로써 mesh의 quantization error를 줄입니다.
이제 설명하지 않은 Discriminator와 Loss관련해서는 아래와 같습니다.
- 1. Discriminator
- SDF에서 Discriminator를 활용하기도 했는데, target mesh를 활용해 얻은 SDF $S_{real}$와 우리가 예측한 SDF $S_{pred}$간의 차이를 구분해낼 수 있도록 합니다.
- 이 때, local detail을 잘 잡을 수 있는 DECOR-GAN의 3D CNN을 활용했습니다.
** Decor-gan: 3d shape detailization by conditional refinement (CVPR’21)
- 2. Loss
- 아래와 같은 Loss들을 hyperparameter를 이용해 합쳐 사용하게 됩니다.
- a. surface Alignment loss : GT의 surface와의 alignment를 향상시키기 위해 사용합니다.
- 먼저 target mesh에서 point set인 $P_{gt}$를 얻어내고, 예측한 mesh에서 $P_{pred}$를 얻어내 L2 Chamfer Distance와 Normal consistency loss를 얻어냅니다.
** 아래에서 $\hat{q}$는 p에 상응하는 point를 의미하며, $\vec{n}_p, \vec{n}_{\hat{q}}$는 normal direction을 의미합니다.
$$\begin{aligned}
L_{cd}&=\sum_{p\in P_{pred}}\underset{q\in P_{gt}}{min}||p-q||_2+\sum_{q\in P_{gt}}\underset{p\in P_{pred}}{min}||q-p||_2\\
L_{normal}&=\sum_{p\in P_{pred}}(1-|\vec{n}_p\cdot \vec{n}_{\hat{q}}|)
\end{aligned}$$
- 먼저 target mesh에서 point set인 $P_{gt}$를 얻어내고, 예측한 mesh에서 $P_{pred}$를 얻어내 L2 Chamfer Distance와 Normal consistency loss를 얻어냅니다.
- b. Adversarial Loss : 앞서 소개한 discriminator를 활용해 생성된 shape의 realism을 향상하기 위해 하기 논문에서 제안된 adversarial loss를 활용했습니다.
** Least squares generative adversarial networks (ICCV’17)
$$\begin{aligned}
L_D&=\frac{1}{2}[(D(M_{gt})-1)^2+D(M_{pred})^2]\\
L_G&=\frac{1}{2}[(D(M_{pred})-1)^2]
\end{aligned}$$ - c. Regularizations : 위 loss들은 surface에서 동작하기 때문에 iso-surface에 가까운 vertice들은 gradient를 잘 받지만, inside/outside에 대한 loss가 부족하게 됩니다. 따라서 이런 부분을 덜기 위해 SDF나 vertex를 제약하는 SDF loss를 사용합니다.
$$L_{SDF}=\sum_{v_i\in V_T}|s(v_i)-SDF(v_i, M_{gt})|^2$$
2. Get3D (Generative models for 3D shapes that directly outputs Explicit Textured 3D meshes with complex topology)
** Get3d: A generative model of high quality 3d textured shapes learned from images (arxiv’22)
Get3D는 unconditional하게 geometric 정보 뿐 아니라 texture detail와 함께 mesh topology를 생성하기 위한 모델입니다.
Get3D는 아래 그림과 같이 geometry branch인 DMTet과 texture branch로 이루어져 있습니다.
특히 texture branch는 DMTet과 분리된 모델을 만들어, 각각의 surface point p에 대한 RGB의 color $\boldsymbol{c}$를 예측하게 해 texture정보를 담습니다.
추가적으로, 이렇게 표현된 triangle mesh는 미분가능한 Rasterization 라이브러리인 NVdiff-rast를 활용해 2D 이미지로 rendering하고, 2D Discriminator를 활용해 학습에 활용하기도 합니다.
** NVdiff-rast : Modular primitives for high-performance differentiable rendering (arxiv’20)
c. Point-E
3D Asset을 표현하기 위해 본 논문 이전에도 아래와 같이 다양한 방법이 시도되었습니다.
** Zero-shot text-guided object generation with dream fields (arxiv'21)
** Clip-mesh: Generating textured meshes from text using pretrained image-text models (arxiv'22)
** Point-e: A system for generating 3d point clouds from complex prompts (arxiv'22)
** Dreamfusion: Text-to-3d using 2d diffusion (arxiv'22)
이 중 Shap-E에서 baseline으로 삼은 Point-E에 대해 간단히 살펴보려고 합니다.
기존의 Text-to-3D Object Generation task의 경우 많은 시간이 걸리는 경우가 많습니다. 따라서, Point-E는 single GPU에서 1~2분만에 생성이 가능한 모델을 제안합니다.
Point-E는 단순히 Generative 모델을 활용해 Text를 condition으로 point cloud를 생성하는 것이 아니라, 아래와 같은 4개의 Step으로 나누어 생성을 진행합니다.
- Step1. T2I DM을 활용해 synthetic view를 text caption을 condition으로 먼저 생성합니다.
- Step2. 위 생성된 view 이미지를 condition으로 하는 다른 DM을 활용해 coarse한 3D Point Cloud(1024개의 points)를 생성합니다.
- Step3. 위 생성된 low-resolution point cloud를 condition으로 하는 다른 DM을 활용해 fine한 3D Point Cloud(4096개의 points)를 생성합니다.
- Step4. 위 생성된 Point cloud를 textured mesh로 변환하고, rendering합니다.
각자의 Step에 대해 조금더 자세히 살펴보겠습니다.
1. Text-Conditional Synthetic View 생성
text를 활용해 3D모델을 redering하기 위해 GLIDE모델을 fine-tune해 활용했으며, 3D생성임을 명시하게 위해 special token을 제공했다고 합니다.
** GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models (arxiv'21)
2. Low-resolution Point Cloud 생성
위에서 만든 synthetic view를 활용해 RGB를 포함한 point cloud를 생성하기 위해, PVD 모델을 extend해 $K\times 6(x,y,z,R,G,B)$의 tensor를 output으로 얻습니다.
** [PVD] 3D Shape Generation and Completion through Point-Voxel Diffusion (ICCV'21)
diffusion모델은 transformer-based 구조를 활용하며, 아래와 같은 Input들을 활용해 $(K+257)\times D$의 input을 받아 $\epsilon, \Sigma$를 예측합니다.
- Additional Image : pretrained ViT-L/14 CLIP 모델을 활용하고, linear projection을 통해 $256\times D’ \rightarrow 256\times D$로 만들어준 후 input context에 prepend해줍니다.
- Timestep $t$ : 작은 MLP를 통해 D-dim 벡터를 input context에 prepend해줍니다.
- synthetic point cloud로부터 생성된 Noisy Point Cloud $x_t$ : $K\times 6$의 랜덤 노이즈를 MLP를 통해 $K\times 6 \rightarrow K\times D$로 dimension을 변환해준 후 처리합니다.
- Positional Encoding : 사용하지 않으므로 input에 대해 permutation-invariant하게 동작하도록 합니다.
3. High-resolution Point Cloud 생성
hierarchical하게 1K의 pointcloud를 4K로 upsample하기 위해 base 모델과 같은 구조를 활용하지만, base 모델보다는 조금 작은 구조의 모델을 활용합니다.
low-resolution point cloud를 condition하기 위한 extra conditioning token을 활용하며, 별도의 linear layer를 통해 embedding되어 input에 prepend됩니다.
4. Meshes로 변환
위에서 생성된 point cloud는 textured mesh로 변환되고, Blender를 통해 rendering됩니다.
하지만 textured mesh로 변환할 때, point cloud가 cracks, outliers, noises 등이 포함되어 있어 어려움이 있어 Point-E는 SDF를 예측하기 위한 regression-based model을 활용하고 이후에 marching cubes를 적용했습니다.
또한 각각의 vertex에 대해 color를 제공하기 위해 해당 vertex의 가장 가까운 point의 color를 활용하기도 했습니다.
1. Problem
implicit한 INR은 flexible 하고 expressive하지만, 데이터에서 이런 샘플을 얻는 과정이 굉장히 costly합니다.
게다가, 많은 parameter를 가지고 있어 downstream 모델을 학습할 때 문제가 될 수 있습니다. 따라서 이를 해결하기 위해 아래와 같은 방법을 다양하게 시도해왔습니다.
- implicit decoder를 가진 auto-encoder구조를 활용
- meta-learning을 활용해 INR 데이터를 만들고, DM을 학습
본 논문에서는 위 접근들을 scale-up & combine해 Shap-E라는 모델을 제안합니다.
즉, Shap-E는 3D implicit 표현을 생성하기 위한 conditional generative model로, 기존 transformer-based의 모델 기반의 auto-encoder를 scale-up한 뒤 학습해 INR parameter를 만들고,
** 이 때 INR은 이전과 다르게 NeRF와 mesh 둘을 동시에 갖습니다.
** Transformers as meta-learners for implicit neural representations (arxiv’22)
이후에 해당 INR parameter를 latent로 갖는 diffusion모델을 학습합니다.
이 모델은 결과적으로 기존 Point-E모델과 같은 (모델구조, 데이터, conditioning mechanism)을 활용하더라도 빠르게 converge 하며 comparable하거나 superior하기도한 성능을 냅니다.
2. Approach
학습은 encoder와 diffusion model순으로 학습되므로, 이 순서대로 설명하겠습니다.
a. Encoder
implicit function기능을 할 파라미터를 제공하는 encoder를 먼저 학습합니다.
즉, 이 encoder는 3D asset dense한 explicit 표현의 latent representation을 만들어내고, 이 latent representation은 linear projection을 통해 MLP의 weight가 됩니다.
그리고 이 MLP, 즉 implicit function은 implicit한 표현을 만들어내는데 사용됩니다.
이 encoder는 NeRF에 대한 학습과 STF에 대한 학습 2-stage로 학습이 됩니다.
Step1. NeRF rendering objective
먼저, NeRF기반으로 학습하는 것이 더 stable하다고 하기 때문에 4096개의 ray를 랜덤하게 샘플한 뒤, 아래와 같은 L1 loss를 학습한다고 합니다.
** $C(r)$은 실제 true color이며, $T(r)$은 실제 transmittance(투과율)입니다.
** $\hat{C}_c$는 coarse network, $\hat{C}_f$는 fine network를 활용한 결과입니다.
** 뒤에서 보일 PSNR(Peak SNR) metric에서 L1 loss로 학습한 것이 L2 loss보다 나았다고 합니다.
$$\begin{aligned}
L_{RGB}&=E_{r\in R}[||\hat{C}_c(r)-C(r)||_1 + ||\hat{C}_f(r)-C(r)||_1]\\
L_{T}&=E_{r\in R}[||\hat{T}_c(r)-T(r)||_1 + ||\hat{T}_f(r)-T(r)||_1]\\
L_{NeRF}&=L_{RGB}+L_{T}
\end{aligned}$$
Step2. additional SDF & texture color
다음으로 STF(SDF와 texture color)를 얻을 수 있는 head를 붙여 학습하는데, 이 head를 랜덤초기화하고 학습하는 것은 unstable하기 때문에 먼저 distillation을 통해 학습을 진행합니다.
distillation을 위한 target과 loss는 아래와 같습니다.
- SDF distillation target $SDF_{regression}$: Point-e SDF regression모델의 SDF
- RGB distillation target $RGB_{NN}$: 해당 asset의 RGB point cloud 중 가장 가까운 것의 color
$$L_{distill}=L_{NeRF}+E[||SDF_\theta(x)-SDF_{regression}(x)||_1+||RGB_\theta(x)-RGB_{NN}(x)||_1]$$
그다음 fine-tune을 진행하는데, 아래와 같은 loss로 진행합니다. 이때는 NeRF와 STF 모두 함께 학습합니다.
** 이때는 L2 loss가 더 stable했다고 합니다.
** s는 이미지의 resolution이며 N는 이미지의 개수입니다.
** $Render(Mesh_i)$는 생성된 mesh를 differentiable render를 통해 이미지로 만드는 과정입니다.
** $Image_i$는 타겟을 RGBA 이미지로 rendering한 결과입니다.
$$\begin{aligned}
L_{STF}&=\frac{1}{N\cdot s^2}\sum^N_{i=1}||Render(Mesh_i)-Image_i||^2_2\\
L_{FT}&=L_{NeRF}+L_{STF}
\end{aligned}$$
이렇게 만들어진 STF head로 SDF를 얻으면 Marching Cube를 활용해 triangle mesh를 construct하며, texture color를 얻어 PyTorch3D를 통해 textured mesh를 얻습니다.
여담으로, 학습을 할때는 데이터를 아래와 같이 다루었습니다.
- point cloudsms 16K의 point를 활용합니다.
- point cloud를 계산할 때 각 object에 대해 60개의 view를 rendering합니다.
- 데이터의 Lighting Configuration은 diffuse할 수 있으며, ambient shading이 가능한 옵션으로 고정해 진행했습니다.
이렇게 함으로써 differentiable renderer를 사용하기 위한 lightning setup을 쉽게 할 수 있습니다.
** Lighting Configuration을 이해하기 위한 Ray Tracing에 대해 궁금하시면 아래 더보기를 참조하세요
---------------------------------------------------------
<Ray Tracing>
Graphics의 기본인 3차원 object rendering은 3차원 공간의 object를 특정 viewpoint에서 바라본 2D이미지를 생성하는 것을 의미합니다.
Ray Tracing은 이런 Rendering할 때 object를 픽셀 순서대로 파악하는 image-order rendering방법으로, 다양한 viewing ray를 교차시켜 해당 픽셀 위치의 object를 찾고 shading을 통해 픽셀의 색상을 결정하게 됩니다.
즉,
- Step1. Ray Generation : 이미지 평면과 view point를 활용해 광선을 만들어내고
- Step2. Ray Intersection : 해당 viewing ray와 교차하는 object 중에 가장 가까운 object를 찾아내고
- Step3. Shading : 교차된 결과에 따라 픽셀의 색상을 계산합니다.
이 때 Step3에서는 픽셀의 표면을 알아내고 나서 다양한 변수(빛의 방향 $l$, 뷰디렉션 $v$, 표면 법선 $n$)를 가진 Shading Model에 의해 픽셀값을 계산하는데, 다양한 모델이 있습니다.
- Lambert Shading
- Blinn-Phong Shading
- Ambient Shading
이 중 Ambient Shading은 검은 그림자가 생기는 것을 피하기 위해 Shading Model에 상수를 추가해 물체의 geometry보다 빛을 맞은 물체 자체에만 의존하도록 하는 방법입니다.
** h는 (그림추가) v와 l사이를 이등분하는 벡터입니다.
** I는 빛의 세기, $k_a$는 ambient coefficient, $k_d$는 diffuse coefficient ,$k_s$는 specular coefficient입니다.
$$L=k_aI_a+k_dImax(0,{\color{red}n}\cdot {\color{red}l})+k_sImax(0,{\color{red}n}\cdot h)^n$$
그럼 여기서 등장하는 diffuse는 확산이라는 뜻으로 표면에 의해 빛이 확산하는 것을 의미합니다. 예를 들어 아래와 같은 용어들이 있습니다.
- diffuse coefficient: 확산 계수로, 표면의 색깔이나 상태를 의미합니다.
- diffuse reflection : 입사된 빛이 표면이 거칠어서 여러방향으로 불규칙하게 난반사 되는 것을 의미합니다. 따라서 rendering시에는 모두 계산하기는 어려우니 단순한 근사모델을 활용하곤 합니다.
---------------------------------------------------------
b. Diffusion Model
이제 Image와 Text Description을 condition으로 latent space 상에서 생성을 진행할 diffusion모델을 학습합니다.
이는 아래와 같은 순서로 설명해보겠습니다.
- Diffusion 모델 구조
- Conditioning 구조
- Training 방법
1. Diffusion 모델 구조
Point-E의 구조와 같은 transformer-based diffusion구조를 활용하지만, input point cloud 대신 앞서 encoding한 latent vector를 활용합니다.
이 때 latent는 1024x1024의 sequence이며, transformer에 넣을 때는 1024개 token의 sequence 형태로 들어갑니다.
2. Conditioning 구조
Conditioning은 Point-E와 같은 전략을 사용합니다.
Image-conditional인 경우, pretrained ViT-L/14 CLIP 모델을 활용하고, linear projection을 통해 $256\times D’ \rightarrow 256\times D$로 만들어준 후 input context에 prepend해줍니다.
또한 Text-conditional인 경우, pretrained ViT-L/14 CLIP 모델을 활용하고, linear projection을 통해 $1\times D$로 만들어준 후 input context에 prepend해줍니다.
3. Training 방법
학습시에 CFG를 위해 0.1의 확률로 랜덤하게 condition을 $\varnothing$으로 만들어줍니다.
또한 Point-E와 다르게, Dall-E2와 같이 $\epsilon-prediction$이 아닌 $x-prediction$으로 학습해줍니다.
3. Results
그럼 이제 Shap-E를 평가한 결과를 살펴보겠습니다.
a. Encoder Evaluation
Encoder의 학습 과정에서 NeRF학습과 STF학습의 단계 별 성능을 평가하기 위해 아래와 같은 두개의 render-based metric을 소개합니다.
- PSNR(peak SNR) : reconstruct된 이미지와 GT-rendered 이미지사이의 SNR을 비교하는 것입니다.
- Point-E CLIP R-Precision : 3D assets의 의미론적 관련 디테일을 파악할 수 있는 encoder의 능력을 확인하기 위해, 해당 encoder의 output을 Point-E로 mesh를 만들고 CLIP R-precision을 측정한 결과입니다.
** CLIP R-Precision에 대해 궁금하시면 아래 더보기를 참조하세요
----------------------------------------------------------------------
<Precision-Recall>
특정 결과에 대해 나타내기 위한 Metric으로 많이 사용되는 Precision과 Recall에 대해 이해하기 위해 아래의 Confusion Matrix(오차 행렬)을 먼저 이해해보겠습니다.
1. Predicted : 예측 값
- Positive : 정답일 것이라 예상
- Negative : 오답일 것이라 예상
2. Actual : 실제 값
- Positive : 실제 정답
- Negative : 실제 오답
3. 결과
- TP(True Positive) : 정답이라 예상해서, 맞음.
- FP(False Positive, False Alarm) : 정답이라 예상했지만, 틀림.
- FN (False Negative, Missed Detection) : 오답이라 예상했지만, 틀림.
- TN(True Negative) : 오답이라 예상해서, 맞음.
이를 활용해 다양한 Metric을 얻어낼 수 있는데 아래와 같습니다.
1. Accuracy : 전체중에 True인것, 즉 (정답==정답), (오답==오답) 의 확률
$$\frac{TP+TN}{TP+FP+FN+TN}$$
2. Precision(정밀도) :정답이라고 한 것 중에 실제 정답인 것의 확률
$$\frac{TP}{TP+FP}$$
3. Recall(재현율), TPR(True Positive Rate) : 실제 정답인 것중에 정답이라고 해서 맞춘 비율.
$$\frac{TP}{TP+FN}$$
** FPR(False Positive Rate) : 실제 오답인 것 중에 정답이라고 해서 틀린 비율.
$$\frac{FP}{FP+TN}$$
4. F1score : Precision과 Recall의 기하평균
$$2\times \frac{Precision\times Recall}{Precision+Recall}$$
이때 아래 그림중 왼쪽과 같이 TPR와 FPR 간의 tradeoff를 통해 모델을 분석하기 위한 RoC(Receiver Operating Characteristic) Curve와 아래 그림중 오른쪽과 같이 Precision과 Recall 간의 tradeoff를 통해 모델을 분석하기 위한 PR(Precision-Recall) Curve가 있습니다.
또한 추가적으로 아래와 같은 표현법을 사용하기도 합니다.
- AP50 : Average Precision at 50이라는 뜻으로, Detection문제에서 IoU가 50%이상일 때를 정답으로 Precision의 평균을 측정한 결과입니다.
- Precision@K : “top-K 결과 중에 정답이 얼마나 포함될지”인 precision
- Recall@K : “정답 중에 top-K 결과가 얼마나 포함될지”인 recall
- R-precision : “top-R 결과 중에 정답 R개 중 얼마나 포함될지”인 precision
그럼 이제 CLIP R-Precision는 Image-Text Similarity score를 측정하기 위해 CLIP을 활용하고, R-Precision을 측정합니다.
----------------------------------------------------------------------
b. Point-E와 비교
Point-E와 Shap-E는 같은 Diffusion 모델 & 데이터셋 & Conditioning을 가지고 있기 때문에, 둘을 비교했습니다.
결과적으로 Text-Conditional에서는 Point-E보다 CLIP R-Precision, CLIP Score모두 좋았으며, 정성적으로 보면 서로 다른 생성을 하는 것을 볼 수 있었다고 합니다.
하지만 Image-conditional에서는 Point-E보다 성능이 조금 안좋았다고 하고, 이에 대한 case 분석을 자세히 진행했습니다.
c. 다른 3D Generative 방법과 비교
마지막으로 다른 3D Generative 테크닉들과의 CLIP R-Precision도 비교해보았습니다.
결과적으로 Shap-E가 생성 속도가 빠른데 비해서 성능이 좋았다고 합니다.
기하학과 위상수학
https://jjuke-brain.tistory.com/entry/Geometry%EC%99%80-Topology
Marching Tetrahedra설명 :
https://xoft.tistory.com/47
Ray Tracing
https://velog.io/@tjswodud/%EA%B7%B8%EB%9E%98%ED%94%BD%EC%8A%A4-4.-%EB%A0%88%EC%9D%B4%ED%8A%B8%EB%A0%88%EC%9D%B4%EC%8B%B1
Surface Subdivision
https://www.cs.cmu.edu/afs/cs/academic/class/15462-s14/www/lec_slides/Subdivision.pdf