AI 이미지/Stable Diffusion

InstantID를 사용한 얼굴 교체 방법

하늘이푸른오늘 2024. 2. 19. 17:20

얼마전에 LoRA는 필요없다 - ComfyUI IP-Adapter라는 글에서, 별도로 학습한 체크포인트나 LoRA 모델 없이 어떤 사람의 얼굴을 복제하는 방법을 알려드렸습니다. 이 글도 비슷한 내용입니다. 다만, InstantID라는 기법을 이용한 것만 다릅니다. 아래는 InstantID를 사용해 얼굴을 복제한 예입니다. 뭔가 나사가 빠진 듯 하네요. 다른 예를 봐도 아시겠지만, 이 기법은 (적어도 제가 테스트해 본 바로는) 복제한 얼굴이 닮은 정도를 비율로 따지면 10~20% 정도가 아닐까... 싶은 정도입니다. 

InstantID란

InstantID는 InsightFace를 사용해 참조 이미지로부터 얼굴 임베딩(face embedding)을 감지하고, 잘라내고 추출한 뒤, 이 임베딩을 IP-adapter와 함께 사용하여 이미지 생성을 제어합니다. 여기까지는 IP-Adapter Face ID와 비슷합니다.

이와 더불어 InstantID는 ControlNet을 사용하여 여러가지 얼굴의 특징(landmark, 눈, 코, 입 등)을 감지하고 수정합니다. 

이처럼 IP-adpater Face ID와 콘트롤넷을 함께 사용함으로써, 참조 이미지를 충실하게 복사하고 스타일을 입힐 수 있습니다.

InstantID는 Stable Diffusion XL (SDXL) 모델을 사용합니다. 현재 시점에서 SD 1.5용 버전은 없습니다.

IP-adapter Face ID는 SDXL 모델과 궁합이 좋은 편이 아니어서, SDXL에서 누군가의 얼굴일 입히고 싶다면 InstantID가 좋은 대안이 될 수 있습니다. 

InstantID 과 비슷한 기법

InstantID외에도 얼굴을 복사하는 방법은 많습니다.

스테이블 디퓨전에 얼굴이나 스타일을 포함해 무엇이던 넣으려면 체크포인트 모델 혹은 LoRA 모델을 학습시키는 것이 가장 확실합니다. 이 기법을 사용하면 가장 최고의 결과를 얻을 수 있지만, 시간과 노력이 필요하며, 모델을 학습시키는 데는 약간의 기술이 필요합니다.

기타 학습이 필요하지 않은 IP-adapter Face IDReActor 확장도 있습니다. 기타 스테이블 디퓨전으로 비슷한 얼굴을 만드는 방법도 참고하시기 바랍니다.

AUTOMATIC1111 사전 준비

소프트웨어

AUTOMATIC1111은 스테이블 디퓨전을 운영할 수 있는 Web UI중에서 가장 널리 사용되고있는 UI입니다. 설치 방법은 이 글을 참고하시고, 처음이시라면 초보자 가이드도 참고하시기 바랍니다.

콘트롤넷(ControlNet) 확장 설치

InstantID를 사용하려면 ControlNet 확장을 설치하여야 합니다. 설치 방법은 여기를 읽어보세요.

ControlNet을 설치한지 오래되었을 경우, 업데이트가 필요할 수 있습니다. 먼저 Extension 페이지로 들어가 Intalled 탭에서 [Check for updates]  버튼을 누릅니다.

그러면 모든 확장에 대해 최신 버전이 있는지 체크를 하는데, 만약 새 버전이 있다면 위 그림 맨 오른쪽 아래와 같이 "new comits"라는 표시가 뜹니다.

이 경우, [Apply and restart UI]  버튼을 눌러주면 업데이트를 하고 AUTOMATIC1111 화면이 Refresh 됩니다. 필요하다면 AUTOMATIC1111을 시작한 명령 프롬프트(cmd)를 죽이고 새로 시작해주면 확실합니다.

