[일단 박죠] NVDIA의 GET3D를 활용한 아바타 자동 생성 #1

jeyong·2023년 7월 12일
0
post-custom-banner

1. 과제 소개

이번 과제에서 내가 맡은 역할은 생성 AI 기반 면접 아바타 자동생성 부분이다.
해당 역할을 수행하기 위해서 NVIDIA의 GET3D를 활용해보기로 하였다.

2. GET3D

GET3D는 NVIDIA에서 개발한 실시간 3D 생성 및 조작 기술이다. 이 기술을 사용하면 2D 이미지나 비디오에서 실제같은 3D 모델을 생성할 수 있다.
딥러닝과 컴퓨터 비전 기술을 결합하여 높은 퀄리티의 3D 모델 생성을 가능하게 한다.

사진과 같이 여러가지 3D모델을 생성할 수 있는 모습이다.

간단한 원리 설명

훈련 단계에서는 2D 이미지를 기반으로 한 적대적 손실 함수를 사용하여 모델을 최적화한다. 래스터라이제이션 기반의 미분 가능한 렌더러를 활용해 RGB 이미지와 실루엣을 생성한다. 또한 두 개의 2D 판별기를 이용하여 생성된 이미지가 실제인지 아니면 생성된 것인지를 판별한다.

훈련이 완료된 후에는 잠재 코드를 입력하여 실시간으로 3D SDF(Signed Distance Field)와 텍스처 필드를 생성한다. 이 생성된 SDF는 DMTet 알고리즘을 이용해 3D 표면 메시로 변환되고, 텍스처 필드는 표면 메시에 색상을 부여하기 위해 쿼리된다. 이 과정을 통해 고품질의 3D 모델이 실시간으로 생성된다.

래스터라이제이션

3D 객체를 2D 화면에 표시하기 위한 과정이다. 이 과정에서 3D 모델의 각 부분은 2D 화면의 픽셀로 변환된다. 미분 가능한 렌더러는 이 과정을 미분 가능하게 만들어, 모델 훈련이나 최적화에 유용하게 사용된다.

3D SDF(Signed Distance Field)

3D 공간에서 특정 객체까지의 거리를 나타내는 스칼라 필드이다. 이 값은 객체의 표면에서 얼마나 떨어져 있는지를 나타낸다.

DMTet(Domain Meshing Tetrahedralization)

3D SDF(Signed Distance Field)를 트라헤드론(tetrahedron) 기반의 메시로 변환하는 과정을 담당한다. 즉, 이 알고리즘은 3D 객체의 복잡한 형상을 단순하고 효율적인 형태로 나타내기 위해 사용된다.

테트라헤드론

네 개의 꼭짓점과 네 개의 면으로 이루어진 3차원 다면체이다. 이 형태는 3D 공간에서 가장 단순한 다면체로, 복잡한 3D 형상을 이해하고 표현하기 위한 기본 단위로 자주 사용된다. 테트라헤드론 메시는 이러한 테트라헤드론들이 모여서 복잡한 3D 객체를 구성하는 형태를 말한다.

3. 수행 과정

아래는 GET3D의 깃허브 주소이다.

https://github.com/nv-tlabs/GET3D

해당 주소에서는 현재 ShapeNetCore의 데이터에 대하여 코드를 제공해주고 있으나 아바타에 대해서는 코드를 제공해주지 않고있다. 그래서 ShapeNetCore 데이터에 대해서 3D모델을 생성해 본 뒤 아바타에 대해서 생성해볼 생각이다. 참고로 해당 과정은 아래 링크의 도움을 받았다.

https://zhuanlan.zhihu.com/p/571458207

사진에서 보는 것과 같이 ShapeNetCore의 데이터를 다운 받으면 여러가지 사물의 데이터를 다운 받을 수있다.

해당 데이터들은 obj파일과 mtl 파일로 구성되어있는데 해당 파일들에 대한 설명은 다른 사이트를 참고할 것이니, 간단하게 설명하자면 3D 모델이 저장되는 파일 포멧중에 하나이다. obj 파일에는 모델의 모양이 저장되어있고 MTL 파일은 텍스쳐가 저장되어있다.

