안녕하세요. 오늘 포스팅할 논문은 DreamFusion으로 google에서 ICRA'23에 publish한 Text-to-3D 논문입니다.
최근 multi modal generative model의 발전이 눈부시고 여러 글로벌 기업에서 하루가 멀다하고 이와 관련된 product를 출시하고 있습니다. 그로인해 3D genertive에 관한 논문들도 최근 많이 나오고 있습니다.
DreamField를 시작으로 오늘 포스팅할 DreamFusion, Magic3D, SweetDreamer 등 많은 논문들이 나오고 있습니다.
Intro
DreamFusion은 Diffusion model과 Nerf-like model을 잘 짬뽕하고 그럴듯한 loss function을 만들어내서 iteration을 돌린다라고 한 줄로 설명할 수 있습니다. 그렇다면 먼저 Diffusion model과 NeRF에 대해 대략적인 이해가 필요합니다. 그건 아래 참고바랍니다.
최근 Diffusion model은 굉장한 fidelity를 보이며 다양한 모델에 적용되고 있습니다. 본 논문에서는 이를 3D로 transfer하는 방법을 제안합니다. 이를 위해서는 굉장히 많은 3D data가 필요한데 사실상 많은 3D data asset을 얻기란 현실적으로 쉽지 않습니다. 그렇기 때문에 기존의 text-to-image diffusion model에 NeRF-like model을 얹어서 3D를 생성할 수 있도록, 즉 3D data 없이 3D asset을 generation하는 것을 제시하고 있습니다.
기존의 방법론들은( DreamField이전 ) explicit하게 3D object를 생성해내는 논문들이었습니다. 하지만 최근 논문들은 NeRF와 Clip 혹은 Diffusion model들을 통해 implicit하게 생성해내는 흐름입니다.
Overview
위의 그림은 전체적인 본 논문의 전체적인 아키텍쳐입니다. 대략적인 흐름먼저 설명하는 것이 이해하는데 더 편한 것 같아 먼저 overview를 말씀드리면, google에서 발표한 논문인지라 diffusion model은 Imagen을 사용합니다. Imagen은 freeze하여 사용합니다. Intro에 언급했다시피 NeRF-like model을 사용합니다. 본 눈문에서는 역시나 google에서 publish한 mip-nerf 360이라는 nerf 모델을 사용하였습니다. (아마 jax으로 framework를 통일하려는 목적같습니다.)
우선 NeRF-like model의 weight 를 random initialization합니다.
#training
iteration:
1. random camera position에서 NeRF-like model을 사용하여 rendering
2. 1번의 rendering값과 text-embedding을 통해 나온 diffusion 값을 SDS loss 적용 (loss는 추후서술)
3. NeRF weight update
#inference(test)
train된 NeRF모델로 특정 camera position, direction에서 image 생성
NeRF rendering
overview의 NeRF부분을 보면 기존의 NeRF와 다른 argument가 추가됩니다. 우선 shading부분에서 light가 추가되었습니다. 기존의 NeRF는 ray direction에 따라 sampling 된 3D points의 radiance color로 2D의 color를 계산했다면, 여기서는 추가 조명에 따라 달리보이는 surface color로 계산을 합니다.
위의 그림은 NeRF와 DreamFusion에 쓰이는 NeRF-like model과의 차이점입니다.
NeRF에서는 sampling된 point들이 MLP을 태우고 나서 나오는 color와 density값을 volume rendering을 통해 최종 Color를 구하고 이를 GT와 mse loss계열을 통해서 학습하게 됩니다. DreamFusion에서는 density를 input position에 대해 normal vector n을 계산합니다. 그리고 추가적으로 light의 임의 좌표가 추가 되어 특정 operator를 통해 color값이 update되어 Volume rendering으로 들어가게됩니다.
SDS Loss
이 부분이 본 논문의 contribution이고 제일 많이 강조한 부분입니다.
Diffusion model 포스팅에서 Loss에 대해 설명한 것을 참고하여 아래의 그림을 보면 이해가 쉬울 것 입니다.
정리하면, Input이 nerf로 생성된 pixel(image)라는 점이 달라지면서 U-net Jacobian ,Generator Jacobian이 추가 되었습니다. 본 논문에서는 실험결과 U-net Jacobian term은 생략하는게 결과적으로 성능이 더 좋아서 해당 term은 제외했다고 합니다.
해당 수식의 의미에 대해서는 Appendix에 정리해놓았습니다. 추가적인 설명은 Appendix참고하세요.
SDS Loss를 이해했으니 다시 전체적인 algorithm pseudo code를 보겠습니다.
NeRF는 random initialization하고, optimizer는 contributed shampoo를 사용하였고, diffusion model로는 pretrained 된 Imagen을 준비하고, 아래의 로직을 반복합니다.
time step t를 uniform하게 뽑고, time step t가 정의되면 noise의 정도를 알 수 있는 alpha, sigma를 알 수 있습니다.
image크기만큼 gaussian noise를 만듭니다.
random initialization된 NeRF를 통해 이미지 x를 생성합니다.
위에서 만든 image gaussian noise를 alpha와 sigma를 이용하여 reparameterize trick 수식을 통해 time t에서의 분포(z)로 변경합니다.
이렇게 구한 time t에서의 z를 diffusion model(pretrained Imagen)에 y(text-embedding)과 time step과 같이 입력으로 넣어줍니다.
이제 위에서 언급한 SDS Loss를 사용합니다. diffusion model은 freeze하기때문에 stopgradient로 표현하였습니다. 그렇게 구한 grad로 NeRF 파라미터를 업데이트합니다.
위의 알고리즘에는 없지만 이후의 다른 각도에서의 generator(nerf) 학습을 위해서 view-dependent conditioning을 위해서 text에 특정 각도에서는 condition("front","side","back"..)을 추가합니다.
Experiment
보통 3D recon의 경우 champer distance를 metric으로 사용하고 synthetic view 분야는 PSNR를 metric으로 사용하는데 해당 분야에서는 3D GT를 알 수 없기 때문에 해당 metric들을 사용할 수 없습니다. 따라서 DreamField와 마찬가지로 CLIP R-precision으로 평가하였습니다. 이 meric은 렌더링된 이미지가 주어질때 CLIP이 오답 텍스트를 포함한 텍스트중에 적절한 이미지를 고르는 정확도를 뜻합니다.
Limitation
- imperfect loss function
- low-resolution image
- ambiguous 2D->3D