AI 이미지/Stable Diffusion

ComfyUI 예제 - Stable Cascade

하늘이푸른오늘 2024. 2. 24. 22:18

Image Variations

개요

여기에 포함된 예제를 사용하기 위해서는 stable_cascade_stage_c.safetensors 및 stable_cascade_stage_b.safetensors 체크포인트 파일을 다운로드 받아, ComfyUI\models\checkpoints 폴더에 넣으셔야 합니다. 

스테이블 캐스케이드는 3단계 프로세스로서, 제일 먼저 스테이지 C 모델에서 저해상도 잠상(잠재 이미지}를 생성한다. 그 다음 이 잠상을 스테이지 B 디퓨전 모델을 사용하여 확대한다. 마지막으로 이렇게 확대된 잠상이 스테이지 A로 전달되어 다시 한번 확대되고 이미지 공간으로 변환된다.

참고로, 이 글 속에 포함된 모든 이미지는 다운로드 받은 후 ComfyUI 화면에 Drag&Drop 하면 이미지 속에 임베드된 워크플로를 사용할 수 있다.

Text-to-Image

아래는 가장 간단한 txt2img 워크플로입니다. 참고로 이 워크플로는 ComfyUI_exsamples 사이트에 있는 워크플로를 약간 변형한 것입니다. 특히 스테이지 C의 샘플링 단계를 20에서 10으로, 스테이지 B의 샘플링 단계를 10에서 5로 낮췄으니 참고하세요.

txt2img_cascade.json
0.01MB

이 워크플로는 스테이지 C와 스테이지 B로 나누어져 있습니다. 먼저 아래는 스테이지 C 부분입니다.

먼저 형태는 기본 워크플로와 매우 비슷합니다. [Load Checkpoint] 노드, Positive/Negative 노드, [KSampler] 노드 모두 기본 워크플로에서 사용되는 노드입니다. 여기에서 [Load Checkpoint] 노드에 "stable_cascade_stage_c.safetensors" 모델을 지정하는 것만 다릅니다.

맨 아래에는 있는 [StableCascade_EmptyLatentImage] 노드만 기본 워크플로에서 사용되지 않는 노드입니다. 모양은, [EmptyLatentImage]노드와 거의 비슷하게 생겼죠. "compression" 위젯이 하나 추가되어 있고 (압축률이 42이라는 뜻입니다. 그다지 건드릴 일이 없을 듯합니다), 각각 stage_c와  stage_b의 latent_image와 연결되는 출력이 2개 있는게 특이합니다.

다음은 Stage B를 살펴보겠습니다. 

먼저 제일 독특한 점이 [StableCascade_StageB_Conditioning] 이라는 노드입니다. 아래는 이 노드와 연결된 노드들만 따로 추려본 것입니다. 긍정적 프롬프트와 스테이지 C의 샘플러에서 출력된 잠상을 입력받아 이것을 맨 마지막에 있는 [KSampler]의 Positive 에 연결해주네요. 아주 신기합니다.

그리고 여기에도 [Load Checkpoint] 노드가 하나 더 있는데, 당연히 "stable_cascade_stage_b.safetensors" 모델을 불러들이고, 모델은 [KSampler]로 연결됩니다.

그런데, 어디를 봐도 Stage A에 해당하는 모델을 불러들이는 곳이 없습니다. 이것은 바로 위의 노드에서 출력으로 VAE가 있는데, 즉,  "stable_cascade_stage_b.safetensors" 모델 내에 VAE에 해당하는 stage_a 모델이 포함되어 있기 때문입니다.

아래는 결과물입니다. 프롬프트는 "A man in his fifties, pulling his hair late into the night, diligently crafting a report in front of the computer" (밤 늦도록 머리를 쥐어뜯으며 컴퓨터 앞에서 보고서를 작성하는 50대 남자) 입니다. 흠... 제법 잘 나오네요.

Image-to-Image

아래는 이미지를 인코딩하여 스테이지 C에 전달함으로써, 기본적인 image-to-image 를 수행하는 워크플로의 예입니다.

img2img_cascade.json
0.01MB

이 워크플로는 위쪽에 있는 txt2img 워크플로와 거의 동일합니다. 스테이지 C에서만 약간 다릅니다. 가장 다른점은 왼쪽 아래의 잠상(latent)를 만들어주는 부분으로서, txt2img에서는 아래와 같이 [StableCascade_EmptyLatentImage]의 노드를 사용했지만...

img2img에서는 이미지를 [StableCascase_StageC_VAEEncode] 노드를 사용해서 이미지를 인코딩한 후, 출력슬롯 stage_c, stage_b 에서 [KSampler]으로 보낸다는 점만 다릅니다. 그리고 여기에서는 compression 을 42가 아닌 32로 썼습니다. 

