InstantID로 인물의 얼굴을 원하는 방향 및 각도로 바꿔보자

여러번 소개드린 것처럼 스테이블 디퓨전의 이미지 생성 과정에서 사용자 개입을 가장 강력하게 도와주는 기능이 바로 컨트롤넷(ControlNet)입니다. 오늘은 InstantID에 대해 살펴볼 예정인데요, InstantID는 컨트롤넷 중에서도 IP-Adapter에 포함되는 기능으로, 사용자가 원하는 얼굴의 생김새와 스타일로 다른 얼굴의 각도까지 대체할 수 있는 강력한 확장 기능입니다.

InstantID 개념

컨트롤넷 중에서도 IP-Adapter 즉, 이미지 프롬프트(IP: Image Prompt)의 한 기능으로 분류되는 InstantID는 이미지 프롬프트를 인물의 “얼굴”에 적용하는데 특화된 기술입니다. 사용자가 기준이 되는 얼굴이미지와, 얼굴의 각도를 참고할 이미지 2장을 준비해 스테이블 디퓨전에게 던져주면 InstantID는 2번 이미지 속 얼굴의 각도를 참고하여 1번 이미지 얼굴의 느낌으로 다시 그려주는 방식입니다.

InstantID 개념 설명
  1. 기준이 되는 얼굴 이미지(Face Embedding) : 이미지 속 얼굴을 새로그릴 그림의 얼굴로 사용
  2. 각도를 참고할 얼굴 이미지(Face Keypoints) : 이미지 속 얼굴의 눈코입 각도를 새 그림에 적용

InstantID 사용 방법

InstantID는 WebUI 또는 ComfyUI 모두에서 사용 가능합니다. 본문에서는 WebUI에서 사용하는 방법에 대해서만 간단하게 소개드리도록 하겠습니다. ComfyUI에서 사용하는 방법은 전자책에서 조금 더 자세히 소개드리고 있으며, 본문에서는 ComfyUI에서 InstantID 활용한 예시 이미지를 소개드립니다.

SDXL Turbo 모델 다운로드

본문에서 소개드리는 InstantID는 SDXL 모델 전용입니다. 더불어 InstantID는 적은 스텝, 낮은 CFG 값 사용을 권장하고 있습니다. 스텝을 높게 사용하는 일반 SDXL모델에서는 결과 이미지가 버닝된 느낌으로 출력되기도 하므로, 되도록 터보 또는 라이트닝 모델을 사용하시는 것이 좋습니다.

DreamshaperXL 모델 다운로드 페이지

참고로 본문 예시에서는 Civitai에서 DreamshaperXL 터보모델을 다운받아 사용했지만, 평소 사용하시는 모델을 자유롭게 사용하셔도 무방합니다.

IP-Adapter 모델 다운로드

일단 InstantID 또한 컨트롤넷의 IP-Adpater 기술 중 하나이므로, 당연히 WebUI에 컨트롤넷이 설치되어 있어야 합니다. 아직 컨트롤넷을 설치하지 않은 분들은 아래 글을 참고하여 설치하신 뒤 진행해주시기 바랍니다.

WebUI 컨트롤넷에서 Instant ID를 사용하기 위해 아래의 모델을 다운로드 받은 뒤 각각의 위치로 옮겨주시기 바랍니다.

InstantID 전용 모델 다운로드 페이지1

먼저 ip-adapter.bin 파일을 다운로드 받은 뒤, ControlNetModel 폴더로 이동합니다.

InstantID 전용 모델 다운로드 페이지2

폴더 내에 위치한 diffusion_pytorch_mdoel.safetensors도 다운받아 줍니다.

다운받은 두 모델의 이름을 다음과 같이 변경합니다.

이름을 변경한 모델은 WebUI 설치 폴더 내 models > ControlNet 폴더로 이동합니다.

컨트롤넷 Cache 설정

일반적으로 WebUI가 설치된 상태에서 설정에서 컨트롤넷 Unit을 늘리더라도 Model cache size는 그대로 두고 사용하기 때문에 기본값인 1로 설정되어 있습니다.

InstantID 컨트롤넷 모델 캐시 설정

위와 같이 Settings>ControlNet 항목으로 이동하여 Model cache size를 2로 바꾼 뒤 ApplySettings를 눌러준 뒤, WebUI를 완전 종료(터미널까지)한 뒤 다시 시작해주시기 바랍니다.

컨트롤넷 이미지 설정

이제 실제 이미지를 생성하기 위해 아래와 같이 원본 얼굴 이미지와 참고할 얼굴 이미지를 각각 컨트롤넷 유닛에 할당합니다. 이 때 두 컨트롤넷 유닛에 사용하는 프로세스와 모델을 정확히 입력해주셔야 InstantID가 제대로 동작합니다.