InstantID 모델 설치

 InstantID 를 사용하려면 아래의 두가지 모델 파일을 다운로드 받아야 합니다.

두 파일 모두 바로 우클릭해서 다운로드 받으면 안되고, 링크를 클릭해서 들어간 다음 다운로드 받아야 합니다. 다운로드 받은 파일은 아래의 폴더에 넣어주시면 됩니다.

stable-diffusion-webui\models\ControlNet

AUTOMATIC1111에서 InstantID 실행하기

InstantID 모델을 사용할 때 몇가지 주의할 점이 있습니다.

  • 반드시 SDXL 모델을 사용해야 합니다.
  • CFG척도는 3~5 정도로 설정합니다.
  • 콘트롤넷을 두개 사용합니다.
  • 두개의 콘트롤넷에서 "Control Weight" 와 "Ending Control Steps" 를 줄여야 좋은 결과를 얻을 수 있습니다.

1단계 : SDXL 모델 선택하기

Stable Diffusion Checkpoint 드롭다운에서 SDXL 기본 모델(sd_xl_base_1.0) 을 선택합니다.

2단계: txt2img 설정

프롬프트는 필요에 따라 입력합니다. 일반적으로 SDXL 의 경우 부정적 프롬프트의 필요성이 그다지 높지 않습니다만, 넣어줘서 나쁠 것은 없습니다.

프롬프트 : line art drawing woman, professional, sleek, modern, minimalist, graphic, line art, vector graphics
부정적 프롬프트 : deformed, glitch, blurry, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, mutated, realism, realistic, impressionism, expressionism, oil, acrylic

모든 샘플러가 InstantID와 잘 작동하지는 않습니다. 아래의 샘플러를 사용하세요.

샘플러(Sampling Method) : Euler a
샘플링 단계 : 20

SDXL의 경우 기본 이미지 사이즈가 1024x1024입니다. 여기를 참고해서 필요에 따라 입력하세요.

이미지 크기 : 1216 x 832

InstantID의 경우 CFG 척도를 상당히 낮은 값으로 설정하여야 합니다.

CFG 척도(CFG scale) : 3

3단계: ContrlNet 설정

InstantID 모델을 사용할 때 두가지 모델을 한꺼번에 사용하게 되는데, 여기에서는 아래의 김태리 배우님 사진을 ControlNet 0와 ControlNet 1에 모두 사용합니다. 

ControlNet 0 설정

  • Enable: Yes
  • Pixel Perfect: Yes
  • Control Type: Instant_ID
  • Preprocessor: instant_id_face_embedding
  • Model: ip-adapter_instant_id_sdxl
  • Control weight: 0.5
  • Starting control step: 0
  • Ending control step: 0.5

ControlType이나 Preprocessor/Model에서 Instant_ID가 나타나지 않을 경우, 콘트롤넷 확장이 최신 버전이 아닐 수 있습니다. 여기를 보고 업데이트하시기 바랍니다.

ControlNet 1 설정

두번째 콘트롤넷도 거의 동읠하게 사용합니다. 이미지도 동일한 이미지를 사용했습니다. 단, Preprocessor 와 Model 만 다릅니다.

  • Preprocessor: instant_id_face_keypoints
  • Model: control_instant_id_sdxl

4 단계 : 이미지 생성

이제 [Generate] 버튼을 누르면 이미지가 생성됩니다. 아래는 이상의 설정에 따라 생성된 이미지입니다.

그런데.... 별로 김태리님을 닮은 것 같지를 않네요. 그래서 두번째 이미지를 다른 이미지로 바꿔서 시험해 봤습니다.

그나마 맨 마지막 이미지가 좀 닮은 것 같은데... 그래도 느낌이 팍 오지는 않네요. 그래서 혹시 프롬프트에 문제가 있나 싶어 바꿔서 테스트해봤습니다.

