안녕하세요. 오늘 포스팅할 논문은 ICCV 2023에 publish된 zero-1-to-3논문입니다.
사전에 dreamfusion논문을 살펴보면 좀 더 도움이 될 것 같습니다.
Intro
text-to-3D 관련 논문이 최근에 많이 쏟아지고 있습니다. 어떤걸 먼저 봐야할지 정보의 홍수속에 아래와 같은 3D diffusion timeline이라는 사진을 보게되어 Dreamfusion이후에 zero-1-to-3을 포스팅하게 되었습니다.
zero-1-to-3이후의 zero가 붙는 논문들은 zero-1-to-3를 reference한 모델이라고 볼 수 있고, dream이 붙은 논문들은 dreamfusion을 reference한 논문들이라고 보면 됩니다.
해당 논문은 single image를 이용해서 3D synthetic view를 만들어내는 것이 목표이며 메인 contribution은 기존의 dreamfusion과는 다르게 diffusion model을 단순 pretrained model을 그대로 쓰는 것이 아니라 view point를 condition으로하여 diffusion model을 finetune하는 것에 있습니다. 구체적인 방법은 아래 살펴보겠습니다.
Method
저자는 diffusion model로 image를 생성하면 viewpoint에 bias가 있음을 주장합니다. 아래 이미지만 봐도 정면을 보고있는 의자들이 대부분입니다.
이렇게 되면 야누스 생성오류와 같은 문제에 빠질 위험이 큽니다.
따라서 해당 논문에서는 single image와 camera matrix(R,T)를 input으로하여 대응되는 image를 생성하는 model를 만드는 것을 목표로 합니다.
Learning to Control Camera Viewpoint
diffusion model은 대규모 인터넷 데이터에 의해 학습되어 다양한 viewpoint에서 학습되었을 가능서잉 크지만 pretrained model에서 이를 제어할 수 없습니다. 그렇기에 위에 언급하였듯이 camera matrix를 추가하여 view point를 control하는 mechanism을 모델에게 학습하게 됩니다.
model 학습의 cost function은 아래 수식과 같습니다.
좀 더 해당 cost function을 이해하기위해서 기본적인 diffusion model의 cost function을 살펴보면 아래와 같다. time t에서 해당하는 noise를 input image에 추가하고 noise detector(U-net)이 noise를 예측하도록 noise detector를 학습시키는 방법이다.
이제 아래의 수식을 보면 이는 latent diffusion model의 cost function인데, vanillar diffusion model은 gaussian distribution의 noise를 점진적으로 제거도록 학습된 확률 모델입니다. 여기서는 markov chain의 원리가 사용되는데 자세한건 아래 포스팅 참고바랍니다.
vanilllar diffusion model은 computation cost가 많이 필요로 한데 quality와 flexibility를 유지하면서 computing cost를 낮추기 위해 diffusion model을 pretrained autoencoder의 latent space에서 training하게 하는 것이 latent diffusion model입니다. 즉 image를 autoencoder에 태워서 latent feature map으로 encoding하여 사용합니다. 디테일이 더 있지만 여기서는 대략적인 구조만 이야기 하겠습니다. 아래의 latent diffusion model의 cost function에서 z는 latent feature map을 뜻합니다.
그렇다면 다시 본 논문의 cost function을 살펴보겠습니다.
latent diffusion model처럼 input으로 raw image가 아닌 pretrained autoencoder를 태운 latent feature를 사용하였고 추가적으로 $c(x,R,T)$부분은 raw image를 clip에 태워서 나온 feature와 camera matrix(4D matrix)를 concat한 matrix인데 이 matrix를 diffusion model의 condition으로 넣게 됩니다.(pose CLIP)
밑의 실험에서 언급하겠지만 objaverse라는 dataset으로 8개의 a100으로 7일간 fine-tune training을 진행합니다.
3D Reconstruction
Learning to Control Camera Viewpoint단계에서 diffusion model에 condition으로 camera view를 control할 수 있게 되었습니다. 이제 3D로 recontruction하는 일만 남았는데요 여기서 Score Jacobian Chaining(SJC)의 loss function을 사용합니다.
랜덤하게 RT 샘플링하고 Neural Field rendering을 수행합니다. (NeRF) -> nerf inference 결과의 이미지의 latect vector를 input으로 하고 RT와 reference image를 condition으로 fine-tune한 diffusion model을 통해 denoise를 수행합니다. 이때 loss function으로는 PAAS score라는 위에서 언급한 SJC의 loss function을 사용합니다.
생성된 image는 GT가 아니기에 RT로 generate된 image를 NeRF의 GT이미지로 바로 사용하지 않고 DreamFusion처럼 diffusion model과 결합하여 학습을 진행합니다.
$\pi$: camera pose, $x_{\pi}$: 생성된 image, p : noise distribution
sds랑 비교를 하면 noise residual*unet jacobian가 2D score로 매칭됩니다.
학습이 완료된 NeRF모델을 마칭큐브 알고리즘을 사용해서 3D 메쉬화합니다.
[참고]
SJC에 대해서 간략하게 집고 넘어가겠습니다. DreamFusion같은 경우 NeRF로 생성한 image에 pretrained diffusion model을 엮어서 SDS라는 loss function을 통해 diffusion model의 parameter는 고정하고 NeRF의 parameter를 update합니다.
SJC에서 언급하는 문제는 NeRF로 생성된 image는 pretrained Diffusion model이 학습할 때 없었던 probability이기 때문에 Out of Distribution의 문제가 발생할 수 있다고 봅니다.
그래서 diffusion model의 2D score로 3D score를 계산해서 NeRF의 gradient로 사용한다는 목적으로 SJC라는 loss function을 제안하였습니다.(수식은 생략)
Compared with DreamFusion
DreamFusion어떤부분이 다른건지 보면서 이해를 좀 더 명확히 해봅니다.
일단 Diffusion model을 R,T를 condition으로 fine-tune하여 사용한다는 것이 가장 큰 차이일 것입니다. 이후의 diffusion model은 freeze되어 있습니다.
DreamFusion에서는 text-prompt로 geometry glue를 text로 추가하여 사용되지만 본 논문에서는 pose가 condition으로 사용됩니다. 또한 reference 이미지로 single image(input)이 사용됩니다.
Loss 또한 DreamFusion에서는 SDS라는 loss를 쓰고 본 논문에서는 SDS에서 개선된 SJC라는 loss function이 사용됩니다.
experiment
diffusion model의 fine-tune 데이터셋으로는 https://github.com/allenai/objaverse-xl 을 사용합니다.
stable zero 123
Stability AI에서 stable zero 123모델을 공개하였습니다.
stable zero 123모델은 zero 123의 모델을 improving하였습니다. diffusion model으로는 stable diffusion 1.5를 사용하였고 24G GPU메모리를 필요로 합니다.
기본적으로 non-commercial에 한하여 코드 공개를 하고 있고 stable zero123C는 멤버쉽전용입니다.
블로그 내용을 바탕으로 특징은 아래와 같습니다.
zero123-XL model은 zero123 을 개선하여 objaverse가 아닌 objaverse XL 데이터셋으로 학습한 모델.
yanus propblem이 여전히 존재하지만 stable zero 123은 안정적임
- objaverse dataset에서 high quality 3D object를 filtering함
- camera pose(RT)의 accuracy를 높임
- batch size를 늘려 training속도를 높임
개인적으로 사용해보려했는데 24G 메모리에에서도 안돌아가긴했습니다 ..