본문 바로가기
NeRF

[코드 빌드] Stable Zero123 : Text-to-3D

by xoft 2023. 12. 28.

Stable Diffusion모델을 공개한 Stability AI사에서, 2023년 11월 1일 Stable 3D라는 Text-to-3D를 서비스 한다는 글과 함께 영상을 공개했었습니다.

 

Stability AI Previews Enhanced Image Offerings: APIs for Business & New Product Features — Stability AI

Stability AI is excited to share updates regarding our next generation text-to-image products, featuring private previews of upcoming business offerings, including enterprise-grade APIs and new image enhancement capabilities.

stability.ai

 

높은 퀄리티를 보고 상당히 충격적이었습니다. 

 

 

그리고 2023년 12월 13일 Stable Zero123 빌드 방법을 공개하게 됩니다.

 

Introducing Stable Zero123: Quality 3D Object Generation from Single Images — Stability AI

Stable Zero123 is an AI-powered model for generating novel views of 3D objects with improved quality. Released for non-commercial and research purposes, it uses an improved dataset and elevation conditioning for higher-quality predictions. Using the improv

stability.ai

공룡 모양을 보아하니 위 영상에 나온 모델이 맞습니다. 위 article에서는 1장의 이미지로 3D를 만드는 Text-to-3D 모델인 Stable Zero123를 소개하고 있습니다.

 

위 그림에 대해 더 자세히 설명하자면,

Input Image는 Stable Diffusion모델로 Text-to-Image를 실행한 결과입니다. 

Zero123-XL모델은 Zero123 모델(이전글)을 개선하여 데이터셋을 Objaverse이 아닌 Objaverse XL로 학습한 모델입니다. 얼굴이 여러개 생기는 야누스 문제가 여전히 존재하는 것을 볼 수 있습니다.

Stable Zero123는 안정적(Stable하게)으로 만들어냅니다.

 

소개된 Stable Zero123 특징입니다.

  • Objaverse데이터셋에서 high quality의 3D Object를 Filtering하였습니다.
  • Zero123에서 Estimated된 카메라 포즈값을 입력으로 넣어주는데, 좀 더 정확한 포즈값을 사용했습니다.
  • pre-computed latent와 큰 batch사이즈를 사용해 training속도를 Zero123-XL에 비해 40배 향상시켰습니다.

상세한 차이는 config파일로 확인 할 수 있습니다.

Zero123 config : link

Stable Zero123 config : link

 

이번 블로그 글에서는 Text-to-3D 모델인 Stable Zero123 빌드 방법과 빌드 결과를 소개합니다.

 

 

 

개발 환경셋팅

 

stabilityai/stable-zero123 · Hugging Face

Stable Zero123 Model Description Stable Zero123 is a model for view-conditioned image generation based on Zero123. With improved data rendering and model conditioning strategies, our model demonstrates improved performance when compared to the original Zer

huggingface.co

먼저 제 PC에서 개발 가이드에 따라 실행 해보았습니다. (아래에 상세한 내용을 적어뒀습니다.)

저는 제 RTX3060 (VRAM 13GB)으로 빌드가 되지 않았습니다. 최소 6GB VRAM이 된다고 적혀 있어서 시도했는데, OOM(Out of Memory)에러가 발생했습니다. 해결 방법을 찾아보니, 24GB VRAM도 부족하다는 글을 보게 됩니다.

https://github.com/threestudio-project/threestudio/issues/187

 

Batch 사이즈도 줄여보고 ray sampling 크기도 줄여보고, width, height도 줄여봤지만.. OOM이 해결되지 않아서 Cloud PC를 임대하기로 했습니다.

 

 

 

 

Cloud PC 임대

갖고 계신 GPU VRAM이 40GB이상이면 해당 단계를 Skip하셔도 됩니다.

GPU 40GB 기준으로 가장 저렴한 클라우드 PC 요금을 찾아보았습니다.

https://fullstackdeeplearning.com/cloud-gpus/

 

A100 (40GB) 기준으로 Jarvislabs와 Lambda라는 업체가 있었는데, Lambda사에서는 가용 PC가 없어서 Jarvislabs 클라우드 업체로 선택했습니다. 사이트에 들어가보니 A6000(시간당 1달러)가 A100(시간당 1.5달러)보다 더 저렴해서 A6000을 사용했습니다. 머니 충전방식인데, 최소결제 단위가 10달러네요.. 혹시 몰라서 SSD 100GB로 임대 했습니다. (해보니 SSD 30GB이면 충분하네요.)

 

Ubuntu 20.04, Cuda 12.2, PyTorch-2.1, python3.10이 설치되어 있었습니다.

