이전에는 Attention Couple확장을 사용한 예시를 보여줬지만 영역간 프롬프트 간섭은 완전히 해결하지 못한다.

캐릭터 로라 2개를 사용하면 영역으로 나누어도 두 캐릭터간의 로라가 서로 간섭이 발생한다.


이번에 준비한 워크플로우는 영역간 프롬프트 간섭이 전혀 발생하지 않는다.

여러 커스텀 노드가 사용되었으니 ComfyUI-Manager로 누락된 노드를 설치해주자.

일단 예제를 준비해왔다

(위 이미지를 ComfyUI에서 로드하면 세팅된 워크플로우를 사용할 수 있다)


뭔가 쥰내 많아 보이는데 이것 저것 뜯어보기 좋게 노드들을 다 펼쳐놓아서 복잡해보이지만

실제로는 복잡하지 않다.


대략적인 작동 방식은 이렇다

1. 마스킹으로 영역을 지정한다

2. 각각 지정한 영역에 "모델과 프롬프트를" 할당한다.

3. 전용 샘플러 노드로 샘플링

4. 업스케일 후 각 영역별로 따로 2차 샘플링(Hires Fix)


Attention Couple 확장으로 작성한 워크플로우와 크게 다른점은 2번의 모델과 프롬프트를 할당한다는 거다.

이전에 소개한 방법은 각 영역별로 Conditioning(프롬프트)에 마스크영역만 지정해주었지만 이번엔 모델까지 분리한다.


예제 워크플로우에 간단히 설명할 부분만 설명하고 넘어가자

각 영역별 프롬프트를 작성하는 부분인데 이전이랑 좀 다를거다.

매번 품질관련 프롬프트를 작성하기 귀찮아서 좀 바꿔줬다.

Text Concatenate노드는 여러개의 text(string)값을 받아와서 합쳐준다.

text box로 품질 프롬프트를 하나 작성해두고 #0, #1, #2 text concatenate의 text_a로 뿌려준다.

그리고 각 영역별 프롬프트를 작성할 text box를 만들어서 각각 text_b에 연결해주고 CLIP Text Enconde노드로 전달해주면

샘플러로 들어갈 Conditioning 세팅이 완료된다.

이렇게 하면 일일히 품질관련 프롬프트를 작성하지 않아도 된다. 네거티브도 마찬가지.



이번 내용의 핵심 노드들이다.

Impact Pack에 포함된 커스텀 노드들이다


KSamplerAdvencedProvider 노드

BasicPipe노드에서 데이터를 가져와서 cfg, 샘플러, 스캐쥴러를 공급한다.


RegionalPrompt 노드

위의 KSamplerAdvencedProvider노드에서 받은 데이터에 마스크 영역을 할당한다.


CombineRegionalPrompts 노드

두 개의 RegionalPrompt 노드를 받아서 샘플러 노드에 공급한다.


RegionalSampler 노드

Latent영역과 기본 영역의 KSamplerAdvencedProvider, 그리고 #1, #2영역의 RegionalPrompt값을 받아온다.

이번 워크플로우의 핵심노드다. 이 녀석은 3개 이상의 영역을 사용할 때만 쓰인다.

2개의 영역을 샘플링하는 TwoSamplerForMask, TwoAdvencedSamplerForMask라는 노드가 있지만

(각 노드에 대한 설명은 Impact Pack 깃헙을 참조하자. 같은 역할을 하지만 작동 방식이 달라 결과가 크게 달라진다)

나는 배경과 두 캐릭터를 분리시키기 위해 3개의 영역을 사용하기에 RegionalSampler를 사용한다.

CombineRegionalPrompts 노드를 사용하여 이론상 영역을 무제한으로 추가할 수 있다.


이 노드는 기본 영역(내가 작성한 예제에서는 #0에 해당한다), #1 영역, #2 영역을 1스탭씩 순차적으로 디노이징을 진행한다.

20스탭을 설정하면 #0, #1, #2영역을 1스탭, 1스탭, 1스탭, 2스탭, 2스탭, 2스탭, ............20스탭 이런식으로 총 60스탭을 진행하게 된다.


예전에 찍어둔 움짤을 보자

계속 봐도 신기하다 ㅋㅋ.


영역별로 #0 1~20스탭, #1 1~20스탭, #3 1~20스탭 이런 식으로 따로 진행하는 방법도 있지만

완성된 그림이 영역별로 괴리감이 생기는 경우가 자주 발생하여 기본 이미지 생성에는 추천하지 않는다.

예제에서는 Hires Fix에서 이 방법을 사용한다.

RegionalSampler는 Hires Fix에 사용 시 그림 품질 저하를 일으키며 어떻게 해도 해결되지 않아 포기했다.


다음은 Hires Fix다

모델과 프롬프트를 영역별로 나누었기 때문에 영역별로 따로 샘플링을 진행한다. (KSampler의 번호를 수정하는걸 깜빡했다;)

예제에서는 Latent 업스케일을 사용하였다. Image 업스케일을 사용해도 된다.


SetLatentNoiseMask 노드

받아온 Latent값에 디노이징을 진행할 영역을 Mask로 받아와서 적용한다.

이렇게 해서 샘플러에 공급해주면 마스크 영역에만 디노이징한다.


1차로 #0 영역을 지정하여 샘플링 돌려주고 후에 #1, #2영역도 똑같이 진행하면 Hires Fix는 완료된다.



예제의 사용법은 Attention Couple때와 별반 다르지 않으므로 해당 글을 참조하자.


역시나 오픈포즈를 사용하여 짤을 뽑아보자 (Attention Couple 가이드 글 참조)



RegionalSampler 그림 생성


#0 영역 Hires Fix


#1 영역 Hires Fix


#2 영역 Hires Fix


#0 로라x

#1 로라o 가중치1

#2 로라o 가중치1


캐릭터를 겹쳐서 배치해도 서로간의 프롬프트 간섭없이 잘나온다.


작성한 프롬프트를 보자

#0 영역은 전체영역 - (#1 + #2)으로 자동으로 지정되도록 노드를 작성해뒀기 때문에 배경에 해당된다.

Attention Couple때와는 다르게 2girls를 사용하지 않는다.

영영간에 서로 완전히 분리되어 작용하기 때문에 각 영역에 필요한 프롬프트만 작성하면 된다.



이 방식을 사용할 때에는 꼭 컨트롤넷 openpose를 사용하자.

영역별로 완전히 독립되어 있어서 지정한 영역에 캐릭터를 잡아두지 않으면 원하는 멀쩡한 결과를 얻지 못한다.

Attention모드처럼 알잘딱하게 그려주지 않기 때문에 openpose를 꼭 사용하자.


기본 생성부터 Hires Fix까지 영역별로 샘플링이 따로 진행되기 때문에 결과적으로 그림의 생성속도는 처참하다.

하지만 두 캐릭터간 상호작용을 하면서 각 캐릭터의 개성을 살려 그림을 생성할 때에는 아주 만족스러운 결과가 나온다.

예제 워크플로우를 이것저것 뜯어보면서 본인의 워크플로우에 맞추어 사용하자.


추가내용.

노드좀 깔끔하게 정리한 워크플로우

나는 보통 이런식으로 정리해서씀

여러곳에서 공통으로 사용되는 파라메터들(Seed, Steps, CFG같은것들)을 따로 빼서 하나로 묶어버리면 설정도 편하고 관리도 편하다




(ConfyUI) Attention Couple (Regional Prompt) 영역 지정으로 프롬프트를 따로 적용해보자