AI 이미지/워크플로 따라하기

자동 인페인트/아웃페인트 - ComfyUI

하늘이푸른오늘 2024. 1. 4. 02:07

이미지 생성형 인공지능을 사용하다보면, 일부분만 새로 그리거나(인페인트) 바깥쪽을 더 그리고 싶은(아웃페인트) 경우가 있습니다. 그런데 인페인트 또는 아웃페인트를 자동으로 처리해주는 방법을 소개시켜 드립니다.

이 글의 목차는 아래와 같습니다.

인페인트/아웃페인트란?

인페인트(inpainting)란 이미지의 일부만 다시 그리는 것을 말합니다. 옷이나 스타일을 바꾸고 싶거나 배경중 일부를 지우고 싶을 때 등에 사용합니다. 아래의 예에서는 얼굴을 새로 그렸습니다. SD1.5 초창기의 경우 손 발이 두개가 생기는 등의 오류가 많이 발생해서 인페인트는 거의 필수나 다름 없었습니다. 인페인트에 대한 좀 더 자세한 사항은 인페인트 완벽 가이드를 읽어보시기 바랍니다.

아웃페인트(outpainting) 이란 이미지를 바깥쪽을 채우는 방식으로 이미지를 키우는 것을 말합니다. 아래의 예에서는 좌측 원본 이미지(1024x1024)를 1536x1024 크리고 늘렸습니다. 물론 바깥쪽은 스테이블 디퓨전이 자동으로 채워준 것입니다. 

사실 기술적으로 보았을 때는 인페인트와 아웃페인트가 다르지 않습니다. 새로 그려야 하는 부분이 그림 안쪽인지 바깥쪽인지만 차이가 날 뿐입니다. 그래서 ComfyUI의 인페인트 예제 사이트에 들어가 보시면 인페인트와 아웃페인트를 함께 다루고 있습니다.

자동 인페인트/아웃페인트가 해주는 것

이 글에서 소개해주는 워크플로는 무엇보다 인페인트/아웃페인트를 동시에 처리할 수 있습니다. 물론 개별적으로도 사용할 수 있고요.

그 보다 더 중요한 것은 프롬프트를 입력할 필요가 없다는 것입니다. 원래 인페인트/아웃페인트를 위해서는 원본 이미지를 사용했을 때의 프롬프트를 사용해서 생성하여야 합니다. 만약 프롬프트가 없는 이미지라면 이미지에서 프롬프트를 알아내는 방법에 나와있는 기법을 사용해서 프롬프트를 알아낸 뒤, 그 프롬프트를 사용해 인페인트/아웃페인트를 실행해야 합니다.

그런데, 이 워크플로는 프롬프트가 필요 없습니다. 이미지에서 프롬프트를 추출해서 이를 사용해서 인페인트/아웃페인트를 실행하기 때문입니다. 

소프트웨어 설치

이 글에서는 스테이블 디퓨전용 웹 GUI중 하나인 ComfyUI를 사용합니다. ComfyUI를 처음 사용하시는 분은 설치 및 기초 사용법 초보자 가이드를 읽어보시기 바랍니다.

따라 하기

우선 아래의 그림이나 json파일을 다운로드 받은 후, ComfyUI 화면에 Drag&Drop하면 워크플로가 불러집니다.

InOutPaint_Auto.json
0.03MB

이 워크플로를 실행시키기 위해서는 다음과 같은 작업이 필요할 수 있습니다.

모델 다운로드/지정

먼저 인페인트 Unet 모델을 ComfyUI\models\unet 폴더에 다운로드받고, sdxl-inpain-0.1.safetensors (혹은 원하는 파일명으로) 이름을 변경합니다.

다운로드를 모두 받은 후, 화면을 새로고침(F5)하고 [UNETLoader] 노드에서 이 파일을 지정합니다.

다음으로 sdxl용 CLIP vision 파일을 ComfyUI\models\clip_vision 폴더에 다운로드 받습니다. 다운로드 받은후 아래와 같이 적당한 파일명(예 ViT_BigGmodel.safetensors)으로 변경하고, 화면을 새로고침(F5)후 [Load CLIP Vision] 노드에서 이 파일을 지정합니다.

다음으로 SDXL_1.0 파일을 ComfyUI\models\checkpoints 폴더에 다운로드 받습니다(AUTOMATIC1111과 파일을 공유하는 경우에는 여기를 보세요). 

다운로드가 모두 끝나면, 화면을 새로고침(F5)하고 [Load Checkpoint] 노드에서 이 파일을 지정합니다. 원하시면 다른 SDXL용 체크포인트 파일을 사용하셔도 됩니다.

기타 설정

다음으로 [Load Image] 노드에 인페인트/아웃페인트할 이미지를 지정합니다. 만약 인페인트하고 싶은 부분이 있다면, 이미지를 우클릭하여 나오는 메뉴에서 [Open in MaskEditor]를 선택한 후, 원하는 지역을 마스크로 지정하면 됩니다. 아래 그림에서는 오른쪽 끝과 좌측 아래를 마스크로 지정했습니다.

아웃페인트할 경우에는 [Pad Image for Outpainting] 노드에서 원 영상에서 상하좌우로 얼마만큼 늘릴것인지를 지정합니다. 너무 한꺼번에 넓은 면적을 아웃페인팅하면 오류가 발생하기 쉽기 때문에서 10% 정도씩 늘리는 것이 좋다고 합니다.

