AI 이미지/AUTOMATIC1111

스테이블 디퓨전에서 손가락 수정하기

하늘이푸른오늘 2024. 3. 16. 12:37

스테이블 디퓨전에서 이미지를 생성하면 손 형태가 잘못되거나 손가락이 4개 혹은 6개 등 이상해 지는 경우가 적지 않게 발생합니다. 이 글에서는 이러한 결함이 발생한 손 이미지를 수정하는 방법을 다룹니다.

소프트웨어

이 글에서는 스테이블 디퓨전용 웹 GUI 중에서 가장 널리 사용되고 있는 AUTOMATIC1111을 사용합니다. AUTOMATIC1111은 Mac 이나 Google Colab에서도 사용할 수 있지만, 제 블로그에서는 윈도11에서 사용하는 방법만 다루고 있습니다. 스테이블 디퓨전에 대해 좀 더 알고 싶으시면 기본적인 이론이나 초보자 가이드를 참고하세요.

간단한 인페인트

생성한 이미지중 일부가 잘못되었을 때 수정하는 가장 쉬운 방법은 인페인트 기능을 활용하는 것입니다. SD 1.5 모델에도, SDXL 모델에도 적용할 수 있습니다.

1단계: 이미지 생성

txt2img 페이지에서 아래와 같이 이미지를 생성합니다.

모델 : Realistic Vision
프롬프트: a cute woman showing two hands, christmas, palm open, town, decoration
샘플러 : DPM++ 2M Karras
샘플링 단계 : 20
CFG 척도 : 7
이미지 크기: 512 x 768

이렇게 생성하면, 대부분의 이미지에서 손이 엉망으로 생성됩니다. SD 1.5에서는 거의 이렇게 생성됩니다.

아래에서는 원본 글에 있는 이미지를 사용하겠습니다.

2단계: 인페인트

생성된 이미지 아래에 있는 버튼들중 팔레트 모양 버튼을 누르면 인페인트 탭으로 해당 이미지와 함께 txt2img의 설정이 전달됩니다.

이제 새로 그리고 싶은 부분에 마스크를 칠해줍니다. 한번에 한쪽 손만 처리하는 게 좋습니다.

이때 "Inpaint Area"는 "Whole Picture"즉, 전체 이미지를 새로 그리는 방식이 좋고요, "Denoising Strength"는 0.5 낮추고 [Generate] 버튼을 눌러줍니다.

한번에 괜찮게 생성되기 힘들기 때문에, 여러 이미지를 생성하고 괜찮은 것을 골라야 합니다.

이렇게 한쪽 손이 완성되면, 다시 반대쪽 손에 대해 inpaint를 적용하는 방식을, 원하는 이미지가 나올때까지 반복해주면 됩니다. 아래는 결과입니다.

콘트롤넷 DWPose 인페인트

DWPose는 ControlNet Openpose를 위한 강력한 전처리기입니다. DWPose를 사용하면 손을 포함해서 인간의 자세를 확실하게 추출할 수 있습니다. 

그런데, 여기에서는 콘트롤넷을 위한 이미지를 별도로 입력하지 않으면서도 손을 수정하는 방법입니다.

1단계: 인페인트 설정

우선 아래와 같이 양손 모두 마스킹해줍니다. 이때 손뿐만 아니라 약간 넓게 마스킹해주는 것이 좋습니다.

"Inpaint Area"는 "Whole Picture" 로 설정하고, "Denoising Strength"는 0.7로 설정합니다. 

2단계: 콘트롤넷 설정

콘트롤넷은 아래와 같이 설정합니다. 위에서 언급한 것처럼, 별도의 이미지를 추가해주지는 않습니다.

  • Enable: Yes
  • Control Type: OpenPose
  • Preprocessor: dw_openpose_full
  • Model: control_v11p_sd15_openpose

3단계: 이미지 생성

이제 [Generate]를 누르면 이미지가 생성됩니다.

보시는 것처럼 완전하지는 않지만, 적어도 손가락이 5개인 이미지가 생성됩니다. 

어떻게 가능한 걸까요? 인페인트를 할 때 콘트롤넷을 켜면 인페인트할 이미지를 기준으로 DW Openpose 전처리기가 작동됩니다. 이때 원본이미지에는 손가락 수가 이상하더라도, 아래와 같이 정상적인 형태로 인간의 자세를 뽑아냅니다. 이때문에 손가락이 정상적인 이미지가 생성되는 거죠.  다만 손가락의 길이 등은 불완전할 수 있습니다.

손을 다듬기

