AI 이미지/AUTOMATIC1111

After Detailer(adetailer): 얼굴 자동 수정

하늘이푸른오늘 2023. 7. 24. 11:59

After Detailer(adetailer)는 인페인트를 자동화시켜주는 스테이블 디퓨전 AUTOMATIC1111 확장입니다. 이 확장을 사용하면 얼굴이 일그러지는 것 같은 일반적인 문제를 빠르게 수정할 수 있습니다. 

After Detailer 확장 설치

After Detailer 확장을 설치하는 방법은 아래와 같습니다. 

1. Extension 페이지로 들어가서 "Install from URL" 탭으로 들어간 뒤, 아래의 내용을 [URL]에 입력합니다.

https://github.com/Bing-su/adetailer

After Detailer 확장 설치1
After Detailer 확장 설치1

2. Install 버튼을 누르고 잠시 기다립니다. 설치가 완료되면 아래와 같이 Installed 탭으로 들어가 adetailer가 추가되었는지 확인하고 [Apply and restart UI] 버튼을 눌러줍니다.

After Detailer 확장 설치2
After Detailer 확장 설치2

인페인트로 얼굴 수정하기

작은 얼굴 생성시 문제

모델 : Realistic Vision v2
프롬프트: A woman sitting on a giant ice cream, which is adorned with vibrant colors, delightful, and rainbow sprinkles. sweetness and joy, happiness, enchanting fusion, imagination and a fantastical world,fantasy, high contrast, ink strokes, explosions, over exposure, purple and red tone impression, abstract, negative space
부정적 프롬프트: ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, bad anatomy, watermark, signature, cut off, low contrast, underexposed, overexposed, bad art, beginner, amateur, distorted face, b&w, nude, nsfw, EasyNegative
이미지 크기: 512x768

SD 생성이미지: A woman sitting on a giant ice cream
SD 생성이미지: A woman sitting on a giant ice cream

보시는 것처럼 얼굴이 작고 해상도가 낮기 때문에 얼굴을 차지하는 픽셀이 많지 않습니다. 이럴 경우 VAE가 얼굴을 생성하는데 충분한 픽셀을 확보하지 못하여 일그러지게 됩니다. 

이러한 경우, 대부분 생성된 이미지 아래에 있는 [Send to Inpaint] 버튼을 눌러 인페인트로 보내서 수정하게 됩니다.

SD - 인페인트로 보내기
SD - 인페인트로 보내기

그다음엔 얼굴 주변에 마스크를 입힙니다.

SD - 인페인트 마스크
SD - 인페인트 마스크

이제 다음과 같이 설정하고 [Generate] 버튼을 누릅니다.

  • Mask mode: Inpaint masked
  • Masked content: Original
  • Inpaint area: Only masked
  • Denoising strength: 0.5

아래가 결과 영상입니다. 얼굴 각도가 이상함에도 얼굴은 정말 잘 그려졌습니다. 

SD 생성이미지: A woman sitting on a giant ice cream - 인페인트 결과
SD 생성이미지: A woman sitting on a giant ice cream - 인페인트 결과

이때 인페인트 영역을 "only masked"로 설정하는 것이 매우 중요합니다. 아래 그림은 생성 처리 중간을 캡처한 것으로, 보시는 것처럼 마스크 지역 주변만 512x768로 재 생성하기 때문에 얼굴을 훨씬 고해상도에서 생성한 뒤 다시 축척을 원래 해상도로 줄이는 방식으로 처리되기 때문입니다. 

Inpaint - only masked의 효과
Inpaint - only masked의 효과

After Detailer를 사용한 자동 인페인트

After Detailer를 사용하면 이 프로세스를 자동적으로, 그리고 훨씬 더 나은 방법으로 처리할 수 있습니다. After Detailer는 얼굴 인식 모델을 사용해 얼굴을 감지하고, 자동적으로 인페인트 마스크를 생성합니다.

After Detailer를 사용한 자동 인페인트 마스크
After Detailer를 사용한 자동 인페인트 마스크

그다음 마스크된 영역에 대해서만 인페인팅을 실시합니다.  그 결과는 아래와 같습니다.

After Detailer를 사용한 결과
After Detailer를 사용한 결과

이 정도면 정말 꼭 필요한 확장 기능이라 하지 않을 수 없네요.

After Detailer  사용방법

Txt2Img에서 사용하는 방법

txt2Img에서 After Detailer를 사용하려면, 확장 설치후 새로 생긴 ADetailer 영역을 확장하고, [Enable ADtailer] 체크박스를 선택해주면 됩니다. ADtailer 모델은 드롭다운에서 face_yolo8n.pt를 선택합니다.

After Detailer 확장 활성화
After Detailer 확장 활성화

