기술 단어장/AI

[AI] 3D 얼굴 생성을 위한 3D-GANTex 실행 과정

MFDO 2025. 1. 8. 13:21

 

 

 

 

오늘은 3D-GANTex를 통해

단일 이미지를 기반으로 3D Face Mesh 및 텍스처를 생성해보았다.

그 과정 중 발생한 이슈와 해결 과정과

전반적인 이론적 구성과 코드 흐름을 정리한 글이다.

 

원본 코드

https://github.com/rohit7044/3D-GANTex

 

GitHub - rohit7044/3D-GANTex: 3DGANTex: 3D Face Reconstruction with StyleGAN3-based Texture Synthesis from Multi-View Images

3DGANTex: 3D Face Reconstruction with StyleGAN3-based Texture Synthesis from Multi-View Images - rohit7044/3D-GANTex

github.com

진행 과정

https://github.com/oMFDOo/OpenSourceIssue/issues/21

 

[Infra] 3D-GANTex 코드 구동 · Issue #21 · oMFDOo/OpenSourceIssue

3D Mesh 및 텍스처 생성을 위한 3D-GANTex 구동 3D 객체에 적용 가능한 고품질 텍스처를 생성 GAN 기반 기술을 활용하여 텍스처의 자연스러움과 다양성을 보장 특징 : 심층 학습 기반 딥러닝과 생성적

github.com

 

 


 

 

1. 개요

3D-GANTex는 GAN 기반으로 얼굴 이미지를 분석하고, 3DDFA를 활용해 3D Mesh를 생성한 뒤, 이를 다시 UV 맵과 함께 합성하여 완성도 높은 3D 얼굴 모델을 만들도록 돕는 프레임워크이다.
기본적으로 StyleGAN3의 잠재 공간(latent space)을 활용해 여러 뷰(멀티 뷰)로 얼굴 이미지를 생성하고, 그중에서 중앙 포즈(정면)를 골라 3DDFA 기반의 3D Face Alignment를 수행함으로써 3D Mesh와 UV Texture를 얻는다.
여기서 3DDFA(3D Dense Face Alignment)는 단일 이미지로부터 얼굴의 3D 랜드마크를 예측해 3D Mesh를 구축해주는 라이브러리이며, Open3D, PyTorch, dlib 등이 함께 쓰인다.

 

 

 


 

 

2. 실행 환경 및 의존성

: Conda 가상환경 내에 주요 종속성을 설정했다. (Ubuntu 22.04, Python 3.8, PyTorch 2.0 이상 권장)

물론 한 줄로 상남자처럼 설치할 수 있으나, 차분하게 하나씩 설치했다.

python -m pip install --upgrade pip setuptools wheel

# PyTorch 
python -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# OpenCV
python -m pip install opencv-python opencv-python-headless

# imageio
python -m pip install imageio

# Dlib 
python -m pip install dlib

# Cython
python -m pip install cython

# CMake
python -m pip install cmake

# pyrallis
python -m pip install pyrallis

# ONNX and ONNX Runtime
python -m pip install onnx onnxruntime

# Open3D
python -m pip install open3d

GPU 환경(CUDA 11.8 이상)에서 PyTorch 설치를 권장

dlib 설치 시 Visual Studio 등 특정 빌드 환경이 필요할 수 있으니, OS별 가이드 문서 참고

 

 

+ 그럼에도 원하는 이들을 위한 한 줄 설치

python -m pip install --upgrade pip setuptools wheel \
torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 \
opencv-python opencv-python-headless imageio dlib cython cmake pyrallis onnx onnxruntime open3d

 

 

 

 


 

3. 사전 준비 사항

 

 

3-1) 3D-GANTex 레포지토리 클론

git clone https://github.com/rohit7044/3DGANTex

 

 

3-2) 사전 학습된 모델(pretrained models) 다운로드

