AvatarCLIP은 전문 지식 없이도 단순한 텍스트 설명만으로 원하는 3D 아바타를 생성하고 애니메이션화할 수 있다고 설명해준다.AvatarCLIP을 이용해서 아바타 생성에 도전해보겠다!
AvatarCLIP 깃허브 주소에 보면 친절하게 설치해야할 파일들에 대해서 설명해주고있다. 대충 보면 저번에 다루었던 EVA3D와 비슷한 환경을 사용하고있다!
EVA3D를 활용한 아바타 자동 생성
git clone https://github.com/hongfz16/AvatarCLIP.git
cd AvatarCLIP
conda create -n AvatarCLIP python=3.7
conda activate AvatarCLIP
conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=10.1 -c pytorch
pip install -r requirements.txt
해당 명령어를 이용해서 필요한 파일들을 다운로드 받아준다!
주의해야할 점은 EVA3D 에서 한번 다루었듯이 cudatoolkit 버전을 신경써주면 된다.
지금부터가 좀 귀찮은 작업들이 시작된다..
neural_renderer에 방문해서 neural_renderer를 다운받아야한다. 해당 링크에 방문해보면 아래 명령어를 이용해서 다운받을 수 있다고한다.
pip install neural_renderer_pytorch
아래와 같이 해당 라이브러리에 접근한다.
그리고 neural_renderer/perspective.py19번째 줄에 아래 코드를 추가한다.
x[z<=0] = 0
y[z<=0] = 0
z[z<=0] = 0
그리고 아래 osmesa 라이브러리를 설치한다.
conda install -c menpo osmesa
이제 설치할건 끝났다. AvatarCLIP의 필요한 데이터 준비를 해야한다.
SMPL에 방문해서 SMPL 데이터를 다운로드 받는다. 그리고 아래와 같이 폴더 구조를 생성한다.
ShapeGen할 때 필요한 데이터 다운로드에 방문해서 다운로드 받은 뒤 아래와 같이 폴더 구조를 생성한다.
모션 생성을 위한 사전 훈련된 가중치와 인간 질감에서 다운로드 받고,
VPoser v2.0 에서 사전 훈련된 가중치를 다운로드 받는다.
그리고 아래와 같이 폴더 구조를 생성한다.
참고로 제일 상위 폴더는 AvatarAnimate이다.
해당 기능은 AvatarGen/ShapeGen 폴더에서 수행가능하다
python main.py --target_txt 'a 3d rendering of a strong man in unreal engine'
- 헤당 명령어는 'a strong man'이라는 텍스트 설명에 해당하는 대략적인 형태를 생성한다. 'a 3d rendering of xxx in unreal engine' 형식의 프롬프트 확장을 사용하면 더 나은 결과를 얻을 수 있다.
- 생성된 대략적인 몸체 메시는 AvatarGen/ShapeGen/output/coarse_shape 아래에 저장된다.
아래는 해당 명령어를 이용해서 뽑아낸 3D 모델이다.
a strong man에 텍스트 설명에 해당하는 대략적인 형태를 생성해준 모습이다.
해당 기능은 AvatarGen/ShapeGen 폴더에서 수행가능하다
python render.py --coarse_shape_obj output/coarse_shape/a_3d_rendering_of_a_strong_man_in_unreal_engine.obj --output_folder ${RENDER_FOLDER}
- 이 명령어는 암시적 아바타 표현의 초기화를 위해 메시를 렌더링한다.
- 이 렌더링된 이미지는 후속 단계인 "Shape Sculpting and Texture Generation"에서 사용된다.
- confs/examples/ 폴더를 열어보면 모양 조각 및 텍스처 생성을 수행하기 위한 데이터, 사전 훈련된 모델 및 스크립트를 제공하는 것을 알 수 있다.
- 해당 스크립트들을 이용해서 여러가지 예시 3D 모델들을 만들어 볼 수 있다.
해당 기능은 AvatarGen/AppearanceGen 폴더에서 수행가능하다
python main.py --mode train_clip --conf confs/examples/abrahamlincoln.conf
- 이 명령어는 'Abraham Lincoln'에 해당하는 형태를 조각하고 텍스처를 생성하는 데 사용된다.
- 결과는 AvatarCLIP/AvatarGen/AppearanceGen/exp/smpl/examples/abrahamlincoln에 저장된다.
python main.py --mode train --conf confs/base_models/astrongman.conf
이 명령어는 암시적 아바타의 초기화를 위해 사용된다.
python main.py --mode train_clip --conf confs/astrongman/hulk.conf
이 명령어는 초기화된 암시적 아바타에 대한 형태 조각 및 텍스처 생성을 수행한다.
깃허브에서 제공하는 예시 코드들에 대한 설명은 모드 마무리 했으니, 이제 수행과정을 기록하며 자세하게 설명하겠다.
현재 연구실에서 사용하는 GPU는 RTX 3090이다. 하지만 해당 코드를 만든 사람은 NVIDIA V100(32GB 메모리)에서 테스트했다고 한다.
그래서 사진과 같이 메모리 부족이 나는 모습이다.
그래서 메모리가 낮은 GPU에서 실행하려면 네트워크 규모를 줄이거 나 max_ray_num구성 파일에서 조정을 시도하라고 한다.
...
train {
...
batch_size = 256 # batch_size 조정
max_ray_num = 4000 # max_ray_num 조정
...
}
...
그래서 예시와 같이 batch_size와 max_ray_num을 조정한 모습이다.
- 잘 진행되는 모습이다.
- 해당 예제는 사전 훈련된 모델 및 스크립트를 이용해서 실행하는 것이므로 end_iter 값을 1000으로 설정하여 간단하게 결과만 보도록 하겠다.
결과가 잘 만들어진 모습이다. 이제 생성된 암시적 아바타에서 메시를 추출해보자
python main.py --mode validate_mesh --conf confs/examples/abrahamlincoln.conf
해당 명령어를 이용해서 생성된 암시적 아바타에서 메시를 추출할 수 있다.
명령어를 실행할 경우 Find checkpoint: ckpt_001000.pth 체크포인트 폴더에서 파일을 찾아 학습하는 모습이다.
사진과 같이 mesh가 잘 저장된 모습이다.
- .ply 파일을 블렌더를 이용하여 열어본 모습이다. end_iter 값을 1000으로 설정하였음에도 모습이 잘 나온다.
- 추가로 .ply 파일을 fbx로 변환해주는 코드도 제공해주고 있다. 해당 과정은 나중에 필요할 때 수행하도록 하겠다.
python main.py --target_txt 'a 3d rendering of a strong man in unreal engine'
해당 명령어를 이용해서 거친 몸체 메쉬 생성 하였을 것이다.
python render.py --coarse_shape_obj output/coarse_shape/a_3d_rendering_of_a_strong_man_in_unreal_engine.obj --output_folder ${RENDER_FOLDER}
그래고 해당 명령어를 이용해서 메시를 렌더링해주었을 것이다.
렌더링이 잘 된모습을 볼 수 있다.
confs/base_models/astrongman.conf 파일을 열어보면 내가 만든 거친 모양에 대해서 3D 모델을 생성 할 수 있도록 예시 파일을 제공해주는 모습을 알 수 있다.
예시 구성 파일을 이용하여 3D 모델을 만들어 주면 된다. 3D 모델을 만들어주기 위해서는 다음과 같은 두 단계의 최적화가 필요하다.
python main.py --mode train --conf confs/base_models/astrongman.conf
이제 해당 명령어를 이용해서 초기화된 암시적 아바타를 생성할 수 있다.
잘 실행되는 모습이다.
python main.py --mode train_clip --conf confs/astrongman/hulk.conf
이제 해당 명령어를 이용해서 초기화된 암시적 아바타에 대한 형태 조각 및 텍스처 생성을 수행하면 된다.
- 수행하면 메모리 오류가 또 다시 발생하는 모습이다.
- 참고로 해당 오류 말고도 pretrain값을 ckpt_300000.pth 으로 설정하여 오류가 발생할 텐데 나는 chpk_001000으로 해당 값을 수정하여 해결하였다.
해당 값을 수정해서 메모리 오류 현상을 해결하였다.
- end_iter 값을 1000으로 설정하였기 때문에 굉장히 별로인 모습이다.
- end_iter 값을 더 늘려준다면 좋은 결과를 뽑아줄 것이지만 나중에 시간이 남는다면 시도해보겠다.
아래는 'a 3d rendering of a weak man in unreal engine' 텍스트를 이용하여 거친 몸체를 만든 모습이다.
실행자체는 문제없는 모습이다.
하지만 결과가 'a 3d rendering of a strong man in unreal engine' 과 같은 모습이다.
이유로는 여러가지가 있을 수 있다.
나중에 AvatarCLIP을 자세하게 다루어야할 떄가 온다면 자세하게 분석해보겠다.
다른 문제점은 텍스쳐값을 입혀주지 못한다는 것이다. 프로젝트 페이지를 보면 텍스쳐를 입혀주는것 것 처럼 나와있지만 실제로 해보고 논문을 분석해본 결과 텍스쳐를 입혀주지 않는 것 같다..
또 다른 문제점은 구성 요소 파일(.conf) 파일 이다. AvatarCLIP을 이용할 경우 .conf 파일을 직접 만들어 주어야할 텐데, 해당 방식은 현재 내가 원하는 가상아바타 생성과는 거리가 멀다.
전체적으로 AvatarCLIP 자세하게 다루지 않는 모습을 보여주었다.
왜냐하면 해당 모델은 여러가지 문제점들 때문에 내가 원하는 가상아바타생성 모델과는 거리가 멀기 떄문이다. 또 다시 다른 모델을 찾아 모험을 떠나 볼 것이다.