스테이블 디퓨전을 이미지 편접에 적극 활용하다보면 인페인트(Inpaint) 기능이 상당히 유용합니다. 본문에서는 이런 인페인트 작업 시 조금 더 자연스럽게 이미지를 수정할 수 있도록 직접 ComfyUI에서 inpaint 모델 합성 및 사용하는 방법에 대해 살펴봅니다.
Inpaint 모델 합성의 필요성
사실 스테이블 디퓨전을 이미지 생성 역할로만 주로 사용하시거나, 혹은 극소부위만 수정하시는 분들은 인페인트 모델 자체의 필요성을 못느끼실 수 있습니다. 그런데 인페인트 기능을 사용하시던 중 아래와 같은 경험을 하신 분들은 인페인트 모델을 적극 활용해보시길 권장드립니다.
위 예시는 원본이미지의 인물을 제외하고 배경을 마스킹한 뒤, 인페인트를 진행하는 경우, Inpaint 모델을 이용해 인페인트를 진행한 결과(세번재 이미지)와 일반 모델로 인페인트를 진행한 결과(네번째 이미지)의 차이점을 잘 드러내고 있습니다. 일반 모델로 인페인트를 진행하면, 보시는 바와 같이 마스킹이 되지 않은 부분의 인물을 인지하지 못하고, 마스킹한 영역에 새로운 인물을 추가로 그려넣으려는 시도를 하다보니, 인물의 하반신쪽에 의도치않은 구조물?이 등장합니다. 반면, 인페인트 모델을 활용했을 때는 깔끔하게 배경만 새로 그려진 것을 볼 수 있습니다.
ComfyUI Inpaint 모델 합성 방법
ComfyUI에서 Inpaint 모델을 합성하는 방법은 생각보다 매우 쉽습니다. 특별한 커스텀노드를 설치할 필요도 없으며, 기본 노드들로 충분히 구현이 가능합니다. 먼저 아래와 같이 워크플로우를 구성해야 합니다.
위 예시와 같이 3개의 체크포인트 로더와, 2개의 모델병합 노드가 필요합니다. 먼저 2개의 병합 노드의 역할을 살펴보면 다음과 같습니다.
- ModelMergeSubtract : model1에서 model2를 뺌
- ModelMergeAdd : model1과 model2를 합함
첫 번째 모델병합(ModelMerge) 차감(Subtract) 노드의 경우 연결된 2개의 체크포인트 모델의 차이만 추출해서 출력단의 모델로 넘겨줍니다. 우리는 우선 위 예시와 같이 SD1.5 기본 체크포인트 모델과, SD1.5 인페인트 모델을 다운받아 준비합니다. 그 이후 SD1.5 인페인트 모델에서 SD1.5 기본모델을 빼주면, 인페인트 역할을 하는 부분만 추출해낼 수 있습니다. SD1.5 기본 모델이 없는 분들은 아래의 허깅페이스 페이지에서 다운로드 받을 수 있습니다.
두 번째 모델병합 결합노드에서는 이렇게 추출한 인페인트 역할 부분을, 우리가 실제로 사용하는 임의의 모델에 합해주면 됩니다. 예시에서는 epicrealism 모델에 인페인트 추출 모델을 합성해준 것입니다. 이 상태로 모델 출력단의 모델을 KSampler로 넘겨 인페인트를 진행하시면 됩니다.
Inpaint 모델 저장 방법
위에서 살펴본 방식으로 매번 워크플로우를 새로 구성해서 인페인트 모델을 사용하는 것이 불편하신 분들은, 아래와 같이 CheckpointSave 노드를 추가해 인페인트 모델을 따로 저장하여 사용하실 수 있습니다.
모델 병합 노드의 출력단을 CheckpointSave 노드로 입력한 뒤, 기존의 원모델 CLIP과 VAE를 함께 연결해준 뒤, 파일명을 설정해주시면, 인페인트 모델이 저장됩니다. 이 때 저장된 인페인트 모델은 ComfyUI의 output 폴더(이미지 생성시 저장되는 위치)에 저장되므로, 필요시 해당 모델을 로드하여 사용하시면 됩니다.
인페인트 모델 적용
앞서 생성한 인페인트 모델을 적용해 이미지를 수정해보도록 하겠습니다. ComfyUI에서는 인페인트를 진행하는 방법도 사용자마다 다르게 워크플로우를 구성할 수 있습니다. 대표적인 방법으로는 아래 예시처럼 set Latent Noise Mask 노드를 이용하는 방법이 있습니다.
Load Image로 불러온 픽셀 이미지를 잠재영역(Latent)으로 보낸 뒤, 잠재 노이즈 마스크를 씌워 KSampler로 보내는 방식이며, 가장 널리 알려진 인페인트 방법이기도 합니다. 그런데, 아무래도 불필요한 픽셀/잠재영역 간 변환이 일어나면 화질 열화가 발생할 수 밖에 없으므로, 본문에서는 아래와 같이 이를 대체할 InpaintModelConditioning 노드를 사용합니다.
좌 상단의 노란 음영 영역에는 앞서 소개드린 방식으로 inpaint 모델 합성을 진행하고, 이렇게 만들어진 모델을 KSampler로 넘겨줍니다. 한편 프롬프트와 KSampler 사이에 InpaintModelConditioning 노드를 배치하고, 원본 이미지를 로드해서 해당 노드에 연결해줍니다. 이렇게 연결하면 불필요한 VAE 변환을 한 번이라도 줄일 수 있기 때문에, 최종 이미지의 화질 측면에서 조금이나마 이득을 볼 수 있습니다.
Load Image 노드에서 마우스 우클릭 > Open in MaskEditor를 눌러 필요 부위를 마스킹한 뒤, 인페인트를 진행할 수 있습니다. 인페인트 마스킹이 익숙하지 않은 분들은 아래 글을 참고하시기 바랍니다.
본문의 내용은 애포크 전자책의 일부분을 발췌한 것입니다. 무단 복제, 배포, 2차 저작물 작성 및 상업적 이용을 삼가주세요.