: StyleGAN3용 ReStyle 모델(FFHQ 기반) restyle_pSp_ffhq.pt , restyle_e4e_ffhq.pt 다운로드

  • ReStyle-pSp Human Faces
    : Progressive StyleGAN Projection(pSp) 기반 모델로, 빠르고 안정적인 이미지 인버젼을 제공,
    얼굴 특징 편집에 적합하지만 세부 디테일 복원에는 제한적.
  • ReStyle-e4e Human Faces
    : Encoder for Editing(e4e) 기반 모델로, 원본 이미지와의 유사성을 극대화 한 세밀한 복원에 강점이 있으나 느린 편.

 

 

 

3-3) 다운 받은 사전 학습 가중치 옮기기

: 다운 받은 restyle_pSp_ffhq.pt , restyle_e4e_ffhq.pt 파일을 pretrained_models 폴더에 저장한다.

 

 

 

3-4) 3DDFA 가중치 추가

: 이 때 바로 실행한다면, 3DDFA 가중치가 누락되어 있을 것이다. cleardusk/3DDFA_V2 에서 직접 받아서ThreeDDFA_weights/weights 경로에 넣어주면 된다.

대략 이런 에러가 날 것이다.
일단 다 넣어보았다 ㅎㅎ

 

 

 

3-5) Cython 모듈 빌드

: NMS, Sim3DR, mesh render 등을 최적화하여 빠르게 사용해보자~!

cd 3DGANTex sh ./TDDFA_build.sh

 

 


 

 

4. 실행

4.1 main.py를 통한 명령어 기반 실행

공식 리포지토리에서 새롭게 추가된 main.py는 명령어 인자를 통해 직관적으로 실행할 수 있도록 만든 스크립트다.

python main.py \
    --input "input_data/00012.png" \
    --pose-min -3 \
    --pose-max 5 \
    --center-pose 1 \
    --output-dir "output" \
    --show-3d
  • --input: 입력 이미지 경로
  • --pose-min, --pose-max: 얼굴 포즈(회전) 각도 범위
  • --center-pose: 그중에서 중간(정면)에 해당하는 포즈의 index
  • --output-dir: 결과물을 저장할 경로
  • --show-3d: 최종 3D Mesh를 시각화

 

 

이를 통해 결과물(멀티 뷰 이미지, UV 텍스처, 3D obj 파일)output 폴더에 생성된다.

아래는 main.py의 주요 흐름이다.

def main():
    # 인자 파싱
    args = parse_arguments()

    # Config 설정
    config = Config(args.input, args.output_dir)
    processor = FaceProcessor(config)

    # 옵션(포즈 범위, GUI 시각화 옵션 등) 지정
    options = ProcessingOptions(
        pose_range=(int(args.pose_min), int(args.pose_max)),
        center_pose=args.center_pose,
        show_generated=args.show_generated,
        show_multipose=args.show_multipose,
        show_3d=args.show_3d
    )

    # 실제 처리
    results = processor.process_image(args.input, options)

    # 결과 출력
    for key, path in results.items():
        print(f"  {key}: {path}")
  • FaceProcessor 클래스를 통해 StyleGAN3 기반 멀티 뷰 생성, 3DDFA를 통한 Mesh 추출, UV 텍스처 매핑 등을 한 번에 진행한다.

 

 

4.2 3D-GANTex.py  분석

main.py 이전 버전(또는 직접 커스텀)으로 실행을 원한다면 3D-GANTex.py 스크립트를 사용할 수 있다.
아래는 핵심 코드 스니펫이다.

# 1) StyleGAN3 모델 로딩
net, opts = load_encoder(checkpoint_path=model_path)

# 2) 이미지 읽기/전처리
original_image = Image.open(image_path).convert("RGB")
aligned_image = run_alignment(original_image)
cropped_image = crop_image(original_image)
landmarks_transform = compute_transforms(aligned_image, cropped_image)

# 3) Inversion
n_iters_per_batch = 3
opts.n_iters_per_batch = n_iters_per_batch
result_batch, result_latents = run_on_batch(
    inputs=transformed_image.unsqueeze(0).cuda().float(),
    net=net,
    opts=opts,
    avg_image=avg_image
)

# 4) Latent Space Editing (인터페이스GAN)
edit_images, edit_latents = editor.edit(
    latents=input_latent,
    direction=edit_direction,
    factor_range=(min_value, max_value),
    user_transforms=landmarks_transform,
    apply_user_transformations=True
)