필요하다면 [CLIPTextEncodeSDXL] 노드에서 추가로 필요한 프롬프트를 지정합니다. 예를 들어 일부분을 지우고 고양이를 추가하고 싶다면 "a cat ..." 등 적절한 프롬프트를 넣어주면 됩니다. 특별히 필요하지 않는 한, text_g와 text_l에 동일한 내용을 지정합니다. 

이미지 생성

이제 메뉴에서 [Queue Prompt]를 클릭하면 인페인트/아웃페인트가 수행되고 이미지가 생성됩니다. 이때 생성된 이미지가 마음에 안들면 마음에 들 때까지 계속 실행하면 됩니다. 저는 이 결과물이 마음에 들어 선정했습니다. 좌우로 추가된 부분이 너무 자연스럽네요.

girl with red long hair blown by wind, dark black blue cape, castle on the background

원하시면 한번 더 아웃페인트를 시행할 수도 있습니다. 아래는 위의 그림에서 좌측 아래에 있는 푸른색 덩어리를 마스크하고 새로 생성한 이미지입니다. 오른쪽에 단풍나무까지 꽤 괜찮게 생성되었네요.

워크플로 간단 설명

1) CLIP Vision 버전

워크플로 아래에 있는 부분은 마스크를 합치는 과정입니다. 여기서는 안보이지만, 위쪽에 있는 [Pad Image for Outpaint]로부터 마스크를 가져오고, 좌측에 있는 [Load Image]에 추가된 마스크를 가져와 두개의 마스크를 합치게 됩니다.  제일 오른쪽은 현재 적용된 마스크를 보여주기위한 목적입니다.

가장 중요한 부분이 아래에 있는 [CLIP Vision Encode] 노드입니다. CLIP Vision 모델과 이미지를 합쳐 새로운 CLIP_Vision을 만들어줍니다. 

위쪽엔 이렇게 만들어진 CLIP_Vision과 일반 텍스트 프롬프트를 합쳐주는 과정이 있습니다.

2) WD14 Tagger 버전

맨 윗부분엔 [WD14 Tagger]노드가 있습니다. 이 노드는 그림을 분석해서 적절한 태그(프롬프트)를 찾아주는 역할을 합니다. 이렇게 분석한 프롬프트에 원하는 텍스트를 추가하여 인페인트/아웃페인트를 위한 프롬프트로 사용하는 것입니다.

3) 선택

사실 어떤 부분을 사용해도 별로 상관이 없습니다만, 원하면 두가지를 실행시켜보면서 테스트해보실 수 있습니다. 아래 그림을 참고해서 사용하시면 됩니다.

다른 예

아래는 인터넷에서 주어와서 위아래로 늘려 본 결과입니다. 왼쪽이 원본, 오른쪽이 생성한 결과입니다.

이런 인물 사진도 잘 처리가 되네요. 로고를 지우고 좌우로 넓혔습니다. 

DALL-E 3 이미지 아웃페인트

얼마전 마이크로소프트 Copilot을 사용하면 DALL-E 3을 무료로 사용할 수 있다는 글(이 글을 보세요)을 올렸습니다. 그런데 ChatGPT Plus 버전과는 달리, Copilot 혹은 이미지 크리에이터에서 이미지를 생성하면 1024x1024 이미지만 생성되어서 불만이라고 했죠.

이런 경우에 아웃페인트를 적용하면 다른 종횡비의 이미지도 쉽게 생성할 수 있습니다. 아래는 제가 생성한 이미지를 보관하는 용도로 사용하는 사이트에 올린 이미지입니다. 왼쪽은 ComfyUI에서 생성한 이미지이고, 오른쪽은 DALL-E 3 에서 생성한 이미지입니다. 

프롬프트: the portrait of an alien snake skin texture in Pink outfit sitting on a bench, long by Ryohei Hase, praying mantis, in a cyberpunk garden, 21st century monk, flowers and wired, in style of hieronymus bosch, oni, moor, dark studio, lonely, mysterious, dark theme, dramatic lighting, necklace, Buddha Meditation Beads

보시는 것처럼 어떤 게 좋다고는 할 수 없어도 분위기는 완전 다릅니다. 무엇보다 차이가 나는 것은 "기도하는 사마귀(praying mantis)"를 그리라고 했는데, 왼쪽은 사마귀인지 아닌지 알기가 힘듧니다.

이처럼 DALL-E 3는 프롬프트를 매우 잘 이해하고 따라하기 때문에, DALL-E 3에서 먼저 생성한 이미지를 3:2 또는 다른 종횡비로 아웃페인트하면 좋겠다고 생각했습니다. 그래서 ComfyUI의 인페인트 예제 사이트의 기본 워크플로로 아웃페인트를 적용해 봤더니 아래처럼 나왔습니다. 좌우측이 어울리지 않는데다 콘트라스트 차이 때문에 어디가 추가된 부분인지 확연하게 드러나서 아얘 써먹지 못하는 이미지가 되어버렸습니다. 

그런데 이 워크 플로를 사용하니 정말 잘 됩니다. 아래가 결과입니다. 좌우로 128 씩 두번을 아웃페인트하여 생성한 결과입니다. 거의 위화감이 안느껴지네요.

앞으로도 이 워크플로는 잘 사용할 수 있을 것 같네요.

이상입니다. 이 글은 thekitchenscientist 님의 워크플로를 기반으로 작성하였습니다.

====