AnimateDiff : ANIMATE YOUR PERSONALIZED TEXT-TO-IMAGE DIFFUSION MODELS WITHOUT SPECIFIC TUNING
animateDiff 논문 paper
Sep 27, 2024
adding motion dynamics
dataset : WebVid-10M
T2I model을 특별히 추가로 tuning하지는 않는다.
- Domain adapter를 비디오 데이터로 base T2I에 fine-tune한다. 이렇게하면 motion module이 픽셀 단위의 정확성보다는 영상이라는 데이터의 움직임을 학습하는데 집중하게 된다
- 새로운 모션 모듈을 도입하고 [T2I, 도메인 어댑터]의 가중치는 fix해둔 뒤 다같이 사용해서 학습시킨다. 이렇게하면 general한 motion을 학습할 수 있다.
- 학습해서 얻은 motion module에, 특정 motion pattern을 적은 짧은 데이터로도 LoRA로 학습시킬 수 있다.
temporal axix로 transformer 구조를 적용하는게 motion prior를 배우도록 하는데 좋았다.
Base로 stable diffusion 사용 - down/up sample blocks at 4 resolution levels
Method
motion module이 어떻게 들어가는거지?
학습되는 것들
Domain adapter
비디오 데이터셋과 이미지 셋은 퀄리티 차이가 다르다. 특히 비디오는 만들어진(그림, 애니메이션 등) 영상이 그림에 비해 매우 적다. 비디오의 각 프레임도 이미지에 비해서는 안좋다.
그게 문제가 될 수 있다고 말함. motion module이 이미지와 비디오의 차이를 배워야하는데 퀄리티가 다른걸 배우려고 할까봐
→ propose to 도메인 정보는 별개의 네트워크에 학습시키기 : domain adapter
inference time에는 없애고 안쓴다.
구현은 LoRA로 했고 self/cross attention에 주입했다.
그리고 비디오 데이터셋에서 랜덤하게 뽑은 이미지로 이걸 학습했다. 기존의 Diffuion loss로
LEARN MOTION PRIORS WITH MOTION MODULE
모델 dynamics를 모델링하기위해 1) 2d diffusion model을 3d video data를 다룰 수 있게 확장해야하고 2) 시간 축에서 효율적으로 정보를 교환할 수 있는 방식으로 sub-module을 설계해야한다.
- 이미지 능력이 좋으니까 써먹고 싶다. 그러려면 비디오를 각 프레임별 이미지로 다루도록 뭔가 설계하는게 좋다.
모델이 처리하는 tensor가 b*c*f*h*w 5D가 되도록 하자!
구조가 그렇지 않으니까 일단 B*F x C x H x W로, frame을 배치쪽에 보내버려서 재구성하자. 그리고 image layer를 지나면 다시 B x C x F x B x W로 재구성.
motion module은(여기서는 LoRA), B*H*W x C x F로 바꿔서 움직임에 집중하게 한다.
그리고 프레임 단위로 구분하고 이걸 temporal axis로 보면 데이터는 (B*H*W) x C인 벡터가 f개 나열된 sequence가 된다. 여기에 self-attention 적용
attention은 다른 프레임의 정보를 반영해서 현재 프레임을 생성할 수 있게 해준다. attn 적용 이전에 positional encoding 꼭 해줘야함. 원래 모델 위에 새로운 모듈을 추가하고 학습할 때 부작용을 방지하기 위해 마지막 레이어는 zero initialize하고, residual connection도 주었다.
In practice
training
motion module은 거의 비슷하지만 고차원 비디오 데이터를 처리하게 하기위해 objective를 약간 바꿨다.
구체적으로
- video data batch 가 latent code 로 frame 별로 인코딩된다. by pre-trained SD auto-encoder
- 그리고 forward diffusion process를 적용해서 noise로 만든다.
- inflated model이 noised latent를 입력으로 받아 노이즈를 예측하려고 한다. 그래서 최종적으로 모션 모듈의 objective는
Inference
domain adapter를 빼진 않고 반영 조절 값을 0으로 세팅한다.
결과
domain adapter가 중요한?
1.0은 도메인 adapter를 그대로 사용하는 것. 눈으로 봤을 때도 퀄리티 차이가 있다. 근데 그걸 떠나서 이미지 구도 자체가 다른데..?
읽고 난 뒤의 질문(대답하기 전까지 닫으면 안된다.)
- 그럼 temporal Transformers로 각 프레임별로 zout을 만드는 목적은 auto-regressive가 아니라 그냥 자기 포함 앞뒤를 다 보는거지?
→ 맞는 것 같다.
각 프레임 순서 i가 포지셔널 인코딩 되어서 사용되고
- 이거 리소스가 얼마나 든거지
데이터셋은 WebVid-2 : 10 million video clips with captions
GPU는 알수가 없네..
- 정해진 길이만 학습/생성하는 개념인가?
next frame prediction이 아니니까.
Share article
Subscribe to our newsletter