좀더 다듬어 주려면 인페인트를 반복하면 됩니다. 예를 들어 아래와 같이 손가락이 너무 길면 새로 그리고자하는 부분만 마스킹해주면 됩니다.

여기에서는 ControlNet은 꺼주고 [Generate]를 눌러줍니다.

위가 생성된 결과입니다. 손가락이 너무 짧아졌네요. 마스킹을 너무 좁게 잡아서 발생하는 현상입니다. 따라서 아래와 같이 주변을 포함해서 마스크를 그려줍니다.

이때 "Denoisingn strength"를 0.85로 좀 더 높게 설정하여 새로 그려줍니다. 그러면 아래와 같이 더 괜찮게 수정됩니다. 

괜찮은 이미지를 얻기 위해서는 위와 같은 과정을 여러번 반복해야 할 수 있습니다. (사실 오른손은 너무 길쭉해서 보기가 싫네요. ㅎㅎ)

업스케일(Upscaleing)

마지막으로, ControlNet Tile Upscale 을 사용하면 저해상도로 인해 발생하는 이미지 결함을 일부 수정할 수 있습니다. 

먼저 이미지 아래에 있는 버튼중 액자모양의 버튼(Send to Img2img)을 누릅니다.

그러면 해당 이미지와 관련 설정이 img2img 페이지의 Generation>img2img 탭으로 들어갑니다.

img2img 설정은 아래와 같습니다.

확대 배율(Resize by) : 2
잡음제거 강도(Denoising Strength) : 0.9

또한 ControlNet 영역은 아래와 같이 설정합니다.

Enable: Yes
Control Type: Tile/Blur
Preprocessor: tile_resample
Model: control_v11f1e_sd15_tile

이제 [Generate] 버튼을 누르면 확대된 이미지가 생성되는데, 이때 손도 정상적으로 생성됩니다.

SDXL 모델의 경우

이상의 기법들은 SD1.5 모델에만 해당됩니다. 

SDXL 모델의 경우, 이렇게 인체의 형태가 잘못되는 경우가 많지 않습니다. 하지만, 이런 문제가 발생했고, 위와 같은 기법을 적용하려면, SD 1.5 모델을 사용하고, 이미지 크기를 SD 1.5 용에 맞도록 조정한 후 적용해야 합니다(예: 768 x 512)

Hand Refiner

Hand Refiner는 손을 수정하기 위한 콘트롤넷 모델입니다.

HandRefiner의 추론 파이프라인 (출처 : 논문)

이 모델의 전처리기는 Mesh Grahpormer라는 손 복구 모델을 사용하여 복구된 손에 대한 mesh를 생성하고, 이 메쉬를 depth map으로 변환합니다.

이 콘트롤넷 모델은 손 생성을 조건부여하도록 학습된 depth 모델입니다. 따라서 일반적인 depth모델을 사용할 수 있지만, 결과는 좋지 않을 가능성이 높습니다.

AUTOMATIC1111에서 HandRefiner 사용하기

HandRefiner 콘트롤넷 모델을 다운로드 받고, stable-diffusion-webui\models\ControlNet에 넣어줍니다. 

이미지를 생성한 후, [Send to inpaint] 버튼을 누릅니다.

재생성하고자 하는 영역을 마스킹합니다. 손만 마스크하는 게 아니라, 아래 그림처럼 조금 넓은 영역을 마스킹하는 것이 좋습니다. 

인페인트 설정은 아래와 같습니다.

Inpaint Area : "Whole picture"
이미지 크기 : SD 1.5에 맞는 크기 (예 768x512(
잡음제거 강도(Denoising Strength) : 0.75

또한 ControlNet 영역은 아래와 같이 설정합니다.

Enable: Yes
Control Type: OpenPose
Preprocessor: depth_hand_refiner
Model: control_sd15_inpaint_depth_hand_fp16

이 전처리기가 보이지 않을 경우, 확장(extension)에 들어가 업데이트를 시켜주면 됩니다. 또한 모델이 보이지 않을 경우 모델 드롭다운 옆에 있는 refresh 버튼을 눌러주면 나타납니다.

이제 [Generate]를 누르면 깔끔한 손을 보실 수 있습니다. 

아래는 콘트롤넷으로 생성된 이미지입니다. 이걸 보니 위의 이미지에서 손이 깔끔해진 이유를 알겠네요. ㅎㅎ

이상입니다. 이글은 https://stable-diffusion-art.com/fix-hands/ 을 번역하여 작성한 글입니다.

민, 푸른하늘

====