해당 데이터는 3D모델이니 블렌더를 이용하여 렌더링 하여 2D로 바꿔야한다. 해당 과정의 수행 방법은 다음과 같다.

blender 2.90.0 다운받기

tar -xvf blender-2.90.0-linux64.tar.xz
cd blender-2.90.0-linux64
cd BLENDER_PATH/2.90/python/bin
./python3.7m -m ensurepip
./python3.7m -m pip install numpy 

이미지 렌더링 수행

export PATH_TO_BLENDER=path/blender-2.90.0-linux64.tar.xz/blender
export PATH_TO_SAVE_IMAGE=$where_u_want_to_save_dataset
export PATH_TO_3D_OBJ=$path_of_ShapeNetCore_v1
python render_all.py --save_folder $PATH_TO_SAVE_IMAGE --dataset_folder $PATH_TO_3D_OBJ --blender_root $PATH_TO_BLENDER

해당 과정들을 수행하면 아래와 같은 결과가 생성된다.

간단하게 설명하자면 3D 모델을 이용하여 여러가지 방향에서 해당 모델을 찍어 여러개의 2D 이미지를 생성하는 것이다.

이제 3D 모델에서 2D 이미지를 생성해주었으니, GET3D를 이용하여 모델을 학습시켜야한다.

선행 학습 모델 다운로드

cd GET3D; mkdir cache; cd cache
wget https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/metrics/inception-2015-12-05.pkl

렌더링 데이터를 이용하여 학습하기

export PATH_TO_LOG=outputs/test
export PATH_TO_RENDER_IMG=path/shapenetcore_v1_get3d/img/02958343
export PATH_TO_RENDER_CAMERA=path/shapenetcore_v1_get3d/camera
python train_3d.py --outdir=$PATH_TO_LOG --data=$PATH_TO_RENDER_IMG --camera_path $PATH_TO_RENDER_CAMERA --gpus=8 --batch=32 --gamma=40 --data_camera_mode shapenet_car  --dmtet_scale 1.0  --use_shapenet_split 1  --one_3d_generator 1  --fp32 0

해당 학습을 수행할 때 여러가지 오류가 발생한다. 발생했던 오류들과 해결책은 다음과 같다.

1. module 'distutils' has no attribute 'version'

pip install setuptools==59.5.0

2. TypeError: unsupported operand type(s) for /: 'Nonetype' and 'int'

해당 오류는 코드를 수정해서 해결했다. metric_utils.py 파일의 문제를 발생시키는 get_mean_cov 함수를 수정하면 해결될 것이다.

해당 오류들을 수정하고 학습을 수행하고 아래와 같은 결과가 나왔다.

해당 파일을 이용하여 아래 명령어를 실행 시키면 학습시킨 데이터를 기반으로 모델을 생성해준다.

python train_3d.py --outdir=save_inference_results/shapenet_car  --gpus=1 --batch=4 --gamma=40 --data_camera_mode shapenet_car  --dmtet_scale 1.0  --use_shapenet_split 1  --one_3d_generator 1  --fp32 0 --inference_vis 1 --resume_pretrain MODEL_PATH
python train_3d.py --outdir=save_inference_results/shapenet_chair  --gpus=1 --batch=4 --gamma=40 --data_camera_mode shapenet_chair  --dmtet_scale 0.8  --use_shapenet_split 1  --one_3d_generator 1  --fp32 0 --inference_vis 1 --resume_pretrain MODEL_PATH
python train_3d.py --outdir=save_inference_results/shapenet_motorbike  --gpus=1 --batch=4 --gamma=40 --data_camera_mode shapenet_motorbike  --dmtet_scale 1.0  --use_shapenet_split 1  --one_3d_generator 1  --fp32 0 --inference_vis 1 --resume_pretrain MODEL_PATH

하지만 시간의 부족으로 제대로된 학습을 하진 않았고 GET3D에서 제공해주는 미리학습된 파일을 이용하여 3D 모델을 뽑아 보았다.

위에 사진 과 같이 ShapeNetCore의 car 데이터에서 좋은 3D 모델을 뽑아주는 모습을 볼 수 있다.

하지만... 나는 아바타를 뽑아내야한다... ㅠㅠ

다음화에 계쏙..

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글