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

Stable Diffusion 무한 줌 이미지 만들기 - ComfyUI

하늘이푸른오늘 2025. 1. 22. 13:45

무한 줌 아트는 어떤 이미지가 끝없이 줌인 또는 줌아웃하는 듯한 착각을 불러 일으키는 시각 예술입니다. 아래가 그러한 예입니다. 이 글은 스테이블 디퓨전의 웹UI 중 하나인 ComfyUI를 사용해서 이러한 이미지를 생성하는 방법에 대한 글입니다.

무한줌아웃 이미지

처음에는 AUTOMATIC1111 으로 무한 줌 이미지를 만드는 방법을 올리려고 했습니다.  제가 구독하고 있는 Stable Diffusion Art 사이의 글을 참고로 해서요. 간략히 정리하면, AUTOMATIC1111에서 Infinite zoom 확장을 설치한 다음, 적절한 시간마다 원하는 프롬프트를 입력하면 된다는 내용입니다. 그다지 어렵지 않을 걸로 생각했습니다.

그런데, 딱 첫번째 실험을 하려고 [Generate]버튼을 눌렀더니 에러가 발생했습니다.  그래서 그냥 포기하고 ComfyUI로 생성하는 방법을 공부하기로 했습니다.  그러다보니, 이 워크플로는 깔끔하지도 않고 복잡한 내용이 포함되어 있으므로 감안하시고 보시기 바랍니다.

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

소프트웨어

이 글에서는 스테이블 디퓨전용 GUI중에서도 제가 제일 좋아하는 ComfyUI를 사용합니다. ComfyUI가 처음이시라면, 설치 및 기본 사용방법초보가이드를 확인하시기 바랍니다.

따라하기

1단계: 모델 다운로드

이 워크플로에서는 realisticVision Hyper 모델을 사용합니다. 이 파일을 ComfyUI\models\checkpoints 폴더에 넣어줍니다. A1111과 모델을 공유하시는 분은 여기를 참고하세요.

2 단계: 워크플로 불러오기

아래의 JSON 파일을 다운로드 받은 후, 좌측위의 메뉴 Workflow->Open에서 해당 파일을 불러옵니다.

MilkyWay.json
0.01MB

3 단계: 프롬프트 검토

이 프롬프트는 지구와 달과 은하수가 어울어진 우주 사진을 생성합니다. 원하시면 다른 걸로 바꾸셔도 됩니다.

프롬프트: A stunning cosmic scene featuring the Earth, the Moon, and the Milkyway galaxy. Earth and its satellite shimer brightly against the backdrop of a star-filed galaxy. Majestic, celetial, intricate. Digital art inspired by the work of Nasa, 8K UHD, highly detailed. radiant colors 

4 단계: 첫번째 이미지 생성

이 상태대로 [Queue] 버튼을 눌러줍니다. 그러면 아래와 같은 이미지가 생성됩니다. 생성된 이미지가 마음에 안들면 프롬프트나 씨드번호를 수정해서 계속 생성해 줍니다.

5 단계: 줌아웃 이미지 생성

이제 아래와 같이 워크플로의 링크 연결을 바꿔줍니다.

  • [Apply ControlNet] 노드의 CONDITIONING 출력슬롯 - [KSampler(Efficient)]노드의 positive 입력슬롯
  • [Set Latent Noise Mask]의 LATENT 출력슬롯              - [KSampler(Efficient)]노드의 latent_image 입력슬롯  

Inpaint ControlNet 워크플로를 본 워크플로에 삽입

이제부터는 [Queue] 버튼을 눌러줄 때마다 줌아웃 영상이 생성됩니다. 아래 이미지는 이렇게 생성한 예입니다.  기본 워크플로만으로 생성했던 이미지이고, 우측 위는 이 이미지를 가운데 축소해 넣은 다음 생성된 이미지, 좌측 아래는 이 이미지를 다시 축소해 생성한 이미지, 우측 아래는 다시 축소한 이미지입니다. 장 보시면 앞 사진이 가운데 부분에 축소해 들어가는 것을 확인하실 수 있을 겁니다.

