AI 이미지/SD Video

AnimateDiff를 사용한 Vid2Vid - ComfyUI

하늘이푸른오늘 2023. 10. 21. 18:03

이 글에서는 AnimateDiff Prompt Travel Video-to-video, 즉, AnimateDiff 와 프롬프트를 사용해서 기준 Video를 유사한 다른 비디오를 만드는 기법을 소개시켜드립니다. 이제까지 Stable Diffusion을 사용해서 비디오를 만드는 방법은 여러번 소개시켜드렸는데(다섯가지 방법, Deforum, AnimateDiff) 여러가지 한계가 있었습니다. 이 글에서 소개시켜 드리는 방법도 완벽하다고는 할 수 없지만, 상당히 부드럽고 일관성이 있는 비디오를 생성할 수 있는 기법입니다.

이 글의 목차는 아래와 같습니다.

AnimateDiff Prompt Travel의 작동 원리

AnimateDiff는 제 글에서도 여러번 소개시켜드렸는데, 어떠한 스테이블 디퓨전 모델을 사용해도 상당히 괜찮은 비디오를 생성해주는 놀라운 도구입니다. 다른 도구와는 달리 장면과 장면사이에 일관성이 유지되어서 번쩍거림이 없는 비디오를 만들어주죠. 하지만, 생성된 비디오가 아주 짧고(대부분 2-3초) 한정된 움직임만 표현하며, 그나마 움직임 제어가 거의 불가능하다는 단점이 있습니다.

AnimateDiff Prompt Travel 기법은 다음과 같은 여러가지 기법을 동원하여 비디오를 생성함으로써, 위에서 설명한 여러가지 단점을 극복할 수 있는 기법입니다. 

  • AnimateDiff의 국부적인 일관성 유지
  • ControlNet 을 이용한 참조 비디오의 움직임 복제
  • 시간대별로 프롬프트를 변경하여 여러가지 장면을 생성

AnimateDiff Prompt Travel 기법을 요약하면 아래와 같습니다.

  • 비디오를 입력을 사용
  • Openpose 전처리기를 사용해서 각 비디오 프레임으로부터 자세를 추출
  • AnimateDiff Motion 모델과 Openpose 모델을 사용해 각 프레임의 모델을 제어
  • 각 프레임에 대해 다른 프롬프트를 적용
  • 최종 비디오 저장

소프트웨어 설정

이 글에서 나오는 기법을 사용하기 위해서는 스테이블 디퓨전용 웹UI중 하나인 ComfyUI를 사용합니다. ComfyUI 를 설치하는 방법 및 기초적인 사용법은 이 글을 읽어보시기 바랍니다. 

또한 ComfyUI Manager 를 설치하셔야 합니다. 설치 방법은 이 글을 읽어보세요.

워크플로 불러오기

ComfyUI 는 워크플로를 완벽하게 복제할 수 있는 장점이 있습니다. 워크플로는 생성된 이미지를 사용하여 공유할 수도 있고, JSON 파일을 사용하여 공유할 수도 있는데, 저는 워크플로 이미지를 공유하는 것을 선호합니다. 아래의 그림을 다운로드 받은 후, ComfyUI 캔버스에 Drag&Drop하면 워크플로가 복원됩니다.

AnimateDiff vid2vid 워크플로

다만, 이 워크플로를 불러들이면 대부분 아래와 같이 에러가 발생할텐데, 이 글을 읽어보시면 해결하실 수 있습니다. 

커스톰 노드 부족 오류

사용방법

체크포인트 모델 선택

이 글에서는 Dreamshaper 8 모델을 사용합니다. 모델이 없을 경우에는 다운로드 받아 "ComfyUI > models > checkpoints" 폴더에 넣어줍니다. AUTOMATIC1111과 모델파일을 공유하실 경우에는 이 글을 참고하세요. F5를 눌러  ComfyUI 화면을새로고침(Refresh)하면 적용이 됩니다.

그 다음 [Load Checkpoint w/Noise Select] 노드를 찾아 체크포인트 파일이 dreamshaper_8.safetensors인지 확인합니다. 

Load Checkpoint w/Noise Select 노드

물론 반드시 이 모델을 사용해야 하는 건 아니고, SD1.5 모델이라면 어떤 걸 사용해도 무방합니다.^^ 

VAE 모델 선택