유닛1 – Face Imbedding

InstantID 컨트롤넷 1번 유닛 설정

먼저 첫번째 유닛에는 위와 같이 결과 이미지에 반영되길 희망하는 스타일의 얼굴을 업로드 한 뒤 전처리 및 모델을 각각 instant_id_face_embedding, ip-adapter_instant_id_sdxl로 설정합니다.

유닛2 – Face Keypoints

InstantID 컨트롤넷 2번 유닛 설정

마찬가지로 두번째 컨트롤넷 유닛에는 위와 같이 얼굴의 각도를 참고할 이미지를 업로드 하고 전처리 및 모델을 각각 intant_id_face_keypoints, control_instant_id_sdxl로 설정합니다.

프롬프트 작성 및 이미지 생성

이제 설정을 모두 마쳤으므로 WebUI에서 프롬프트를 입력하고 이미지를 생성합니다. Instant ID는 두번째 유닛에 할당한 이미지 속 얼굴의 눈코입 방향만 인식하기 때문에, 기본적으로 프롬프트를 따로 적지 않으면 결과 이미지가 첫번째 유닛에 할당한 이미지 속 얼굴만 그 각도로 생성합니다. 따라서 특별한 분위기나 스타일을 적용하고 싶다면 이는 프롬프트로 구현해줘야 합니다.

InstantID 결과 이미지

위 이미지는 프롬프트에 간단하게 a girl is in cafe라고 작성하고 InstatID를 적용해 그린 그림입니다. 원본 이미지의 얼굴이 눈물의 여왕이 바라보는 시선과 일치하는 방향으로 재현되었으며 프롬프트의 내용을 반영해 카페에 있는 여성을 생성할 수 있었습니다.

이처럼 InstantID를 이용하면 로라 학습이나, ReActor등 다른 확장프로그램을 사용하지 않고도 인물의 얼굴을 원하는 각도 및 방향으로 바꿔볼 수 있습니다. 여기에 지난 포스팅에서 살펴본 프롬프트 스타일러를 잘 적용하면 아래와 같은 이미지를 생성하는 것도 어렵지 않습니다.

Depth 및 SDXL Prompt Styler 적용 예시

단순히 InstantID만 사용하면 인물의 얼굴은 방향을 고정할 수 있지만, 목아래의 몸의 방향이나 구도에는 영향을 줄 수 없기 때문에 프롬프트만으로 제어해야 합니다. 하지만 이미 얼굴을 고정한 상태에서는 스테이블 디퓨전이 그림을 그리는 자유도가 매우 떨어지기 때문에 프롬프트를 작성해도 이를 잘 반영하지 못하는 경우가 많습니다. 따라서 이럴 때는 얼굴방향과 더불어 몸의 방향도 원하는대로 생성한 이미지를 2번 유닛에 할당하고, Depth나 Openpose등을 추가로 활용하여 인물의 자세를 고정할 수 있습니다.

InstantID Depth 함께 적용

위 이미지는 ComfyUI에서 InstantID와 Depth를 같이 사용해 생성한 결과 이미지입니다. Face Embedding에 위치한 원본 얼굴이 Face Keypoints에 위치한 이미지에 그대로 잘 반영된 모습입니다. Depth를 함께 사용했기 때문에 인물의 자세와 구도가 더욱 유사하게 잘 고정된 것을 확인할 수 있습니다.

아래는 마찬가지로 ComfyUI에서 Face Embedding 이미지를 고정한 채 SDXL Prompt Styler를 적용해 생성한 다양한 예시 이미지입니다.

InstantID PromptStyler 적용

위 결과에는 원본과 동일한 프롬프트로 InstantID를 이용해 그림을 생성했기 때문에 유사한 스타일을 유지한 채 얼굴이 교체된 것을 볼수 있습니다. 만약 정말 배경은 그대로 고정하고 얼굴만 교체하고 싶은 경우라면 inpaint 마스크를 구성하여 원본에서 얼굴만 instantID로 교체하는 것도 가능합니다. 이처럼 InstantID를 다른 확장기능과 함께 활용하면, LoRA를 사용하지 않고도 원본 이미지의 스타일을 유지하면서 인물의 얼굴을 매우 그럴듯하게 교체할 수 있습니다. ComfyUI에서 InstantID를 활용한 워크플로우를 구성하고 사용하는 더욱 구체적인 방법에 대해 궁금하신 분들은 전자책을 참고해주시기 바랍니다.