프롬프트 : a realistic photo of a beautiful asian woman, in cafe, long hair, close-up, detailed face,

그런데도 영 아니네요. 뭐... 제 눈에는 중국 여배우같은 느낌이 듭니다.ㅠ

이번엔 전지현 배우님 사진으로 시험해 봤습니다. 참고로, 설정은 약간씩 바꿔가면서 테스트했기 때문에 약간씩 다를 수 있습니다. 그런데.... 정말 딴사람이 튀어나왔네요.

아래는 원본 글에서 생성한 그대로 따라 해본 결과입니다. 왼쪽 위가 참조 이미지입니다. 우측 이미지는 쓸만한데... 이것도 그다지 엠마왓슨을 닮은 것 같지는 않네요. 적어도 동양여자라고 차별하지는 않는 듯 합니다. ㅎ

좋은 이미지를 생성하기 위한 참고사항

보시는 것처럼, InstantID는 생각보다 얼굴을 잘 복제해내지 못하는 것 같습니다. AI로 만든 3D 카툰보다 실물의 특징을 잘 잡아낸다는 느낌이 못합니다. 잘 생성하려면 좀 더 세밀한 조정이 필요할 듯 싶습니다. 

프롬프트 스타일은 SDXL Styler 확장을 사용했습니다. 여기를 읽어보세요.

