AI 이미지/SD Video

Stable Diffusion으로 비디오 생성하기(Deforum)

하늘이푸른오늘 2023. 8. 25. 11:31

Deforum은 스테이블 디퓨전을 사용해서 애니메이션 비디오를 생성하는 도구입니다. 프롬프트를 제공하고 카메라 이동 설정을 제공해주면 됩니다(물론 간단하지는 않습니다). 아래는 예입니다. 스테이블 디퓨전이 원래 이미지를 생성하기 위한 모델이니만큼 어느 정도 번쩍거림(프레임간 불일치)가 있는 것은 사실이지만, 놀라울만한 품질을 보여주네요.

Deforum 이란?

Deforum은 애니메이션을 제작하기 위한 오픈소스 무료 소프트웨어 입니다. deforum은 스테이블 디퓨전의 image-to-image 기능을 이용하여 여러 이미지를 생성한 다음 모두 붙여 비디오를 제작하는 방식입니다.

이때 이미지 프레임간 약간씩 변형되며, img2img 기능을 이용해 다음 프레임을 생성합니다. 프레임간 변화는 많지 않기 때문에 비디오의 느낌이 살아있게 됩니다.

Deforum 설치 방법(윈도)

여기에서는 윈도에서 AUTOMATIC1111 웹UI 상에 Deforum 확장을 설치하는 방법을 설명합니다(AUTOMATIC1111 설치방법은 이 글을 읽어보세요). 

1. 명령 프롬프트(command prompt)를 열고 스테이블 디퓨전 기본 디렉토리(....\stable-diffusion-webui)로 들어갑니다. 참고로 저는 F:\sd\stable-diffusion-webui 에 설치했습니다.

2. 다음 명령을 입력해서 deforum 확장을 설치합니다. 

git clone https://github.com/deforum-art/deforum-for-automatic1111-webui extensions/deforum

3. 설치가 완료되면 AUTOMATIC1111을 새로 시작합니다. Deforum 페이지가 보이면 정상적으로 설치된 것입니다.

비디오 생성 테스트

1. AUTOMATIC1111 웹UI에서 Deforum 페이지로 들어갑니다. 

Deforum 확장 페이지
Deforum 확장 페이지

2. Keyframes 탭으로 들어갑니다. 아주 여러가지 항목들이 있는데, 우선 다음 항목을 확인해 봅니다. 다만, 변경은 하지 않고 기본 값 그대로 사용합니다.

  • Maxframes : 비디오의 총 프레임입니다. 큰 값일 수록 비디오 길이가 길어집니다.
  • Motion 탭 : 카메라 움직임을 제어하는 곳입니다. 

Deforum Keyframes 탭
Deforum Keyframes 탭

3. Prompts 텝으로 들어갑니다. 아래 그림에서 보시는 것처럼, 번호와 텍스트로 이루어진 프롬프트가 여러개 들어 있습니다. 앞쪽의 숫자는 비디오 프레임입니다. 즉, 0번 프레임에서는 "tiny cute bunny...." 프롬프트가 실행되고, 30번 프레임부터는 "anthropomorphic clean cat..." 프롬프트가 실행되는 식으로 생성됩니다. 이번 테스트에서는 건드리지 않고 그냥 사용합니다.

Deforum Prompts 탭
Deforum Prompts 탭

4. [Generate]을 누르면 비디오가 생성됩니다. 비디오 생성이 완료된 후 [Genetate] 버튼 위에 있는 [Click here...] 버튼을 누리면 비디오를 확인할 수 있습니다. 참고로, 생성된 비디오는 img2img  로 생성되는 이미지 폴더에 들어가게 됩니다.

Deforum 비디오 생성 버튼
Deforum 비디오 생성 버튼

아래가 결과입니다. 토끼가 고양이가 되었다가, 코코넛을 거쳐 두리안으로 바뀌네요.

Deforum 생성 비디오 - tiny cute bunny

기본 설정

여기에서는 가장 중요한 아래 두가지 설정을 살펴보겠습니다. 이 두가지만 잘 조절하기만해도 괜찮은 비디오를 생성할 수 있습니다.

  • Keyframes 탭의 Motion 탭
  • Prompts 탭

그 전에 Deforumdl 이 어떤식으로 작동되는지 기본적인 이해가 필요합니다. 이 절에서는 여러 파라미터 중에서 한가지만 바꿔가면서 어떤 효과가 있는지 예제를 보면서 확인하겠습니다. 최종적으로는 여러가지 파라미터를 변경시키거나 on/off 시키면서 멋진 시각적인 효과를 거두는 것입니다.