Stability AI에서 공개한 VAE 파일을 다운로드 받아 "ComfyUI > models > vae" 폴더에 넣습니다. 마찬가지로  을 보시면 AUTOMATIC1111과 공유할 수 있고,  F5를 눌러 ComfyUI 화면을 새로고침(Refresh)하면 적용이 됩니다. 

[Load VAE]노드를 찾아 다운로드 받은 파일을 선택합니다.

VAE Loader 노드

AnimateDiff 모델 선택

그 다음 AnimateDiff 모델을 다운로드 받으셔야 합니다. 아래의 폴더에 들어가서 mm_sd_v15_v2.ckpt 모델을 받은 후...

https://huggingface.co/guoyww/animatediff/tree/main

아래 폴더에 넣어주면 됩니다. ComfyUI 화면을 새로고침(Refresh)하면 적용이 됩니다. 

ComfyUI\custom_nodes\ComfyUI-AnimateDiff-Evolved\models

다음으로[AnimateDiff Loader] 노드를 찾아, 어래와 같이 mm_sd_v15_v2.ckpt 을 선택해줍니다.

AnimateDiff Loader 노드

Openpose ControlNet 모델 선택

sd1.5용 콘트롤넷 모델 사이트에서 openpose ControlNet 모델을 다운로드 받아 ComfyUI > models > controlnet 폴더에 넣어줍니다.  ControlNet 모델도 AUTOMATIC1111과 공유할 수 있습니다. 이 글을 참고하세요. F5를 눌러  ComfyUI 화면을새로고침(Refresh)하면 적용이 됩니다.

[Load ControlNet Model(Advanced)] 노드에서 아래와 같이 control_v11p_sd15_openpose.pth를 선택합니다.

Load ControlNet Model(Advanced) 노드

참조용 비디오 올리기

한 사람이 나오는 비디오라면 어떤 비디오도 괜찮습니다. 아래는 원본 글에 있는 비디오입니다. 이 비디오를 사용해 테스트하셔도 됩니다.

https://stable-diffusion-art.com/wp-content/uploads/2023/10/man_dance_2to3_24fps_9s.mp4
춤추는 남자

아래 그림과 같이 원하는 비디오를 [Load Video(Upload)] 노드에서 맨아래에 있는 [choose file to upload] 버튼을 눌러 선택합니다.

[Load Video(Upload)] 노드

비디오 생성

이제 [Queue Prompt]를 클릭하면 비디오가 생성되기 시작합니다. 물론 시간이 엄청 많이 걸립니다. 맨처음에는 [Preview Image] 노드에서 잠깐 랙이 걸리는 듯 하다가, [DWPreprocessor]에서 한참 서 있는 듯하다가(저는 이상한 에러메시지(아래를 보세요)가 나와서 아예 멈춘 줄 알고 두번이나 ComfyUI를 새로 시작했었습니다) KSampler 노드가 아주 많은 시간을 소요합니다. 

[AnimateDiffEvo] - WARNING - ffmpeg could not be found. Outputs that require it have been disabled
F:\comfyUI\ComfyUI_windows_portable\ComfyUI\custom_nodes\comfyui_controlnet_aux\src\controlnet_aux\dwpose\__init__.py:175: UserWarning: Currently DWPose doesn't support CUDA out-of-the-box.
  warnings.warn("Currently DWPose doesn't support CUDA out-of-the-box.")

제 컴은 3070 8GB인데, 대략 30 분 정도  걸린 듯 싶네요. KSampler가 다 끝나면 아래와 같이 비디오가 생성됩니다.

AnimateDiff Combine 노드

아래가 생성된 영상입니다. 흠... 영상 속도가 많이 느려졌네요. 위에서 frame_rate 를 크게 바꿔야 할 것 같습니다.

아래는 모델을 "Anyting V5"로 바꾸고 frame_rate를 24로 올린 결과입니다.

생성된 영상 품질 검사

이 워크플로에는 중간단계에서 생성된 프리뷰 이미지가 3군데 있습니다. 첫번째는 비디오에서 추출한 원본 프레임, 두번째는 이 프레임 이미지로 부터 추출한 openpose 콘트롤 이미지, 세번째는 생성된 이미지 프레임입니다. 이 이미지들을 살펴보면서 잘못된 부분이 있는지 확인해보면 최종 영상에서 문제가 되는 부분들을 확인할 수 있습니다. 

