AI 이미지/ComfyUI

ComfyUI - 구역 분할 프롬프트

하늘이푸른오늘 2023. 10. 29. 23:23

예전에 Stable Diffusion - 구역 분할 프롬프트 사용법이라는 글에서, AUTOMATIC11111을 사용할 때 프롬프트를 구역별로 다르게 지정하는 방법을 설명했습니다. 이 글은 ComfyUI에서 비슷한 방법을 구현하는 방법을 설명합니다. 참고로 여기에 포함된 이미지(캡처 이미지 제외)는 대부분 ComfyUI의 워크플로가 포함되어 있으므로, 다운로드 받아 ComfyUI 캔버스에 Drag&Drop 또는 메인 메뉴에서 [Load] 버튼으로 읽어들여 사용할 수 있습니다.

이 글에서 다루는 내용은 아래와 같습니다.

소프트웨어 설치

이 글에 있는 내용을 사용하기 위해서는 우선 ComfyUI를 설치해야 합니다. ComfyUI를 설치하는 방법과 기본적인 사용법은 ComfyUI 로 스테이블 디퓨전 사용하기 를 참고하세요.

간단 예제: 좌우 분할

먼저 Stable Diffusion - 구역 분할 프롬프트 사용법이라는 글중 간단한 예제로 보인, 좌측에는 검은 머리의 남성, 우측에는 금발의 여성을 그리는 방법을 시험해 보겠습니다. 아래는 제가 평상시 사용하는 SDXL 워크플로에 입력한 설정입니다. 더 상세한 내용은 아래 생성된 그림을 ComfyUI에 읽어들이면 됩니다.

모델: DreamshaperXL
프롬프트: A picture with a man with black hair on the left and a woman with blonde hair on the right

아래가 결과인데... SDXL 을 사용하니 거의 프롬프트대로 생성이되네요. ㅎㅎ 이 정도면 SDXL 에서는 구지 구역 분할 프롬프트를 적용할 필요가 없을 정도입니다. 

아래는 동일한 프롬프트를 ChilloutMix 모델을 사용해서 SD 1.5 워크플로에서 실험한 결과입니다. 좌우가 맞지도 않고... 아무튼 거의 원하는대로 생성되지 않습니다.

SD1.5에서는 이처럼 정확한 위치를 제어하기 힘들다보니 구역 분할 프롬프트가 중요한 것 같습니다. comfyUI 워크플로는 아래와 같습니다. 이 워크플로는 제가 ComfyUI area composition 예제를 간단하게 정리해서 두개의 구역만 있도록 수정한 것입니다.

두개 구역의 Area Composition 워크플로

이 워크플로를 돌린 결과는 아래와 같습니다. Dreamshaper 모델을 사용했는데, 잘 나온 것 같네요.