Motion 설정

카메라 이동 설정은 두가지가 있습니다. 2D와 3D입니다. 2D 설정과 3D 설정은 아래와 같이 Animation mode에서 설정할 수 있습니다.

Deforum - Keyframes - Animation mode
Deforum - Keyframes - Animation mode

  • 2D: 이미지를 평면으로 생각해서 이미지 자체가 평행이동/확대축소/회전 등의 효과를 주는 것
  • 3D: 이미지를 3차원 장면에 대한 뷰로 취급하고, 카메라의 움직임을 지정하는 것

2D Motion 설정

2D Motion 설정은 Zoom/Angle/Translation 등으로 나누어져 있습니다. 값은 "프레임번호:이동량"으로 입력합니다. 값 설정에 관해서는 아래에서 다시 설명합니다.

  • 2D Zoom : 이미지를 확대하거나 축소합니다. 1보다 큰 값을 넣으면 확대되고, 1보다 적은 값을 넣으면 축소됩니다. 1을 기준으로 많이 벗어날 수록 확대/축소 비율이 커집니다. 기본적으로 화면 중심을 기준으로 확대/축소 되는데, 아래에 있는 Transform Center X, Transform Center Y를 사용해 중심 설정을 바꿀 수 있습니다.
zoom 0:(0.99) zoom 0:(1.01)
  • 2D Angle : 중심을 기준으로 이미지가 회전하는 양을 결정합니다. 양수를 넣으면 반시계 방향으로, 음수를 넣으면 시계방향으로 회전합니다. 큰 값일 수록 회전 속도가 빨라집니다.
angle 0:(2) zoom 0:(-2)
  • 2D Translation X, Y : Translation X는 이미지를 좌우로 움직이고, Translation Y는 이미지를 상하로 이동시킵니다. 양수는 오른쪽 또는 아래, 음수는 왼쪽 또는 위로 이동합니다. 큰 값일 수록 이동 속도가 빨라집니다.
translation X 0:(5) translation Y 0:(-5)
  • 2D Transform Center : Transform Center는 이미지 이동의 기준이 되는 점을 이동시킵니다. 축은 다음 그림과 같이 설정되어 있습니다. 우선 원점(0,0)은 좌상단이며, X 축은 왼쪽에서 오른쪽 방향, Y 축은 위에서 아래쪽 방향으로 설정되어 있습니다. 화면 중심은 (0.5, 0.5)가 기본값입니다. 

2D motion의 축 설정
2D motion의 축 설정

Transform Center X, Transform Center Y 값은 음수를 입력해도 되고, 1보다 커도 됩니다. 그러면 중심이 화면 바깥이 된다는 점만 기억하면 됩니다. 

아래 왼쪽은 Transform Center 를 좌상단, 우하단으로 둔 상태에서 확대를 하는 모습입니다.

transform X 0:(0)
transform Y 0:(0)
zoom: 0:(1.01)
transform X 0:(1)
transform Y 0:(1)
zoom: 0:(1.01)
  • 2D Perspective flip : 이미지를 3D 비슷하게 회전시키는 효과를 보이는 방법입니다. 이를 적용하려면, Motion 아래쪽에 있는 Enable perspective flip을 선택해야만 적용할 수 있습니다.

Perspective flip
Perspective flip

다만, 이동하는 모습은 까다로워서 아래에 예시만 보여드립니다.

theta : 0:(12) phi : 0:(12) gamma : 0:(12)

3D Motion 설정

3D 모션은 사용자가 카메라를 들고 있다고 가정한 상태에서 카메라를 이동시키는 형태로 이동을 지정합니다.

  • 3D Translation X, Y : X 는 카메라를 좌우로 움직이는 이동입니다. 양수는 카메라를 우측으로 움직이고, 음수는 카메라를 좌측으로 움직입니다. 따라서 대략적으로 2D Translation과 반대방향으로 움직이는 효과가 나타납니다. 
    Y는 카메라를 상하로 움직이는 이동입니다. 양수는 카메라를 아래로 움직이고, 음수는 카메라를 위로 움직입니다.
  • 3D Translation Z : 카메라를 앞으로 전진시키는 이동입니다. 2D Motion의 zoom과 비슷한 효과가 나타납니다.
