2023년 12월 13일 수요일

트랜스포머 기반 오픈소스 3D 모델 생성AI 소개

이 글은 3차원 모델 생성 AI 사용 방법을 간략히 설명한다. 

Anything 3D 결과 예시
MeshGPT 예시
설치 준비
CUDA, pytorch, vision 등이 정상 설치되어 있어야 한다. 다음 같이 확인한다.
nvcc --version
pip show torch torchvision torchaudio

다음은 제대로된 CUDA버전의 라이브러리가 설치되지 않은 상황을 보여준다.

다음과 같이 재설치한다.
pip uninstall torch torchvision torchaudio
pip install torch torchvision torchaudio torchdata torchtext --index-url https://download.pytorch.org/whl/cu118
pip show torch torchvision torchaudio


Anything 3D
Anything 3D 모델은 NeRF(Neural Radiance Field) 모델을 통해, 단일 렌더링 뷰에서 프롬프트만 통해 모든 대상 개체의 3D 결과를 얻을 수 있다. 

실행을 위해서는 다음 링크에서 소스를 다운로드, 패키지 설치 후 사용하면 된다. 
실행 결과는 다음과 같다. 

MeshGPT
MeshGPT는 Text to Mesh 모델이다. 학습은 Kaggles GPU 서비스를 사용하였다. 학습 데이터는 메쉬 중 250개 미만 삼각형만 있는 모델을 학습에 사용했다. ShapeNet, ModelNet40에서 1184개 모델을 얻고, 나머진 Objaverse에서 데이터 다운로드 프로그램을 이용해 얻었다. 총 13,600개 모델을 15번 증강해 218,000 파일을 얻었다. 

4 x P100 GPU를 사용해, 인코더는 30시간 동안 학습, 트랜스포머는 48시간 학습되었다. 매개변수 크기는 인코더 15M, 트랜스포머 141M 혹은 321M이다. 토큰은 186M이다. 


인코더와 디코더를 연결할 때 사용한 코드북은 16K 크기이다. 

관련해 상세한 설명은 다음 링크를 참고한다.

다음과 같이 설치한다.
pip install git+https://github.com/MarcusLoppe/meshgpt-pytorch.git

다음 코드를 실행한다.
import torch

print(f"{'GPU is available: ' + torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'GPU is not available.'}")

from meshgpt_pytorch import (
    MeshAutoencoder,
    MeshTransformer,
    mesh_render
)

device = "cuda" if torch.cuda.is_available() else "cpu"
transformer = MeshTransformer.from_pretrained("MarcusLoren/MeshGPT-preview").to(device)

output = []  
output.append((transformer.generate(texts = ['sofa','bed', 'computer screen', 'bench', 'chair', 'table' ] , temperature = 0.0) ))   
output.append((transformer.generate(texts = ['milk carton', 'door', 'shovel', 'heart', 'trash can', 'ladder'], temperature = 0.0) )) 
output.append((transformer.generate(texts = ['hammer', 'pedestal', 'pickaxe', 'wooden cross', 'coffee bean', 'crowbar'],  temperature = 0.0) )) 
output.append((transformer.generate(texts = ['key', 'minecraft character', 'dragon head', 'open book', 'minecraft turtle', 'wooden table'], temperature = 0.0) )) 
output.append((transformer.generate(texts = ['gun', 'ice cream cone', 'axe', 'helicopter', 'shotgun', 'plastic bottle'], temperature = 0.0) )) 

mesh_render.save_rendering(f'./render.obj', output)

결과는 다음과 같다.

학습되지 않은 다른 키워드를 사용하면 다음과 같다.
output.append((transformer.generate(texts = ['bridge chair','computer table', 'chair table'] , temperature = 1) ))   


Temperature가 높으면, 적당히 메쉬를 생성하는 것을 알 수 있다.

레퍼런스

댓글 없음:

댓글 쓰기