# 5) 3DDFA를 사용해 3D Mesh & UV Texture 생성
boxes = face_boxes(frontal_face_img_rgb)
param_lst, roi_box_lst = tddfa(frontal_face_img_rgb, boxes)
ver_lst = tddfa.recon_vers(param_lst, roi_box_lst, dense_flag=True)

uv_tex(frontal_face_img_rgb, ver_lst, tddfa.tri, wfp=uv_tex_path)
ser_to_obj(frontal_face_img_rgb, ver_lst, tddfa.tri, wfp=obj_tex_path)
  • run_alignment, crop_face: dlib으로 얼굴 랜드마크를 찾고, 이미지 정렬(align) 및 crop
  • run_on_batch: StyleGAN3 + ReStyle Encoder를 통해 Inversion 수행(이미지를 잠재 벡터로 변환)
  • editing: pose, age, gender, 표현 등 다양한 라벨 방향으로 latent를 편집
  • 3DDFA: 최종 생성된(정면 포즈) 이미지를 입력받아 3D Mesh와 UV 텍스처를 생성

 

 

 


 

5. 결과물 및 이슈

Source Mesh Texture Output Pose
Image
Image
Image
  1. 서양인 할아버지 얼굴 이미지에서는 그래도 괜찮은 품질의 3D Reconstruction이 나왔다.
    • 미간, 턱선, 볼 등 메시가 잘 잡힘
    • 텍스처도 깔끔하게 UV 맵으로 매핑
  1. 동양인 또는 기타 인종의 경우(특히 여성)에서는 넘무나 아쉬운 결과가 나왔다...
    • StyleGAN3 모델이 FFHQ(대부분 서양 이미지 비중이 더 큼)로 학습된 영향인지,
    • 때로는 적절한 포즈 변환 및 텍스처 생성에 실패하는 경우가 있었음
    • 결과적으로 색감이나 윤곽이 어색하게 표현되거나, Mesh가 뒤틀리는 현상이 종종 발생
  2. 3DDFA_v2 빌드 이슈
    • OS 환경에 따라 Cython 빌드 과정에서 에러가 뜰 수 있음
    • sh TDDFA_build.sh 실행 시, 올바른 C++ 컴파일러(gcc) 버전, cmake 버전이 필요한지 확인
  3. 멀티 뷰 편집 범위
    • pose-min, pose-max 범위를 지나치게 크게 주면, 얼굴 측면이나 뒤쪽이 어색하게 표현되는 경우도 발생
    • -3 ~ 5 정도가 무난하다고 함

 

 

 


 

6. 마무리 및 개선점

  1. 데이터 다양성 부족
    • FFHQ 기반으로 학습된 모델이므로, 동양인/어린이/안경 착용자 등에 대한 표현력이 떨어질 수 있다.
    • 향후 다양한 데이터셋으로 finetuning하거나, Multi-modal GAN을 적용하면 개선 가능하다.
  2. 고해상도 얼굴에서의 세부 디테일
    • 3DDFA 기반 메시의 정밀도가 한계가 있어, 미세한 주름, 모공 등의 표현에는 약간의 부족함이 있다.
    • 좀 더 정밀한 3D Morphable Model(예: DECA, HeadNeRF 등)을 활용하면 개선할 수 있다.
  3. Mesh 정합(Registration) 품질
    • 자동으로 랜드마크를 찾아 메시를 생성하므로, 각도나 조명 상황에 따라 에러가 날 수 있다.
    • 가능하다면 수동으로 정렬하거나, Ground truth depth 지도 정보를 결합하는 등 후처리를 고려해볼 수 있다.

 

 

 


 

7. 결론

3D-GANTex는 간단한 파이프라인 설정만으로도
StyleGAN3 + ReStyle을 이용해 멀티 뷰 생성 → 최적의 얼굴 포즈 선택 → 3D Mesh & UV 텍스처를 추출

과정을 자동화해준다.


단 한 장의 얼굴 사진으로부터 간단히 3D Reconstruction을 시도해볼 수 있다는 점이 큰 장점이다.