tranlation X 0:(2) tranlation Y 0:(2) translation Z : 0:(2)
  • 3D Rotation X, Y, Z : 각각 X축/Y축/Z축 방양으로 카메라를 회전시킵니다.
rotation X : 0:(2) rotation Y : 0:(2) rotation Z : 0:(2)

모션 스케줄

모션은 아래와 같은 형태로 설정합니다.

frame1:(value1), frame2:(value2), frame3:(value3), ...

모션은 2개의 번호로 구성됩니다. 앞쪽 번호는 반영되기 시작하는 프레임 번호이고, 뒤쪽 번호는 해당 값입니다. 두 값 사이에는 콜론(:)이 있어야 합니다. 모션과 모션 사이에는 콤마(,)가 있어야 하고요.

항상 첫번째 모션은 0 번 프레임부터 시작해야 합니다. 

두개 이상이 있을 경우, 그 사이는 선형으로 변경됩니다. 예를 들어 [0:(1), 100:(1.02), 200:(1)]와 같이 3개의 이동을 지정할 경우, 아래처럼 서서히 증가했다가 서서히 줄어드는 형태로 이동됩니다.

여러 값이 있을 경우의 내삽
여러 값이 있을 경우의 내삽

따라서 갑자기 값을 변화시키려면 [0:(1), 99:(1), 100:(1.02), 150:(1.02), 151:(1), 200:(1)] 같은 형태로 지정하여야 합니다. 

값의 급작스런 변화
값의 급작스런 변화

예제

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

첫번째 이미지에서 지정된 톤, 색상 등이 나머지 부분에 모두 영향을 주므로, 첫번째 이미지를 확실하게 설정하는 것이 매우 중요합니다. 먼저 txt2img에서 해당 프롬프트를 사용해 충분히 연습해 본 뒤, Deforum에서 비디오를 생성하는 것이 좋습니다. 

예들 들어 다음과 같이 설정해서 이미지를 생성해 보겠습니다.

모델: Protogen v2.2
프롬프트: portrait of henry cavill as james bond, casino, key art, sprinting, palm trees, highly detailed, digital painting, artstation, concept art, cinematic lighting, sharp focus, illustration, by gaston bussiere alphonse mucha
부정적 프롬프트: deformed, disfigured
씨드 번호: -1

이와 같이 생성을 해서 마음에 드는 이미지를 찾으면, 해당 이미지의 시드번호(아래에서 파란색 부분)를 복사해 둡니다.

portrait of henry cavill as james bond
portrait of henry cavill as james bond

2 단계: 첫번째 비디오 세그먼트 생성

Prompts 탭에 프롬프트를 입력합니다. 두번째에 있는 프롬프트는 deforum에 기본 값으로 있던 프롬프트를 재활용했습니다.  첫번째 프롬프트 맨 마지막을 보시면 "--neg deformed, disfigured"라고 되어 있는데, 부정적 프롬프트는 이렇게 입력하면 됩니다.

아래 프롬프트는 맨 처음에는 제임스본드가 나오고, 50프레임에서는 고양이로 바뀌게 됩니다.

{
    "0": "portrait of henry cavill as james bond, casino, key art, sprinting, palm trees, highly detailed, digital painting, artstation, concept art, cinematic lighting, sharp focus, illustration, by gaston bussiere alphonse mucha --neg deformed, disfigured",
    "50": "anthropomorphic clean cat, surrounded by fractals, epic angle and pose, symmetrical, 3d, depth of field, ruan jia and fenghua zhong"
}

이제 Run 탭으로 들어갑니다. 아래와 같이 모델을 선택하고 복사해두었던 시드번호를 입력합니다(그런데 여러번 실행했는데, txt2img의 시드번호가 잘 먹질 않네요. 좀 더 테스트가 필요할 듯 싶습니다). 

Deforum 설정 - 모델/씨드번호
Deforum 설정 - 모델/씨드번호

다음으로 Keyframes로 이동합니다.

  • Animation mode를 3D로 설정하고, Max frames를 100으로 설정합니다.

다음은 Motion 탭으로 이동해 아래와 같이 설정합니다.

  • Translation X : 0:(2) : 카메라를 우측으로 이동시킵니다.
  • Translation Z : 0:(1.75) : 카메라를 전진시킵니다.(이미지 확대)
  • 나머지는 0:(0)으로 놓아둡니다.

카메라 이동 설정
카메라 이동 설정