6 단계: 프롬프트 변경

이런식으로 계속 돌리게 되면 끝없이 우주속을 떠돌아 다니는 이미지를 만들 수 있을 겁니다. 하지만, 이렇게 계속 가면 재미없으니, 새로운 장면으로 바꿔줍니다. 아래가 프롬프트입니다. 

프롬프트: A crystal-clear brook babbling through an enchanged forest waking up from winter, the first blossoms of spring adorning the trees, Magical, life-filled, highly detailed digital painting inspired by the art of Eyvind Earle. vibrant and naturalistic colors.

아래는 다른 것은 건드리지 않고 프롬프트만 바꾼 후, 4번을 돌린 결과입니다. 처음엔 우주의 모습이 보이지만, 점점 축소되어서 결국엔 깊은 숲 속만 나타납니다. 

다음은 새로운 프롬프트입니다. 이번엔 흐르는 강물 옆으로 멋진 건축물이 있는 풍경입니다.

프롬프트: An architectural marvle of a modern house built into a hillside, surrounded by a meticulously landscaped garden with flowing water featuers. Innovative, sleek, serene. Photorealistic digital art in the style of Santiago Calatrava. Highly detailed, harmonious colors. 

이런 식으로 적당한 간격마다 프롬프트를 바꿔주고 계속 반복해주면 무한 줌 이미지를 만들 수 있습니다.

참고: 만약 생성해 가다가 프롬프트 오류 등으로 생성한 이미지가 마음에 안들 경우, 편법이긴 하지만 수정할 방법이 있습니다. 정상적인 영상중 마지막 영상을 ComfyUI/input  폴더에 복사해서 넣고 (이 폴더는 img2img/인페인팅 등 이미지 입력 파일이 들어있습니다), 그중 하나를 지우고 복사해온 영상을 지운 파일 이름으로 바꿔줍니다. 그 다음 [Image Receiver] 노드에서 그 파일을 선택해주면 됩니다(선택해도 변경되지 않는 것처럼 보입니다). 

원래 이런 종류의 영상은 시나리오, 플롯이 중요합니다. 잘 설계할 수록 멋진 결과물을 얻을 수 있죠. 아래는 이러한 프롬프트의 예입니다.

프롬프트1: Bird's eye view of the Earth from space, featuring a glowing horizon and continets visible amidst clouds. Mesmerizing, majestic, detailed. Photorealistic digital art by the style of Earth observatory images. Highly detailed. 4K UHD. soft lighting

프롬프트2: lush green field at the dawn of spring, with the first colorful buds sprrouting from the ground and a gentle morning sun piercing the fresh air. Vibrant, soothing, nature awakening. Impressionist style by Claude Monet. 4K UHD, high resolution

프롬프트3: A vast, luxurious Arabian bedroom in sultan's palace, resplendent with silk drapes, orante lanterns casting dappled light, a bed fit for royalty. Regal, opulent. Oil painting in the tradition of Ludwig Deutsch. 4K UHD, rich texture

프롬프트4: A modern living room with industrial accents, esposed brick walls, leather furniture, and minimalist decor. The large factory-style windows let in an abundance of natural light. Edgy, sleek, trendy. Inspired by the digital art of Marc Tan. 4K UHD, highly detailed. bold colors

7단계: 비디오 생성하기(Zoom Video Composer)

지금까지 만든 이미지들은 사이가 너무 벌어져 있습니다. 이대로 gif  등으로 합치면 앞 장면과 이어지는 장면이 연속적일 수가 없죠. 그래서 이미지 사이들을 좀더 채워주고, 이미지가 아닌 mp4 동영상으로 만들어줄 방법이 필요합니다. Zoom Video Composer가 이러한 역할을 수행합니다(물론 다른 프로그램도 있을 수 있습니다).

Zoom Video Composer는 아래의 저장소에서 받을 수 있습니다.