아래 설정을 변경시켜보면 이미지가 달라질 수 있습니다.

  • Control Weight (ControlNet 0/1 모두) – 0.5 ~ 1
  • Ending Control Step (ControlNet 0/1 모두) – 0.2 ~` 0.6
  • CFG 척도 – 3 ~ 5.

ControlNet 0 에 들어가는 이미지는 얼굴의 특징을 설정하고, 두번째는 얼굴의 키 포인트를 잡아냅니다. 따라서 두 이미지를 달리할 수도 있습니다.

또한 InstantID는 아직 불안정해서 오류가 발생하는 경우가 많다고하니 참고하세요.

생성 속도를 빠르게

SDXL Turbo 모델을 사용하면 이미지 생성을 빠르게 할 수 있습니다. 다만 설정이 조금 달라져야 하고, 생성결과도 약간 달라질 수 있습니다. 여기에서는 Dreamshaper SDXL Turbo 모델을 사용해 보겠습니다. stable-diffusion-webui\models\Stable-Diffusion 폴더에 넣어주시면 되고, 체크포인트 드롭다운메뉴에서 선택해주시면 됩니다.

아래는 설정을 변경해야 하는 사항입니다.

  • 샘플러 : DPM++ SDE Karras
  • 샘플링 단계(Sampling steps): 8 (6 ~ 8)
  • CFG 척도 : 2 (1 ~ 3)

아래는 스타일을  Digital Art 로 설정하고 생성한 이미지 입니다. 모델은 신현빈 배우님입니다. 아... 정말 힘드네요.ㅠ

ComfyUI에서 InstantID 사용 방법

소프트웨어

여기에서는 ComfyUI를 사용합니다. AUTOMATIC1111에 비해 속도가 빠르고, 매우 유연해서 사용자가 많이 늘고 있는 스테이블 디퓨전용 WebUI입니다. 설치 방법 및 사용법 기초는 여기를 보시고, 투토리얼을 쭉 따라해보시면 사용법을 익히는데 좋으실 겁니다.

ComfyUI도 대부분 그대로 사용할 수 있지만, 때때로 오류가 발생할 수 있습니다. 그러한 경우, 다음과 같은 작업이 필요할 수 있습니다.

InsightFace 설치

ComfyUI용 IP-Adapter FaceID와 마찬가지로, InstantID를 돌리려면 InsightFace 라이브러리가 필요합니다. 이미 FaceID로 작업해보신 분이라면 별도로 이미 설치되어 있을 겁니다. 

그렇지 않으신 분들은 여기를 읽고 설치하시면 됩니다.

1 단계: 워크플로 불러오기

아래는 InstantID를 사용할 수 있는 기본 워크플로입니다. json파일이나 아래 그림을 다운로드 받은 후, ComfyUI 화면에 Drag&Drop하면 사용할 수 있습니다.

ip-adapter-workflow.json
0.01MB

2 단계: 빠진 커스톰 노드 설치하기

이 워크플로를 불러오면 대부분 아래와 같이 빨간 메시지 창이 뜰텐데요, 해당 커스톰 노드가 설치되어 있지 않다는 뜻입니다. 여기를 보시면 해결하실 수 있습니다.

3 단계: 모델 다운로드

ComfyUI\models 폴더에 들어가서 instantid 라는 폴더를 새로 생성합니다. 

InstantID IP-Adapter 모델을 다운로드 받아, 위에서 생성한 instantid 폴더에 넣어줍니다. (위의 AUTOMATIC1111과 동일한 이름이 되도록 ip-adapter_instant_id_sdxl.bin 라는 이름으로 변경해주셔도 됩니다)

InstantID ControlNet 모델을 다운로드 받아 ComfyUI\models\controlnet 폴더에 넣어줍니다. ( control_instant_id_sdxl.safetensors 로 이름을 변경해주셔도 됩니다. 위에서 AUTOMATIC1111에서 설정한대로 설정되어 있고, 모델을 공유하고 있다면 따로 받으실 필요 없습니다)

마지막으로 antelopev2 face 모델을 다운로드 받고, zip 파일을 압축해제한 후, ComfyUI\models\insightface\models 폴더에 들어가 antelopev2 폴더를 생성한 후 넣어줍니다.

4 단계: 모델 설정

먼저 [Load Checkpoint] 노드에서 SDXL Turbo 모델을 선택합니다. 이 예제에서는 DreamShaper SDXL Turbo 모델을 사용합니다. 참고로, 저는 SDXL 모델은 XL이라는 하위 폴더를 만들어서 저장해두었습니다.

다음으로 [Load InstantID Model] 노드에 InstantID IP-Adapter 모델을 선택합니다. 

또, [Load ControlNet Model] 노드에는 InstantID ControlNet 모델을 선택합니다.

5단계 이미지 생성

마지막으로 [Load Image]에 원하는 얼굴을 넣고 [Queue Prompt] 버튼을 누르면 이미지가 생성됩니다.

아래는 생성된 결과입니다.

예쁘긴 하지만, 신현빈 배우님이라고 보기엔 좀... 그렇네요.

마지막으로 김태리님으로 한번 더 시도해 봤습니다. 머... 비슷하네요. ㅠㅠ

ComfyUI에서 InstantID를 사용하는 팁

여기에 들어가시면 다른 InstantID용 워크플로가 있으니 참고하세요.

이미지 크기를 1024x1024로 하면 좋은 결과가 나오지 않는답니다. 그래서 이 워크플로에서도 1016x1016로 설정했다고 합니다.

그리고 이미지를 좀 더 바꿔보고 싶으시다면 아래의 설정을 바꿔보면 도움이 된다고 합니다.

  • [Apply ControlNet (Adv.)] 노드의 Strength와 ending percent
  • [Apply InstantID] 노드의 Weight 와 end_at
  • [KSampler] 노드의 CFG 척도

결론

제가 계속 여러가지 설정을 바꿔가면서 테스트해봤지만, 저는 이 InstantID보다, 사진을 4개 넣어서 사용하는 FaceID 기법이 훨씬 얼굴을 잘 복제하는 것 같습니다. 물론 FaceID 기법에서는 SD1.5 모델을 사용하기 때문에 1:1로 비교하긴 힘들겠지만요. ㅠㅠ

참고로 아래는 신현빈 배우님을 FaceID 기법으로 생성한 예입니다. 훨씬 얼굴이 살아있네요. 물론 제가 보기에요. ㅎㅎㅎ

이상입니다.

민, 푸른하늘

====