이제 [Generate] 버튼을 눌러줍니다. 아래는 현재까지 만들어진 결과입니다. 전체적으로 왼쪽으로 이동하면서 확대되는 효과와, 얼굴이 고양이로 변화는 효과가 그런대로 잘 나타나있습니다.

3단계 : 다음 프롬프트 추가

프롬프트를 아래와 같이 추가해 보겠습니다(세번째 프롬프트에는  epiNoiseoffset v2 LoRA를 추가했습니다. 이 LoRA는 콘트라스트를 확대시켜주는 역할을 합니다. LoRA에 대해서는 이 글을 참고하세요).

{
    "0": "portrait of henry cavill as james bond, casino, key art, sprinting, palm trees, highly detailed, digital painting, artstation, concept art, cinematic lighting, sharp focus, illustration, by gaston bussiere alphonse mucha --neg deformed, disfigured",
    "50": "anthropomorphic clean cat, surrounded by fractals, epic angle and pose, symmetrical, 3d, depth of field, ruan jia and fenghua zhong",
    "90": "giant floating space station, futuristic, star war style, highly detailed, beautiful machine aesthetic, in space, galaxies, dark deep space <lora:epiNoiseoffset_v2:1> --neg bad art, amateur"
}

다른 세팅은 아래와 같이 수정해 주었습니다. 나머지는 그대로 두었습니다.

  • Max frames : 200
  • Rotation Y : 0:(0), 70:(0), 71(0.5)  - 71 프레임부터 Y 방향 회전을 추가합니다.

이제 [Generate] 버튼을 눌러줍니다. 아래는 생성된 결과입니다. 제법 그럴듯하네요.

이미지 키프레임 기반의 비디오 생성

지금까지는 프롬프트만을 사용해서 비디오를 생성했습니다. 이 방법이 편한 점은 있지만 이미지를 마음대로 설정하지 못한다는 단점이 있습니다. 예를 들어 위의 예에서 맨 마지막 프롬프트는 space station이 중심인데, 제가 원하는 형태가 아닌 다른 형태의 우주정거장이 만들어져서 불만이었거든요. 머... 그다지 나쁜 것은 아니었지만요.

이럴 때 내가 키프레임을 지정해두고, 그 사이를 중간 이미지로 매꿔가는 형태로 비디오를 만들 수 있으면... 좋겠다... 했더니 아래 그림처럼 Keframes 탭 속에 "Guided Images"라는 부분이 있네요.  프롬프트와 비슷한 형태로 5개의 이미지를 주고 이미지를 생성하는 방법입니다.

Deforum - Guided Image 모드
Deforum - Guided Image 모드

여기에 있는 이미지는 아래와 같습니다. 


일단 형태를 보면, 이 중간의 이미지가 채워져서 비디오가 만들어질 것 같은데... 처음에 있는 예제대로 해도 잘 생성이 안되네요. 나중에 좀 더 연구해 봐야겠습니다. ㅠㅠ

조금 더 살펴보니, Guided image는 그냥 img2img에서 참조 이미지 역할만 하네요. 즉 프롬프트가 유효하기 때문에 위의 이미지들은 그냥 분위기나 구도에만 영향을 미칩니다. 이 걸로는 제가 생각하는 걸 할 수는 없는 것 같네요. 그래도 프롬프트 변경과 Guided image를 잘 맞추면 훨씬 비디오 품질이 좋아지지 않을까... 싶기는 합니다. 나중에 시간나면 다시 테스트해보겠습니다. 

참고 사항

  • 피사체가 클 수록 잘 생성됩니다. 
  • 작은 디테일은 계속 변경됩니다. img2img를 사용하면 항상 발생할 수 밖에 없죠. 그래서 두번째 이후에는 프랙탈(fractal)과 같은 패턴이나 상상의 피사체를 넣으면 훨씬 더 잘 작동할 수 있습니다.
  • 프롬프트 전환시 결함이 발생되면 프롬프트의 프레임을 약간 옮기면 해결될 수 있습니다.
  • Output 탭속에 있는 Make GIF 옵션을 선택하면 GIF 도 생성할 수 있습니다. 
  • Output 탭의 Delete Imgs 옵션을 선택하면 중간 이미지들이 자동적으로 삭제됩니다.

이상입니다. 이 글은 https://stable-diffusion-art.com/deforum/ 을 번역하고, 예제도 일부는 그냥 가져왔으며, 프롬프트는 거의 그대로 사용하여 작성한 글입니다.