https://github.com/mwydmuch/ZoomVideoComposer

여기를 들어가보면, 이미지와 이미지 사이를 내삽해줄 때 속도가 일정하다고 하고요, 이미지 블렌딩(섞임)을 처리해줘서 부드럽게 이어지도록 해주며 속도/해상도/프레임 속도/줌 방향/이징(애니메이션 변화 제어) 등을 지원해주고, 필요하다면 음악도 추가할 수 있는 등 여러가지 장점이 있다고 합니다. 다만 줌 비율이 일정해야 하고 줌의 중심은 이미지 중심점이어야 한다고 하는데, 이 글에서 만들어지는 이미지는 이런 조건을 만족하니까 문제가 없네요.

Zoom Video Composer를 사용하려면 Python이 미리 설치되어 있어야 합니다. Python 설치는 따로 설명드리지 않습니다.

  • 이 파일을 다운로드 받아서 적당한 곳에 압축을 풉니다.
  • 해당 폴더에서 명령프롬프트(cmd) 를 실행합니다.
  • pip install -r requirements.txt 명령을 실행합니다.
  • 위에서 생성한 이미지를 적당한 서브폴더를 생성해서 넣습니다. 저는"ZoomVideoComposer-0.3.2\input"를 만들어 넣어주었습니다. 
  • 이때 이미지는 모두 사전순으로 정렬이 되어 있어야 합니다. ComfyUI의 일반적인 설정이라면 문제없습니다.

마지막으로 명령프롬프트에서 아래 명령을 입력합니다. 여기에서 input 은 이미지를 보관한 서브 디렉토리명, -m 0.2 는 이미지 주변 20%를 blending 해서 경계가 두드러지지 않도록 하는 옵션이고, -d 60 는 비디오 총 길이를 60초로 생성하라는 뜻이고, -e easeInOutSine 는 처음 시작은 느리게진행하다가 점점 빨라졌다가 끝날때 다시 느려지는 효과를 말합니다. 

python zoom_video_composer.py input -m 0.2 -d 60 -e easeInOutSine

아래는 이렇게 생성한 비디오입니다.

줌아웃 영상

보시는 것처럼 이 비디오는 줌 아웃을 합니다. 반대로 줌 인을 하는 비디오는 아래처럼 입력하면 됩니다.  

python zoom_video_composer.py input -d 60 -e easeInOutSine --direction in --reverse-images

아래는 이렇게 생성한 비디오입니다.

줌인 영상

github 사이트에 가시면 기타 다른 옵션도 있으니 필요하시면 확인하세요.

워크플로 설명

이 워크플로는 Efficiency 커스톰 노드를 사용합니다. 아래와 같이 거의 연결만 해주면 쉽게 사용할 수 있기 때문입니다.

모델 설정

가장 중요한 노드 중 하나는 생성된 이미지를 다시 입력 이미지로 사용할 수 있도록 해주는 [Image Sender] 노드와 [Image Receiver] 노드입니다. [Ksampler (Efficient)]노드에는 아래와 같이 [Image Sender] 노드를 연결해줍니다.

Image Sender 노드 추가

그 다음 이 이미지를 [Image Receiver] 노드에서 받고, 이 크기를 줄인 뒤, 바깥부분에 아웃페인팅을 위해 이미지 바깥쪽 채워줍니다.

  • ImageReceiver - [ImageSender] 노드에서 생성한 이미지를 받는 노드입니다. [Image Sender]에서 이미지를 받자마자 [Image Receiver]에도 동일한 영상이 전달됩니다.
  • ImageScale - 이미지 크기를 변경시키는 노드입니다. 주로 확대에 사용되지만, 여기에서는 이미지를 축소하는데 사용됩니다.
  • ImagePadForOutpainting - 이미지 바깥쪽을 채워주는 기능을 하는 노드입니다.

Image Receiver 노드