Stable Zero123 Install 방법(link)을 보니, 클라우드 PC구성이 설치 요구사항을 만족해서 Docker를 설치하지 않고 pip install 방식을 사용했습니다.

 

 

 

 

 

코드 빌드

단계0)  link 에서 설치 요구사항을 확인합니다.

단계1) 빌드 환경을 셋팅합니다.

git clone https://github.com/threestudio-project/threestudio.git
cd threestudio/

pip install ninja
pip install -r requirements.txt

pip install만 20분정도 소요됩니다.

 

단계 2~7을 실행하는 중간에 에러나서 가이드에 없는 설치 명령어를 더 실행해줬습니다.

apt-get update
apt-get -y install libgl1-mesa-glx
apt-get -y install libegl1-mesa-dev

 

 

 

++단계1 다른 설치 방법 : Docker

갖고 계신 PC의 설치 환경조건이 맞지 않다면 이 방법을 사용하시길 바랍니다. 제PC로 처음 시도 할 때 Ubuntu 18.04가 설치되어있는데, Ubuntu 20.04를 요구해서 Docker방식(link) 을 사용했습니다. 

git clone https://github.com/threestudio-project/threestudio.git
cd threestudio/

cd docker/
docker compose build  # build Docker image
docker compose up -d  # create and start a container in background
docker compose exec threestudio bash  # run bash in the container

 

 

 

단계2) link 에서 ckpt파일 다운받아 load/zero123/ 폴더로 위치시킵니다. ( 8분 정도 소요 )

cd load/zero123
wget https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt

 

단계3) link 에서 Stable Diffusion(SD) XL Turbo를 사용해서 Text로 Image를 생성합니다.  
            저는 "a simple 3D render of a white duck wearing a suit" 로 prompt하여 이미지를 생성하였습니다.

단계4) link 에서 Clipdrop을 사용해서 배경을 제거해줍니다.

 

단계5) 이미지 파일명을 _rgba.png으로 바꿔주고 load/images/ 폴더에 넣습니다.

단계6) Stable Zero123를 실행해줍니다.  (7분 정도 소요)

$ python launch.py --config configs/stable-zero123.yaml --train --gpu 0 data.image_path=./load/images/stable-diffusion-turbo_rgba.png

 

그럼 outputs/zero123-sai/~~~~/save 폴더에 아래와 같은 128x128 이미지가 만들어집니다.

 

그리고 100iteration마다 생성된 3D Reconstruction 영상도 만들어집니다. 

iter100_val

iter600_test (총 600 iteration입니다.)

 

굉장히 높은 성능을 보입니다!!!

 

 

단계7 ) mesh(=obj+mtl)파일을 생성해줬습니다. (2분 정도? 소요, 가이드 link)

python launch.py --config 'outputs/zero123-sai/[64, 128, 256]_stable-diffusion-turbo_rgba.png@20231227-140638/configs/parsed.yaml' --export --gpu 0 resume='outputs/zero123-sai/[64, 128, 256]_stable-diffusion-turbo_rgba.png@20231227-140638/ckpts/epoch=0-step=600.ckpt' system.exporter_type=mesh-exporter

 

단계7에서 전 에러가 발생했습니다. 에러 발생하지 않으면 Skip하셔도 됩니다.

[F glutil.cpp:338] eglInitialize() failed

찾아보니, link 해결방법을 참조해서, 아래 파일을 수정해줬습니다.

rasterize.py파일의 16번째 줄 (link)을

18번째 줄과 똑같이 만들어줍니다.

<From>
            return dr.RasterizeGLContext(device=device)
<To>
            return dr.RasterizeCudaContext(device=device)

 

생성 결과입니다.

 

Multi-view Rendering했던 것보단 성능이 좋지 않네요. 일단 NeRF모델을 3D Mesh로 변환하는 코드를 수정해주면 괜찮아 질 것 같습니다.  Vertex가 총 15만개로 가 너무 많습니다. Vertex도 부드럽게 만들어 주면 될 것 같네요. 거기까진 진행하지 않았습니다.

 

 

 

Closing..

최근 Gaussian Splatting을 사용한 Text-to-3D분야에서도 높은 퀄리티의 모델이 나왔습니다. 퀄리티가 높은 서비스 가능한 Text-to-3D 모델이 쏟아지기 시작했습니다. 개인적인 생각으로, 소규모의 게임 개발자가 좀 더 개발하기 좋은 환경이 될 것 같고, Image-to-3D모델을 통해 집에 있는 모든 물건을 3D 공간으로 넣는 시나리오가 만들어 질 것 같고, 3D 그래픽 디자이너의 역할이 프롬프트 엔지니어로 바뀌게 될 것 같습니다. 어떻게 AI산업이 바뀔지 기대됩니다.

 

댓글