[일단 박죠] PanoHead를 활용한 아바타 자동 생성 #3

jeyong·2023년 9월 15일
0
post-custom-banner

PanoHead

[일단 박죠] PanoHead를 활용한 아바타 자동 생성 #2에서 PanoHead에서 제공해주는 기본적인 데이터를 이용하여, 3D 모델을 생성해보았다. 그래서 이제 내가 원하는 사진을 타겟 이미지로 제공하여 3D 모델을 생성해보려고한다.

필요한 데이터

원하는 사진을 타겟 이미지로 지정하기 위해서는 아래와 같은 데이터 파일이 필요하다. 해당 데이터 파일은 인물 사진에서 얼굴 랜드마크를 추출하여 저장하고 있다.

{
	"labels": [
		[
			"000134.jpg",
			[
				"0.980169",
				"-0.004075",
				"-0.198125",
				"0.534939",
				"-0.003572",
				"-0.999991",
				"0.001775",
				"-0.004793",
				"-0.198131",
				"-0.000988",
				"-0.980175",
				"2.646472",
				"0.000000",
				"0.000000",
				"0.000000",
				"1.000000",
				"4.264700",
				"0.000000",
				"0.500000",
				"0.000000",
				"4.264700",
				"0.500000",
				"0.000000",
				"0.000000",
				"1.000000"
			]
		],
		[
			"000157.jpg",
			[
				"0.975032",
				"-0.009496",
				"0.221723",
				"-0.598652",
				"-0.008519",
				"-0.999792",
				"-0.020003",
				"0.054008",
				"0.221925",
				"0.018354",
				"-0.974910",
				"2.632258",
				"0.000000",
				"0.000000",
				"0.000000",
				"1.000000",
				"4.264700",
				"0.000000",
				"0.500000",
				"0.000000",
				"4.264700",
				"0.500000",
				"0.000000",
				"0.000000",
				"1.000000"
			]
		]
	]
}

해당 데이터 파일을 사진에서 출력하기 위해서 PanoHead는 아래와 같이 가이드를 제공해주고있다.

PanoHead/3DDFA_V2_cropping/cropping_guide.md

가이드를 읽어보면 3DDFA_V2을 이용하여 카메라 포즈 자르기 및 가져오기를 하라고 한다. 아래는 3DDFA_V2의 링크이다.

3DDFA_V2

해당 가이드를 이용해서 사진에서 데이터 파일을 뽑아내고 3D 모델을 생성해보자.

3DDFA_V2 수행과정

사전 준비

  • 3DDFA_V2 저장소를 클론하고 모든 설치 지침을 따라 데모가 성공적으로 실행될 수 있도록 한다.
  • 3DDFA의 cython을 빌드한 후, 다음 명령어를 사용하여 필요한 패키지를 설치한다.
    pip install opencv-python dlib pyyaml onnxruntime onnx

단계

  • 설정: PanoHead 폴더에서 test 폴더( 이미지 파일 ), recrop_images.py, 그리고 dlib_kps.py를 3DDFA_V2 루트 디렉토리로 이동한다.

  • 또한, shape_predictor_68_face_landmarks.dat를 다운로드하여 3DDFA_V2 루트 디렉토리에 놓는다.

    다운로드 링크

  • 디렉토리 변경: 다음 명령어를 사용하여 작업 디렉토리를 3DDFA_V2로 변경한다.

    cd 3DDFA_V2
  • Build the cython version of NMS, Sim3DR, and the faster mesh render
    - C/C++로 작성된 코드를 Cython을 사용하여 Python에서 호출 가능한 확장 모듈로 빌드 한다.

    sh ./build.sh
    • NMS(Nearest-neighbor suppression) 빌드: 이 부분은 먼저 정확한 얼굴 감지와 후처리 단계에서 사용되는 NMS 알고리즘의 빠른 버전을 빌드합니다. NMS는 중복된 객체 검출을 방지하고 검출된 객체 중에서 가장 관련성이 높은 객체를 선택하는 데 사용됩니다.
    • Sim3DR 빌드: Sim3DR은 3D 얼굴 모델 랜더링에 사용되는 모듈로, 더 빠른 랜더링을 지원합니다. Cython을 사용하여 Python에서 호출할 수 있는 확장 모듈로 빌드하여 Python 환경에서 더 빠른 모델 랜더링을 가능하게 합니다.
    • 더 빠른 메시 랜더러 빌드: 이 부분은 3D 얼굴 모델의 더 빠른 랜더링을 위한 코드를 빌드합니다. 이것은 모델의 시각적인 표현을 생성하고 이미지로 렌더링하는 데 사용됩니다.
  • 얼굴 키포인트 추출: dlib을 사용하여 얼굴 키포인트를 추출한다. 다음 명령어를 실행하면 3DDFA 루트 디렉토리에 키포인트가 저장된 data.pkl를 생성한다.

    python dlib_kps.py
  • 카메라 포즈 얻기 및 이미지 자르기: recrop_images.py를 사용하여 카메라 포즈를 얻고 이미지를 자른다. 다음 명령어를 실행하여 입력으로 data.pkl을 지정하고 출력 JSON 파일을 dataset.json으로 지정한다.

    python recrop_images.py -i data.pkl -j dataset.json

참고 사진

사진과 같이 명령어를 실행한다.

  • 종료: 4단계를 완료하면 3DDFA_V2 루트 디렉토리에 crop_samples라는 폴더를 찾을 수 있다. 이 폴더를 PanoHead 루트 디렉토리로 다시 이동하여 3D 모델을 생성 할 준비를 한다.

  • 스크립트 업데이트: gen_pti_script.sh에서 --target_img 플래그를 새 폴더를 가리키도록 업데이트한다.

발생하는 오류

AttributeError: module 'numpy' has no attribute 'int'.

numpy.int는 더 이상 사용되지 않으며 NumPy 1.20 버전에서 deprecated 되었다고 한다. 그래서 umpy.int64를 사용하면 된다.

AttributeError: module 'numpy' has no attribute 'long'

이 오류는 numpy 모듈에 long이라는 속성이 없다는 것을 나타낸다. Python 3에서 long 타입은 더 이상 사용되지 않으며, 모든 정수는 int 타입으로 표현된다고 한다. 따라서 코드에서 np.long을 np.int64로 변경해야 한다.

결과

위에 과정을 모두 수행하면 아래와 같은 결과를 얻을 수 있다.

타겟 이미지

결과 3D 모델

타겟 이미지

결과 3D 모델

색상 정보 입히기


PanoHead 깃허브 이슈에 들어가보면 해당 글을 확인 할 수 있다. 해당 글을 보면 색상정보르 입힌 것으로 보인다.
해당 정보를 바탕으로 3일간 색상정보를 입히려고 노력해보았으나, 실패하였다..
포기하지 않고 나중에 다시 도전해 보겠다! 누군가 성공하면 알려주면 정말 감사하겠다 ㅎㅎ

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

0개의 댓글