이 정도만해도 얼굴을 복원하는 기본 기능은 충분합니다. 

[Generate] 버튼을 누릅니다. 아래와 같이 얼굴이 작은데도 일그러지지 않게 생성되었습니다.실제로 8개의 이미지를 생성했는데, 그중에서 이상하게 생성된 얼굴은 하나도 없었습니다. 정말 괜찮은 것 같네요.

SD 생성이미지: A woman sitting on a giant ice cream - ADetailer 적용
SD 생성이미지: A woman sitting on a giant ice cream - ADetailer 적용

 작업과정을 보면 먼저 해당 배치에 설정한 수 대로 이미지를 생성한 후, 각각의 이미지에 얼굴이 포함된 부분을 인식하고, 그 부분의 얼굴을 새로 묘사한 후 최종 이미지를 마드는 순서대로 진행됩니다. 아래는 배치사이즈 = 4 일때 처리과정입니다. 중간에 한줄로 되어 있는 것들이 얼굴을 인식하고 처리하는 과정입니다.

SD - ADetailer 작업과정
SD - ADetailer 작업과정

img2img에서 사용하는 방법

After Detailer를 image-to-image에도 사용할 수 있습니다. 이렇게 하면 전체 이미지에 대해 얼굴을 복원하고 디테일을 추가할 수 있는 장점이 있습니다. txt2img 페이지에서 생성한 이미지 중에서 마음에 드는 것을 골라 [Send to img2img] 버튼을 누릅니다. 그러면 생성했을 때의 매개변수(프롬프트, 크기 등)은 저절로 넘어가게 됩니다.

SD - img2img로 보내기
SD - img2img로 보내기

img2img의 잡음 제거 강도(denoisingg strength)를 0.1 처럼 낮은 값으로 바꿔주고 ADetailer 부분을 활성화한뒤(설정은 바꿀 필요 없이) [Generate] 버튼을 눌러줍니다. 그러면 아래처럼 얼굴이 수정됩니다. 아주 간단하면서도 확실하게 처리되네요!!

After Detailer의 파라미터

지금까지는 그냥 활성화만 시킨 상태로 사용했지만, After Detailer에는 여러가지 파라미터가 많습니다. 여기에서는 이러한 파라미터에 대해 좀 더 알아보겠습니다.

After Detailer의 파라미터
After Detailer의 파라미터

ADetailer model(Detection model)

ADetailer model 다운로드를 누르면 여러가지 감지 모델(detection model)을 선택할 수 있습니다.  아래와 같이 여러개의 모델이 있는데...

After Detailer의 Detection model
After Detailer의 Detection model

다음과 같은 4가지 그룹으로 구분할 수 있습니다.

  • Face_xxxx : 얼굴을 감지하고 복원합니다.
  • Hand_xxxx ; 손을 감지하고 복원합니다.
  • Person_xxxx : 사람 전체를 감지하고 복원합니다.
  • Mediapipe_face_xxxxxx : 얼굴을 감지하고 복원합니다.

가장 유용한 것은 face_yolo 와 person_yolo 모델입니다. YOLO(You Only Look Once, 실시간 객체 감지 시스템의 일종, 여기 참조) 모델은 얼굴 및 객체 감지에 뛰어나며, 인페인트와도 잘 작동합니다. 

참고로 아래와 같이 감지 영역과 신뢰도 숫자가 표시된 이미지를 얻으려면 Settings->ADetailer에 들어가서 "Save mask preview" 체크박스를 체크하면 됩니다.

Face_yolo_8n Inpainted
Person_yolo_8n_seg Inpainted

아래쪽의 예를 잘 살펴보면, 사람 전체를 인식해서 다시그리는 경우, 얼굴은 face 모델을 사용할 때보다 부족함을 느낄 수 있을 것입니다. 즉, 사람이 이미지의 상당부분을 차지하고 있을 때 사람 전체를 인식시키는 것은 별로 좋은 방법이 아니라는 것입니다. 가능하다면 부분적으로 나누어 인페인트하는 것이 좋은 결과를 얻을 수 있스니다.

Mediapipe_face 는 될 때는 잘되고, 안될때는 아무것도 안되는 모델입니다. 얼굴이 흐릿할 때는 제대로 작동하지 않으므로 애초에 얼굴이 필요합니다....???

hand 모델은 손을 복원할 때 사용합니다. 하지만, 너무 기대를 하지 않는 게 좋습니다. 스테이블 디퓨전 자체가 손은 잘 그리지 못하기 때문입니다.

원 글에서는 YOLO 8n 과 YOLO 8s를 비교해 봤는데, 8n이 크기는 1/3뿐이 안되지만 속도가 훨씬 빠르고, 성과도 쓸만하다고 하네요. 얼굴을 감지하기 힘들 경우에만 8s로 바꿔 쓰면 된다고 추천하였습니다. 