조금 이상해서 씨드값을 두개 모두 고정시키고 compression값을 변화시켰더니, 25 이하에서는 이미지가 흐뜨러지는 것 같네요. 이미지 크기는 모두 768x768로 원본 이미지와 동일하고요. 이 값의 역할에 대해서는 좀더 알아봐야할 것 같습니다.

compression=42 compression=32 compression=22 compression=12

아... 한가지 다른 점이 또 있는데, 스테이지 C의 [KSampler] 노드의 denoising 값이 1.0 -> 0.6으로 변경되었다는 점입니다. 그대로 1.0으로 둔다면 그냥 이미지는 무시되겠죠.

아래는 결과 이미지 입니다. 프롬프트는 "evening sunset scenery blue sky nature, glass bottle with a fizzy ice cold freezing rainbow liquid in it" 입니다.

Image Variations

스테이블 캐스케이드는 입력된 이미지에 대한 CLIP vision 출력을 사용하여, 여러가지 변형된 이미지를 생성할 수 있다. 아래는 그 예제 워크플로입니다.

variation_cascade.json
0.01MB

이 워크플로와 아래쪽에서 사용되는 입력 이미지는 아래를 사용하시면 됩니다.

이 워크플로도 전체적으로는 맨 위의 txt2img 워크플로와 상당 부분 닮았습니다. 하지만 스테이지 C의 경우엔 상당한 차이가 있습니다. 아래는 스테이지 C 중에서 달라진 부분만 따로 추출한 겁니다.

먼저 [Load Checkpoint] 노드 대신 [unCLIPCheckpointLoader] 노드를 사용했습니다. 두 노드가 거의 비슷한데, 맨 아래쪽에 CLIP_VISION 출력슬롯이 하나 더 있다는 점만 차이납니다. 

가장 큰 차이는 img2img에서는 [Load Image]로 불러온 이미지를 잠상으로 Encode하여 사용했지만,

여기에서는 [CLIP Vision Encode]노드로 이미지를 해석해서 그것을 텍스트 프롬프트와 합쳐서 조건부여(conditioning)으로 사용한다는 점입니다.

잠상은 별도로 [StableCascade_EmptyLatentImage]노드에서 따로 만들게 되고요.

결국 이 워크플로에서는 입력된 이미지를 해석한 내용과, 프롬프트를 합쳐서 출력 이미지가 생성됩니다. 아래는 결과입니다.

이 워크플로는 아얘 프롬프트 없이도 사용할 수 있습니다. 그러면 입력된 이미지와 전반적으로 분위기가 비슷한 이미지가 생성되죠. 아래는 그 결과입니다. 전경에는 분홍색 꽃밭, 배경에는 설산. 입력된 이미지와 상당히 비슷함을 알 수 있습니다.

다른 예를 들어보죠. 아래 그림을 사용해서 프롬프트 없이 돌려보겠습니다.

그러면 아래와 같은 그림이 나옵니다. 보시는 것처럼 수채화 스타일까지 반영한, 원 이미지와 비슷한 이미지가 생성됩니다. 이 워크플로는 이런 식으로 입력된 이미지와 비슷한 이미지를 생성하고자 할 때 유용합니다.

다중 이미지 Remix

아래는 입력된 이미지가 2장 이상일 때 사용할 수 있는 워크플로입니다.

multiple_remix_cascade.json
0.02MB

복잡해 보이지만, 바로 위의 "Image Variation" 워크플로와 거의 비슷합니다. 아래 보시는 것처럼, [Load Image], [CLIP Vision Encode], [unCLIPConditioning] 노드가 각각 2개가 있고, 이것이 뒤이어 연결되어 있을 뿐입니다. 여기에서 빨간색 박스를 칠해 둔 부분을 지워버린다면, 위의 "Image Variation" 워크플로와 완전히 동일해집니다. 그래서 별도의 설명은 하지 않겠습니다.

아래는 생성 결과입니다. 프롬프트는 "evening sunset scenery blue sky nature, glass bottle with a fizzy ice cold freezing liquid in it" 입니다. 

마찬가지로 이 워크플로도 프롬프트 없이 사용할 수 있습니다. 아래는 그 결과입니다.  물병은 없어졌지만, 두 그림에 포함된 특징은 모두 포함되어 있네요.

참고로, CLIP_Vision 을 사용하여 비슷한 이미지를 생성하는 것은 SDXL에서도, SD1.5에서도 가능합니다. 아래는 SDXL 모델을 사용하여 비슷하게 구현한 것입니다.

multiple_remix_sdxl.json
0.01MB

아래는 결과입니다. 다만, 똑같은 이미지를 사용했음에도 스테이블 캐스케이드 보다는 이미지 분위기를 잘 복제하지 못하는 것 같네요.

이상입니다. 이 글은 ComfyUI 예제 사이트에 들어있는 워크플로를 제 나름대로 해석해서 작성하였습니다.

민, 푸른하늘

===