Image 한장을 넣으면 3D모델을 60초만에 높은 퀄리티로 만들어냅니다!
아래 영상을 전체화면으로 보시길 바랍니다. 퀄리티가 엄청납니다!
Diffusion Model(이전글)이 큰 비중으로 들어갑니다. 그리고 NeRF는 약간만 가미된 논문입니다.
최대한 핵심만 간단하게 다뤄보겠습니다.
Related Works
관련 연구 내용을 스킵해도, 전체 내용을 이해하는데 문제는 없습니다.
- 과거에는 Image to 3D pair로 학습해서, 특정 카테고리에 대해서만 3D 모델을 생성하는 연구가 있었습니다.
→ 데이터 문제와 다른 카테고리로 확장성 문제가 있었습니다. - 2D Generative Model (DALL-E, Imagen, Stable Diffusion)과 Vision Language Model (CLIP)을 3D에 대한 Prior(=사전 정보를 가진 모델)로 사용한 DreamFusion(이전글), Magic3D, DreamGaussian(이전글) 연구가 있었습니다.
→ 속도가 느리고(2분 이상), 야누스 문제(=여러 얼굴이 생성)가 발생했고, Oversaturated color(=높은 채도), 결과의 다양성이 부족했고, 3D Consistancy(=다른 카메라 시점에서 동일한 정도)가 적었습니다. - 1~3장 정도의 적은 입력으로 3D Reconstruction하는 연구인 GeoNeRF(이전글), MVS-NeRF(이전글) 등은 Prior(=사전 정보를 가진 모델=여러개의 다른 Scene들)를 기반으로 Generalizable(일반화된) 모델을 학습해서 사용했습니다.
→ 이 모델들도 3D Consistency가 부족했고, prior학습 데이터셋에 한정되는 제약이 있었습니다. - Diffusion Model을 전반적으로 사용한 Genvs, Holodiffusion, Sparsefusion과 같은 연구들이 있습니다.
→ Distillation단계가 추가로 들어가게 됩니다.
Overview
Overview에 전체적인 내용이 다 들어있습니다. 간단하게 파악하실 분은 이것만 읽으셔도 됩니다.
- 첫번째 UNet은 Stable Diffusion에 기반하여, 미리 정의한 카메라 각도에 따른 이미지들을 생성합니다.
- 두번째 UNet은 2D가 아닌 3D convolution기반이며, 64x64x64 cube를 3D occupancy volume로 생성합니다.
- 파란색 화살표는 Global Feature에 해당하며, 입력 이미지에 대한 CLIP(이전글참조) 임베딩값이 Unet의 condition으로 사용됩니다.
- 초록색 화살표는 Local Feature에 해당하며, 카메라 각도에 따른 이미지에 대한 DINOv2 임베딩값이 UNet의 condition으로 사용됩니다.
- Subdivide부분은 64x64x64인 model을 xyz축으로 2배씩 늘여주어, 듬성듬성한(sparse한) 3D volume을 만들어줍니다. - 세번째 UNet도 3D convolution기반이며, nosiy하고 sparse한 3D volume을 128x128x128의 detail한 SDF(Sign Distance Function)과 RGB로 생성해줍니다.
- Marching Cube 알고리즘을 통해 3D mesh와 texture로 변환해주고, 빨간색 화살표를 통해, 특정 카메라 각도에 대한 texture 색상을 입력해주게 됩니다.
전체적인 알고리즘 윤곽을 간단하게 파악되었길 기대하며, 구체적으로 하나씩 설명하겠습니다.
개인적으로 Stable Diffusion을 얕게 알고 있어서, 이번 리뷰에서는 Stable Diffusion개념에 대한 부연 설명이 부족 할 수 있으나, 논문에서 직접적으로 언급된 설명은 가능한 넣었습니다.
Consistent Multi-View Generation
입력 이미지 1장을 UNet에 넣으면, 고정된 6개 카메라 포즈에 대한 이미지들이 tile 형태로 구성되어 이미지 한장이 만들어 지도록 설계됩니다. Tile 이미지 1장으로 설계한 이유는 6장의 이미지가 일관되게 하는 목적이 있습니다. 카메라 포즈는 오른쪽에 표시된데로, elevation angle(상하각도)는 30, -20으로 고정되고 azimuth angle(좌/우각도)는 상대값으로 고정합니다. 카메라 포즈 설계가 중요한데, 카메라 포즈를 절대값으로 할 경우에 ambiguity가 증가되었다고 하며, Zero123 (이전글)논문처럼 elevation angle을 추정하게 설계하면 추가적인 error factor가 발생했다고 합니다.
다음으로 입력 이미지 1장을 condition으로 하여, Stable Diffusion Model을 finetuning하는 과정입니다.
Objaverse dataset의 3D shape를 사용해서 Stable Diffusion 2 v-mode를 finetuning하게 됩니다. 각 shape마다 3개의 랜덤 camera 포즈를 특정 range안에서 샘플링하여 이미지를 Generation하고, 랜덤으로 조명을 적용해주었다고 합니다.
논문에서는 아래 3가지를 주요 설계 포인트로 보고 있습니다.
Local Condition : 입력이미지를 Stable Diffusion UNet (그림에서 왼쪽 아래 SD UNet부분)에 통과시켰을 때 생성되는 self-attention key와 value를 finetuned할 UNet(그림에서 중앙에 있는 UNet)의 attention layer로 더해줍니다.
Global Condition : Stable Diffusion에서 기본적으로 사용되는 text token feature를 대신해서 CLIP embedding값을 사용합니다. 이 임베딩 값은 학습되는 weight들과 곱해짐으로써 object의 semantic(=의미)정보가 전달되게 합니다.
Noise Schedule : Stable Diffusion에서는 기본적으로 scaled-linear noise schedule을 사용하는데, linear noise schedule로 변경이 필수적이었다고 합니다. 설명은 따로 나와있지 않습니다.
초기에는 LoRA를 사용한 cross-attention layer의 key,value값으로 self-attention layer를 fine-tuned해주었고, 최종적으로 conservative learning rate로 전체 UNet을 fine-tuning됩니다.
3D Diffusion with Multi-View Condition
Overview그림에서 2,3번째 Unet에 해당되는 내용입니다.
이전 Generalizable NeRF연구에서는 여러 이미지들간에 정확한 local correspondence가 없으면 3D Reconstruction 퀄리티가 좋지 않았기 때문에, 2D Diffusion network를 사용해, 원하는 카메라 포즈에서 consistency를 가진 이미지들을 생성하는 것이 관건이었습니다. 때문에 본 논문에서는 3D native diffusion network를 사용해서 multi-view이미지를 condition으로 받아 3D shape를 생성하도록 설계됬습니다.
위에서 언급한 Overview 이미지 입니다. 3번째 UNet의 Output을 보면, SDF, Color 각각의 3D volume을 128x128x128로 나타내고 있습니다. volume은 grid 형태이며, SDF volume은 grid 각 cell의 중심에서 가장 가까운 shape surface까지의 거리값으로 구성되어 있습니다. Color volume는 grid 각 cell의 중심에서 가장 가까운 surface의 color값으로 구성됩니다. Multi-view로 생성된 이미지들을 3D로 unprojection하여 3D colored point cloud를 형성하고 그 값들로 color volume을 구성합니다. (이렇게 만들어진 SDF volume는 discrete한 occupancy volume으로 만들 수 있는데, 단순히 일정 threshold이상일 경우 1, 아닐경우 0으로 구성됩니다.)
2,3번째 UNet으로 분리한 이유는 high resolution 3D grid를 한번에 만들기엔 시간적, 메모리적으로 문제가 됬기 때문입니다. LAS-Diffusion방식을 따라, 큰 형상에 대해선 2번째 UNet(3D Occupancy Diffusion)을 사용하여 low-resolution(64x64x64)으로 3D occupancy volume을 생성하고, 디테일에 대해서는 3번째 UNet(3D Sparse Diffusion)을 사용하여 high-resolution(128x128x128)으로 occupied area안에서 SDF와 color volume을 생성했습니다. 2번째 UNet은 일반적인 3D convolution을 사용했지만, 3번째 UNet은 3D sparse convolution(=값이 존재하는 voxel에 대해서 convolution을 진행하는 방법)을 사용하게 됩니다.
UNet(Occupancy UNet) 에 대해 조금 더 깊게 살펴보겠습니다.
conventional한 3D diffusion network는 3D data 수의 제약으로 인해 학습이 어렵지만, 여기에서는 다양한 시점의 image를 생성해서 사용하기 때문에 학습에 용이 합니다. pretrained된 DINOv2모델을 통해, 생성된 multi-view를 입력으로 local image feature들을 추출하고, 카메라 포즈를 기반으로 3D voxel과 mapping되는 image feature들을 합쳐서 2D patch feature로 만든 후에 shared-weight MLP를 통과시켜 64x64x64 에 넣습니다. UNet은 5가지 level인 64^3, 32^3, 16^3, 8^3, 4^3으로 구성됩니다. 일반적인 2D UNet과 같이 Convolution을 통해 해상도가 작어졌다가 Transposed Convolution을 통해 해상도가 높아지는 것과 동일한 형태입니다.
위 그림에서 (Sparse)라는 글자가 보이는데, 괄호를 빼면 3번째 UNet(3D Sparse Diffusion)에 해당합니다. 한개 그림으로 2개 Network를 나타내려한 것 같습니다. 물론 128^3 그림도 추가되어야 합니다. 혼동을 주는 그림이라 부연설명을 해봤습니다.
Overview에선 입력 이미지를 CLIP으로 임베딩해서 Global feature로 사용하는데, 여기에선 supplementary를 참조하라고만 되어 있습니다. 글 작성 기준(23.12.08) supplementary는 제외한 버전만이 공개(23.11.14)되었습니다.
Training & Inference
각 UNet은 DDPM의 denoising loss(이전글)를 사용합니다.
0~1구간에 Unifrom하게 획득하는 step t와, Gaussian분포를 가진 ϵ의 기대값에 대한 Loss입니다. x0는 목표로 하는 확률 분포를 의미하며 xt는 step t에서 noise가 들어간 volume, c는 condition값입니다. 각 단계에서 예측값과 x0의 차이로 Loss가 설계가 되어집니다.
A100 GPU 8장을 사용해서 2,3번째 UNet 학습이 각각 10일씩 소요되었다고 합니다. 1번째 UNet fine-tuning 속도에 대해선 언급되어 있지 않습니다.
Texture Refinement
3D Color volume보다 높은 해상도로 mult-view이미지들이 주어지면, 생성되는 mesh의 geometry를 고정하고 TensoRF로 color를 optimization합니다. 이를 통해 geometry에 color를 적용 할 수 있게 됩니다. TensoRF(이전글)에선 Tensor Decomposition기법을 사용해서 color와 density를 적은 메모리량과 빠른 속도로 학습이 가능했었습니다.
개인적인 생각으로 density와 color 부분을 분리 할 수 있어서 사용된 것 같습니다. 여기서는 mult-view 이미지와 TensoRF로 랜더링한 이미지간의 L2 loss를 사용하였습니다. 각도마다 다른 색상으로 랜더링되기 때문에, mesh surface의 normal(수직방향)에서 랜더링 했을 때의 색상을 mesh의 color로 사용했습니다.
Evaluation
Image-to-3D에 대한 평가입니다.
집에 있을 만한 사물 1030종을 스캔한 GSO(Google Scaned Object)를 기반으로 평가를 진행했습니다. F-Score는 예측값과 정답간의 Geometric 유사도를 평가하였고, Clip-Sim은 24개의 서로 다른 카메라 포즈에서 랜더링하고, CLIP모델에 넣었을 때 나오는 feature값의 유사도를 평가하였습니다. User-Pref는 53명의 사람이 무작위로 샘플링해서 2385번 퀄리티관점의 선호도를 평가했습니다. 모든 지표에서 가장 높은 성능을 보이는 것을 볼 수 있습니다. One-2-3-45와 Shap-E보다는 느립니다. User-Pref가 특히 높은데, 제가 봐도 퀄리티 관점에선 최고라 생각됩니다.
다음으로 Text-to-3D에 대한 평가입니다.
DreamFusion에서 50개의 text prompt로 평가했습니다. 여기서도 높은 성능을 보이고 있습니다.
Ablation Studies
Color값은 제외하고 Occupancy volume에 대한 3D IoU로 평가하였습니다.
a) Multi-view condition을 뺄 경우 성능 하락이 큽니다. 그만큼 중요한 요소로 작용한다고 볼 수 있습니다.
b) Multi-view condition을 local이 아닌 global로 사용 할 경우도 성능 하락이 큽니다. a-b의 경우 local feature로 사용하지 않기 때문에 perturbation(=작은 노이즈) 적용이 고려되지 않습니다. (global일 경우엔 쓸 것 같은데, N/A인 이유를 정확히 모르겠네요.)
c) global CLIP feature를 없애면 약간의 성능 하락이 발생합니다.
d) training시에 최초에 입력되는 1장의 image를 diffusion모델로 만들경우 성능하락이 발생한다고 합니다.
e) perturbation을 적용하지 않을 경우 약간이 하락이 발생합니다.
f) 논문에서 제시하고 있는 최종 모델입니다.
Closing..
NeRF에서 해결 못하는 부분을 Diffusion Model로 해결하는 시도들을 보면서, Diffusion Model을 잘 알아야겠다고 생각했는데, 이 논문을 보면서 필수로 알아야겠다는 생각이 더 들었습니다. 올해 2023년 Diffusion Model의 consistency와 속도 부분에서 엄청나게 증가하는 것을 보면서, 몇 년 후에는 Novel View Synthesis도 Diffusion Model이 대체하는 것 아닌가 싶기도 합니다. 한장의 이미지로 3D Mesh를 만드는 연구가 생각보다 빠르게 발전하네요. 주변 실생활 물건을 3D 컨텐츠로 만드는게 자연스러워지는 세상이 곧 오게 될 것 같습니다.
'NeRF' 카테고리의 다른 글
[논문 리뷰] Zero-1-to-3 (ICCV 2023) : Image to 3D (0) | 2023.12.25 |
---|---|
[논문 리뷰] Score Jacobian Chaining (CVPR 2023) : Text to 3D (0) | 2023.12.24 |
[논문 리뷰] Tri-MipRF (ICCV 2023) : 속도/퀄리티/메모리 개선 (0) | 2023.08.16 |
[논문 리뷰] GeoNeRF (CVPR 2022) : 적은 입력 + 일반화 모델 (0) | 2023.08.11 |
[데이터셋] NeRF Dataset 정리 (1) | 2023.08.05 |
댓글