또한 두가지 감지 모델을 모두 사용하고 싶을 경우, 아래와 같이 "2nd" 탭을 누르고 다른 모델을 추가로 선택해 주면 됩니다. 

이렇게 설정하면 얼굴을 감지한 후, 손을 감지하고, 그다음에 두개 모두 한꺼번에 인페인트 처리를 하게 됩니다.

얼굴 감지 손 감지 인페인트

인페인트에 다른 프롬프트 사용하기

ADetailer 인페인트 사용시 다른 프롬프트를 사용하면, 예를 들면 다른 얼굴로 변경시킬 수 있습니다. ADetailer 영역에 있는 프롬프트/부정적 프롬프트 항목에 입력해주면 됩니다.

ADetailer 프롬프트 영역
ADetailer 프롬프트 영역

예를 들면 아래처럼 유명인의 얼굴을 넣고 싶을 때 사용할 수 있습니다. 아래에서는 키워드 블렌딩에서 설명하는 것처럼 엠마 왓슨의 가중치를 낮춰주었습니다. 엠마 왓슨 키워드는 너무 강력해서 좀 낮춰주어야 하기 때문입니다.

(Emma Watson:0.8), Ana de Armas

SD 생성이미지: A woman sitting on a giant ice cream - 유명인 얼굴 삽입
SD 생성이미지: A woman sitting on a giant ice cream - 유명인 얼굴 삽입

그냥 원래 프롬프트에서 유명인 이름을 넣으면 되지, 왜 이렇게 번거럽게 작업하느냐 하는 의문이 드실 수 있는데, 연관 효과(association effect) 때문입니다. 유명인 들은 시상식 등과 같은 특정한 형태의 사진이 많기 때문에 그냥 유명인 사진을 넣으면 전체 사진의 품질에 영향을 미치기 때문입니다. 따라서 유명인 이름을 빼고 이미지를 생성한 후, 얼굴만 유명인으로 대체하는 게 좋습니다.

마지막으로 LoRA를 프롬프트에 사용할 수 있습니다. 아래는 아이유 LoRA를 이용해 생성한 이미지입니다. 다만, 이렇게 할 때 처음에는 잘 안되서 여러번 시도를 하다가, LoRA 가중치를 1.2 로 올리고, Denoising Strength를 0.6으로 올리고 샘플링 스텝수도 30으로 올려 돌려주었습니다. ADetailer 에 대한 프롬프트는 아래와 같습니다. 아무튼 많이 테스트를 해봐야 하네요.

모델: ChilloutMix
프롬프트: A young and beautiful Asian woman sitting on a giant ice cream, which is adorned with vibrant colors, delightful, and rainbow sprinkles. sweetness and joy, happiness, enchanting fusion, imagination and a fantastical world,fantasy, high contrast, ink strokes, explosions, over exposure, purple and red tone impression , abstract, negative space
부정적 프롬프트: underage, immature, disfigured, deformed, ugly
ADetailer 프롬프트: A young and beautiful Asian woman <lora:iu_v35:1.2>

SD 생성이미지: A woman sitting on a giant ice cream - 아이유 LoRA 사용
SD 생성이미지: A woman sitting on a giant ice cream - 아이유 LoRA 사용
SD 생성이미지: A woman sitting on a giant ice cream - 아이유 LoRA 사용
SD 생성이미지: A woman sitting on a giant ice cream - 아이유 LoRA 사용

Detection

ADetailer - Detection 모델 설정
ADetailer - Detection 모델 설정

Detection model confidence threshold : 위쪽 이미지 중에서 얼굴 주변에 숫자가 써진 사각형이 기억나시나요? 이 숫자가 신뢰도(confidence score)입니다. 0.8이라는 것은 해당 영역이 얼굴일 가능성이 0.8이라는 뜻이죠. 여기에 쓰여진 confidence threshold(신뢰 한계)는 최소 신뢰도를 의미합니다. 이 값을 0.9로 설정할 경우, 신뢰도가 0.8인 얼굴 영역은 얼굴이라고 인식하지 않는다는 뜻입니다. 그러므로 기본 값(0.3)정도로 그냥 사용하시는 게 좋습니다. 만약 얼굴을 인식하지 못할 경우에는 낮춰줄 수 있습니다.

Mask min/max area ratio :  감지하고 자 하는 대상의 상대 크기를 의미합니다. 예를 들어 최소 면적 비율(min area ratio)를 0.1로 설정하면 이미지 전체 크기보다 10%보다 작은 영역은 감지에서 제외시킨다는 뜻입니다. 기본 값으로 사용하면 문제가 없을 것 같습니다만, 원하지 않는 작은 물체가 감지되면 최소값을 올려볼 수 있습니다.