하지만... 예를 들어 Openpose에서 자세를 잘못 추출했다면 어떻게 수정해야 하는지 잘 모르겠네요. 최종이미지도 마찬가지로 잘못된 것만 새로 생성하는 방법이 있는지 잘 모르겠습니다. 제가 만든 워크플로가 아니라 가져온 거라서 이해가 안되는 부분이 많거든요. 

생성 설정 변경

다른 비디오를 생성하려면 Primitive (Seed) 노드에서 씨드 값을 바꿔주면 다른 비디오가 생성됩니다. 물론 체크포인트 모델을 바꾸면 당영히 다른 비디오가 생성되고요.

프롬프트도 바꿔줄 수 있습니다. 이 워크 플로에서는 "High detail, girl, short pant, t-shirt, sneaker"라는 프롬프트와 "(bad quality, worst quality:1.2), hat, temple"라는 부정적 프롬프트를 사용했는데, 원하는 어떤 프롬프트도 사용할 수 있습니다.

프롬프트 관련 노드들

그리고 가운데 있는 [Batch Prompt Schedule]은 위의 기본 프롬프트와 함께 사용되며, 시간에 따라 프롬프트를 바꾸는 역할을 합니다. 예를 들어 0~23 프레임에서는 "High detail, girl, short pant, t-shirt, sneaker, a modern living room"이라는 프롬프트로 이미지가 생성되며 24~59 프레임에서는 " High detail, girl, short pant, t-shirt, sneaker, beach and sun"이라는 프롬프트가 적용됩니다. 이 [Batch Prompt Schedule] 노드 덕분에 배경이 바뀌는 것입니다.

[Load Video (Upload)] 노드에서는 입력 비디오를 바꾸는 것 뿐 만 아니라, 다른 설정도 바꿀 수 있습니다. "frame_load_cap" 설정은 비디오에서 추출하는 최대 프레임 수를 뜻하며, "select_every_nth"는 프레임을 얼마나 자주 추출할 지를 설정합니다. 여기에서 처럼 2로 설정하면 하나씩 건너뛰고 추출하므로 추출된 프레임 수가 절반으로 줄어들게 됩니다.

좋은 영상을 만들기 위한 팁

얼굴

원래 SD1.5에서는 얼굴의 크기가 작으면 잘 생성해 내지 못합니다. 따라서 얼굴이 작은 비디오의 경우에는 (위에서 생성한 결과물 처럼) 얼굴이 이상해지기 쉽습니다. 

얼굴이 이상한 이미지

이럴 때 비디오의 크기를 키우면 보다 얼굴이 자연스러워집니다. 아마도 AfterDetailer를 사용하면 이 문제를 해결할 수 있을 것 같은데... 아직까지 저는 실력이 안되네요~

비디오 생성 속도를 빠르게

속도를 빠르게 하는 방법은 추출하는 프레임 수를 줄이는 방법뿐이 없습니다. 즉, [Load Video (Upload)] 노드에서 "select_every_nth"를 2~3 정도로 두면 움직임은 좀 덜 부드럽지만 생성 속도는 빨라지게 됩니다.

체크포인트 모델 선택

AnimateDiff 가 모든 체크포인트에 대해 좋은 품질을 만드는 것은 아닙니다. 어떤 체크포인트 모델은 잘 되고, 어떤 모델에서는 안되는 경우가 있으니 잘 생성이 안되면 다른 모델로 바꿔 생성해보는 게 좋을 수 있습니다.

프롬프트

AnimateDiff 가 모든 키워드를 잘 이해하는 것은 아니기 때문에, 이상하게 생성된다면 키워드를 검토해보시는 게 좋습니다. 무엇보다 이 예처럼 짧고 간단한 프롬프트로 시작하는 게 좋고, 필요에 따라 하나씩 추가해가는 게 좋습니다.

다른 콘트롤넷

이 글에서는  Openpose 콘트롤넷을 사용했는데, Openpose의 경우 사람의 자세만 추출하므로, 배경을 마음대로 바꿀 수 있는 장점이 있습니다. 

반면 동일한 배경을 사용하고 싶다면, Line art와 같은 선을 추출하는 콘트롤넷 모델을 사용할 수 있습니다. 아래는 그 예입니다. (제가 생성한 것이 아니라, 원본 글에 있는 동영상입니다). 이 워크플로는 여기를 다운로드 받으시면 됩니다.

이상입니다.

민, 푸른하늘