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

일부만 움직이는 이미지 - ComfyUI

하늘이푸른오늘 2024. 1. 23. 23:01

이 글은 animateDiff와 인페인트를 사용해서 일부분만 움직이는 이미지를 생성하는 ComfyUI에 대해 설명드립니다.

소프트웨어

이 글에서는 스테이블 디퓨전을 위한 GUI 중 하나인 ComfyUI를 사용합니다. 설치 및 기본 사용방법은 이 글을 보시면 됩니다. 조금 중복되는 부분도 있지만, 초보자 가이드도 참고하세요.

따라하기

0단계 : ComfyUI 워크플로 불러보기

아래의 그림을 다운로드 받고, ComfyUI 화면에 Drag&Drop하면 이 워크플로를 사용할 수 있습니다.

대부분 그냥 따라하면 그대로 사용할 수 있지만, 때때로 오류가 발생할 수 있습니다. 그러한 경우, 다음과 같은 작업이 필요할 수 있습니다.

1 단계: 이미지 불러오기

[Load Image] 노드에 이미지를 불러옵니다. [choose file to upload] 버튼을 클릭해서 원하는 이미지를 선택하거나, 그냥 원하는 이미지를 여기에 Drag&Drop해도 됩니다.

아래는 이 글에서 사용하는 이미지 입니다. 이미지는 너무 크지 않아야 하는데, 되도록이면 SD1.5 에서 기본으로 지원하는  512x512에 가까울수록 좋습니다.

참고로 위의 사진은 제가 평상시 사용하는 SD 1.5용 워크플로에서 모델과 LoRA 파일을 바꾸고, "a beautiful 20yo woman, long hair blowing in the wind, simple background sky" 라는 프롬프트로 생성한 이미지입니다. 위의 이미지를 다운로드 받아 ComfyUI 화면에 Drag&Drop하면 이 이미지를 생성하는 워크플로를 사용하실 수 있습니다.

이미지를 우클릭하고 "Open in Mask Editor"를 선택합니다. 그다음 움직이에 만들고 싶은 영역을 마스크로 지정합니다. 아래는 머리카락을 마스크로 지정한 것입니다.

참고로, 뒷 배경이 간단한 이미지일 수록 잘 작동됩니다.

2 단계: 체크포인트 모델 선택

SD1.5 모델 중 원하는 모델을 선택합니다. 이 글에서는 Dreamshaper 8 모델을 사용합니다. 모델 파일을 다운로드 받고 ComfyUI\modes\checkpoints 폴더에 넣어주시면 됩니다(AUTOMATIC1111과 모델을 공유하실 경우엔 여기를 보세요).

다 받으신 후 화면 새로고침(F5)해주시면 사용할 수 있습니다 [Load Checkpoint] 노드에서 해당 파일을 선택합니다.

3 단계: AnimateDiff 모델 선택

AnimateDiff v3 모델을 다운로드 받아 ComfyUI\custom_nodes\ComfyUI-AnimateDiff-Evolved\models 폴더에 넣어줍니다. 화면을 새로고침(F5)한후 [AnimateDiff Loader] 노드에서 이 파일을 선택합니다.

4 단계: 프롬프트 손보기

프롬프트를 원하는 대로 수정합니다.

참고로, 부정적 프롬프트에 embedding:BadDream 이라고 되어 있는데, 부정적 임베딩인 BadDream.pt를 사용한다는 뜻입니다. 이 파일을 다운로드 받은 후, ComfyUI\models\embeddings 폴더에 넣어주면 됩니다 (AUTOMATIC1111과 모델을 공유하실 경우엔 여기를 보세요). 

5 단계: 애니메이션 생성

[Queue Prompt] 버튼을 누르면 gif 동영상이 생성됩니다. 아래는 결과입니다.

아래는 다른 이미지를 생성해서 동일한 워크플로에 적용시켜본 예입니다.

사용한 사진은 아래와 같습니다.

워크플로 설명

이 워크플로에서는 아래의 두 가지 기법을 함께 사용합니다.

  • AnimateDiff - 이미지 한장으로 부터 짧은 비디오를 생성하는 스테이블 디퓨전 애드온
  • 인페인트 - 이미지 일부를 재생성

한가지 고려할 사항은 원래 인페인트의 경우, 일반 모델을 사용하는 것보다 인페인트 전용 모델을 사용하는 것이 좋은데, 이 워크플로에서는 사용할 수 없다는 것입니다. AnimateDiff가 인페인트 전용모델로 학습되지 않았기 때문입니다. 따라서 [KSampler] 노드에서 잡음 제거 강도(denoising strenth)를 너무 높게 설정하면 안됩니다.

AnimateDiff

아래는 AnimateDiff의 핵심부분입니다. 그런데 사실 모델 선택 외에는 어떤 내용인지 잘 모르겠네요.

워크플로 아래쪽에 보면 [Repeat Latent Batch]노드가 있는데, 여기에서 설정하는 값은 프레임 수입니다.

인페인트

인페인트는 왼쪽 아래 부분에서 이루어집니다. 이미지를 [VAE Encode]노드를 통해 잠재 이미지(latent image)로 바꾸고, 마스크를 지정해서 샘플러에 넘겨줍니다. 이것은 거의 표준적인 인페인트 워크플로입니다. 보통은 [VAE Encode (for inpainting)] 노드를 사용하는데, 이걸 사용하면 이상한 결과가 나오기 때문에 이렇게 두개의 노드로 사용합니다.

이상입니다. 이 글은 https://stable-diffusion-art.com/animate-partial-image-comfyui/ 를 일부 변경하고, 샘플 이미지는 제가 생성한 것으로 대체해 작성한 글입니다.

민, 푸른하늘

====