Mask Preprocessing(마스크 전처리)

ADetailer - Mask Preprocessing 설정
ADetailer - Mask Preprocessing 설정

Mask x/y offset : 마스크 영역을 x/y 방향으로 이동시키는 옵션입니다. 쓸데 없네요.

Mask erosion(-)/dilation(+) : 마스크 영역을 키우거나 줄이는 옵션입니다.

Mask merge mode : 마스크가 겹칠 때 처리하는 방법을 지정합니다. None의 경우엔 각각의 마스크를 별도로 처리하고, Merge의 경우엔 한꺼번에 합쳐서 처리하며, Merge and invert는 마스크 영역을 합친 뒤 마스크 되지 않은 영역만 inpaint를 적용합니다.

Inpainting(인페인트)

ADetailer - Inpainting 설정
ADetailer - Inpainting 설정

많은 설정이 있는데 이중에서 가장 종요한 것은 Inpaint denoising strength 입니다. 이는 자동 인페인팅에 사용되는 잡음 제거 강도를 제어합니다. 이 값을 높이면 더 많은 변화가 일어납니다.

또한 inpaint only masked 체크박스는 위에서 설명한 것처럼 인페인트 영역을 제한하여 더 자세하게 인페인트 하도록 이 옵션을 항상 켜두는 것이 좋습니다. 

나머지는 인페인트에 관련된 옵션인데, 그냥 기본값으로 사용해도 무방합니다.

ControlNet과 ADetailier 를 함께 사용하기

ControlNet은 스테이블 디퓨전에서 가장 중요한 도구중의 하나입니다. 이 ControlNet을 After Detailer와 함께 사용할 수도 있습니다. 

저는 그다지 필요할 것 같지 않아 생략합니다. 원하시면 원본 글을 읽어보시기 바랍니다.

얼굴 복원 옵션과 After Detailer 비교

Face restoration(얼굴 복원)과 After Detailer 모두 일그러진 얼굴을 복원하는데 사용할 수 있습니다. Face restoration은 CodeFormer 혹은 GFGAN과 같은 별도의 AI 모델을 사용해 얼굴을 복원합니다. 반면 After Detailer의 경우, 이미지에 포함된 얼굴/손 등을 감지한 후, 확대하여 인페인트를 실시하고 다시 원래의 이미지 축척에 맞게 줄이는 방식으로 작동됩니다.

저는 아래와 같은 이유로 ADetailer와 같은 인페인트 방식이 더 나은 것 같습니다. (다만 이미지 생성 속도는 느려집니다.)

  • 얼굴 복원 모델은 사용하는 스테이블 디퓨전 모델과 어울리지 않는 스타일을 생성할 수 있습니다.
  • 프롬프트와 ControlNet을 사용해서 인페인트를 좀더 원하는 대로 제어할 수 있습니다.

꼭 ADetailer를 사용해야 할까?

인페인트가 필요한 이미지를 생성하는 경우, After Detailer를 사용하면 상당부분 자동화가 가능합니다. 즉, 아래와 같은 일련의 수작업을 한꺼번에 처리해줍니다.

  1.  txt2img에서 이미지를 생성한다.
  2. 이미지를 inpaint로 보낸다.
  3. 인페인트 마스크를 생성한다.
  4. ControlNet을 설정한다(옵션)
  5. 인페인트 작업을 수행한다. 

특히 이 확장은 동일한 설정으로 많은 이미지를 생성할 수 있다는 장점이 있습니다. 즉, 배치 사이즈를 크게해서 생성하면 각각 다른 포즈로 안정되게 이미지를 생성할 수 있다는 것입니다. 만약 각각의 이미지를 인페인트한다면 엄청 지루할 겁니다. 즉, 인페인트로 얼굴을 수정해야 하는 작업에는 필수적!! 이라고 할 수 있겠네요.

마지막으로... 이 글을 마치기 전에 Clipdrop 사이트에서 아래와 같은 프롬프트로 이미지를 생성해봤습니다. 여러가지 스타일로 생성해봤는데... 아직 LoRA를 지원하지 않는 등 여러가지 한계가 많지만, 구지 After Detailer와 같은 도구를 쓸 필요 없을 정도로 훌륭한 품질이 나오네요. SDXL이 정식 공개되면 어떻게 변할지... 좀더 지켜봐야겠네요. 

프롬프트: A woman sitting on a giant ice cream, which is adorned with vibrant colors, delightful, and rainbow sprinkles. sweetness and joy, happiness, enchanting fusion, imagination and a fantastical world,fantasy, high contrast, ink strokes, explosions, over exposure, purple and red tone impression, abstract, negative space

민, 푸른하늘

이 글은 Stable-diffusion-art.com의 글을 번역하면서 일부 수정한 글입니다.