이 워크플로에서 가장 중요한 부분은 아래와 같습니다. 왼쪽엔 [CLIP Text Encode(Prompt)] 노드로 프롬프트를 작성하고, 그 다음엔 [Conditioning (Set Area)]로 이 프롬프트가 적용될 구역을 지정합니다. [width/height는 전체 이미지 크기이고, 그아래 x/y가 해당프롬프트가 적용되는 구역입니다. 아래의 이미지에서 위쪽은 0,0부터 적용된다는 거고, 아래쪽은 384,0부터 적용된다는 뜻입니다.

그 다음 [Conditioning (Combine)] 노드를 통해 이 두개의 조건부여(Conditioing)가 합쳐지고, 다시 원래의 프롬프트와 합쳐져서 최종적으로 [KSampler] 노드에 들어가게 됩니다.

Area Composition 중 구역 분할 부분

그리고, 이 부분 아래로도 프롬프트를 입력하는 노드가 있는데, 여기는 공통 프롬프트를 넣는 곳입니다.

구역 분할 프롬프트의 공통 프롬프트

4분할 봄여름가을

AUTOMATIC1111의 구역분할 프롬프트 사용법에는 여러가지 활용법이 많이 나와있지만, 여기서는 구역 프롬프트를 창조적으로 사용하기 에 있는 이미지, 즉 봄 여름 가을 겨울이 한꺼번에 들어 있는 이미지를 만들어보겠습니다. 아래가 워크플로입니다. 이 프롬프트도 ComfyUI area composition 예제에서 우측에 있는 Hires. Fix 부분은 삭제했습니다. 이걸 넣으니 봄 여름 가을 겨울이 뭉그러지게 되어서요.  

워크플로 자체는 위와 그다지 다를 것은 없습니다. 이미지를 1280*512로 키웠고, 4개의 구역을 사용했다는 것만 차이가 있습니다.

4분할 봄여름가을 워크플로

아래가 결과입니다. 그런데 좀 흐리게 생성되었고, 4개의 구역이 그다지 잘 구분되지 않네요. 그나마 1024*512를 1270*512로 가로를 더 길게 바꾸니 좀 많이 나아진 건데도 제가 보기엔 품질이 별로입니다. 

아래는 AUTOMATIC1111에서 생성한 결과입니다. 색감이 훨씬 선명합니다. 그리고 구역별로 특성이 선명하게 드러나구요. 동일한 모델을 사용했는데도 색감이 차이나는 것은 뭔가 제가 빠뜨린 게 있나보네요.

AUTOMATIC1111의 구역분할 프롬프트 사용법의 결과 이미지

Visual Area Conditioning 노드

그런데, 위의 워크플로를 보면, 겨우 네 구역으로 분할 하는데에도 [CLIP Text Encode(Prompt)] 노드 4개, [Conditioning (Set Area)]노드 4개, [Conditioning (Combine)] 노드 4개 등 총 12개의 노드가 필요합니다. 구역 하나가 더 추가되면 새로 4개의 노드를 추가해야 하고요. 

그리고 구역을 지정하는 것도 일일히 숫자를 계산해서 입력해야 하기 때문에 번거럽기 그지 없습니다. 아무리 ComfyUI가 사용하기 어렵다고 해도 이건 아니다 싶습니다. 

그런데, 이것을 해결할 수 있는 커스텀 노드가 있습니다. Visual Area Conditioing 커스톰 노드입니다. 아래그림에서 보는 것처럼 구역을 한번에 관리할 수 있고, 게다가 실제 적용되는 범위를 시각적으로 확인할 수 있어 무척 펀리합니다. 

Visual Area Conditioning 커스톰 노드

이 커스톰 노드에 대한 설치방법 및 기본적인 활용방법은 이 글을 확인하시기 바랍니다.

4분할 봄여름가을 - Visual Area Conditioning 노드

아래는 [MultiAreaConditioning] 노드를 사용해서 위에 있는 4분할 봄 여름 가을 겨울 워크플로를 구현한 것입니다. 보시는 것처럼 상당히 깔끔합니다. 특히 이 노드를 사용하지 않았을 때에 비하면 정말 보기도 좋고 이해도 쉽습니다. 

[MultiAreaConditioning] 노드를 사용한 봄여름가을겨울

아래는 위 워크플로중 구역을 지정한 결과입니다. 첫번째 프롬프트는 전체 구역에 지정하고, 2~5번째 프롬프트는 각각 1/4씩 지정되었습니다.

구역지정

아래는 이 워크플로를 돌려서 얻은 결과입니다. 깔끔하네요. 특히 여기에서는 [VAE Decode] 노드 대신 [VAE Decode (Tiled)] 노드를 사용했는데, 약간 색감이 좋아졌습니다. 

봄 여름 가을 겨울이 함께 있는 풍경1

또 다른 결과입니다. 이 정도면 상당히 쓸만하네요.

봄 여름 가을 겨울이 함께 있는 풍경2

마녀

또 다른 예입니다. 아래는 설정입니다. 자세한 설정은 아래 이미지를 ComfyUI 캔버스에 Drag하면 보실 수 있습니다.

모델: dreamshaper_8
전체 프롬프트: a witch, highly detailed face, half body, studio lighting, dramatic lighting, highly detailed clothing, looking at you, mysterious, dramatic lighting
보름달: (full moon)
등잔: (beautiful fire magic: 1.5)

아래가 결과입니다. 

워크플로는 바로 위와 동일한 것을 사용하였고, 프롬프트와 적용 구역 위치만 변경했습니다. 특히 아래를 보시면 3개의 구역만 사용하고 있음을 아실텐데, 네번째 부터는 Bypass(통과, Cont-B를 누르면 됨)시켜서 적용이 안되도록 했습니다. 

구역지정

이상입니다.

민, 푸른하늘