여기에서 [Pad Image for Outpainting] 노드에서는 left/top/right/bottom을 각각 256씩으로 설정해주고, feathering,  즉 이미지가 서로 섞이게 하는 범위를 128 정도로 넓혀줍니다.

이렇게 되면 처음 생성했던 768x768 짜리 이미지가 [Upscale Image] 노드를 거치면서 512x512로 줄어들었다가,  [Pad Image for Outpainting]를 통해 바깥쪽이 128씩 확대되어 최종적으로 768x768 짜리 이미지가 만들어지게 됩니다. 

물론 이렇게 채워진 바깥쪽은 그냥 까만색 이미지일 뿐이죠. 여기를 채워넣어야 합니다. 채워넣는 것은 ControlNet Inpaint 모델을 사용합니다. 아래와 같이 세가지 노드를 추가하고 아래 그림과 같이 연결해줍니다. 여기에서 [Load ControlNet Model] 노드에는 "control_v11p_sd15_inpaint.pth"를 불러오도록 설정해 줍니다.

  • ControlNetApply - ControlNet을 적용하는 핵심 노드입니다. 조건부여(conditioning)을 입력받아서 ControlNet을 적용한 변경 조건부여를 출력합니다.
  • ControlNetLoader - ControlNet  모델을 불러오는 노드입니다.
  • InpaintPreprocessor - ControlNet용 이미지를 전처리하는 노드중 하나입니다. 

ControlNet Inpaint 노드

이제 위에서 만든 노드들과 아래와 같이 연결해 줍니다. [Pad Image for Outpainting] 노드와 [InpaintPreprocessor] 노드를 링크로 연결해 주면 됩니다.

이미지 인페인트 노드들

이제 이렇게 생성된 이미지를 다시 원래의 이미지에 끼워넣어주어야 합니다. 먼저 아래 두개의 노드를 추가하고 아래 그림과 같이 연결해 줍니다.

  • VAEEncode - 일반 이미지를 VAE로 인코딩하여 Latent 이미지로 만들어주는 노드입니다. Img2img에서 가장 중요한 노드중 하나입니다.
  • SetLatentNoiseMask - 잠재(Latent) 이미지에 잡음을 추가해주는 노드입니다.

VAE Encode 노드 연결

또 다른 예제

아래는 새로 테스트해 본 영상입니다. 여기에서는 Dreamshaper 모델을 사용했고, 이미지 크기를 1024*768로 맞췄습니다. 아래 이미지를 넣으면 워크플로를 확인하실 수 있는데, [Upscale] 노드를 지나면 512x384 로 줄어들고, [Pad image for Outpainting] 노드에서는 좌우로 512/2 = 256 픽셀만큼 늘리고, 위 아래로 384/2 = 192 픽셀만큼 늘려줘서 크기를 딱 맞추도록 했습니다.

무한 줌 워크플로가 포함된 황금 사원

무한 줌인 이미지

여기에서 사용한 프롬프트는 아래와 같습니다. 보시는 것처럼 뒷부분은 거의 똑같고, 앞부분은 서로 약간씩 겹치도록 해서 부드럽게 전이되도록 했습니다. 예를 들어 첫번째 프롬프트와 두번째 프롬프트는 temple이 공통이고, 두번째와 세번째 프롬프트는 waterfall이 공통입니다. 

inside golden temple, magical scene, dazzling glow, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

temple in waterfall, magical scene, dazzling glow, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

waterfall and jungle, magical scene, dazzling glow, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

jungle and green meadow, magical scene, dazzling glow, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

green meadow and lake, magical scene, dazzling glow, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

lake and desert, magical scene, sunlight, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

desert and barren wasteland, magical scene, sunlight, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

barren wasteland with snow, magical scene, sunlight, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

cozy living room with big windows and sofas, magical scene, sunlight, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

cozy and bright living room, magical scene, sunlight, bright lighting, 8k, intricate, elegant, highly detailed, majestic, digital photography, art by artgerm and ruan jia and greg rutkowski, hdr

이상입니다.

민, 푸른하늘

====