AI 이미지 생성에서 정적인 프레임을 넘어 움직임이 있는 장면을 만들어보고 싶다는 생각은 자연스럽게 따라온다. 특히 애니메이션에서 볼 수 있는 짧은 연출, 인물이 카메라 앞에서 천천히 움직이거나 머리카락이 바람에 흩날리는 장면, 조명의 각도가 조금씩 달라지는 몽환적인 씬을 AI로 만들어낼 수 있다면 얼마나 매혹적일까? 그런 욕망에서 시작된 것이 바로 AnimateDiff 실험이다. 이 글에서는 내가 실제로 AnimateDiff를 설치하고 실험하며 겪은 시행착오와 노하우, 그리고 프롬프트, 파라미터 튜닝, 결과물 비교 등을 예제 중심으로 풀어본다. 단순히 "움직이게 만들었다"는 정도를 넘어서, 어떤 조건에서 어떤 방식으로 시각적으로 살아 있는 장면을 만드는지 구체적으로 들여다본다.
1. AnimateDiff 설치와 환경 세팅
처음 AnimateDiff를 시도할 때는 생각보다 많은 의존성과 경로 설정 이슈가 발목을 잡았다. Colab, 로컬, RunPod 등 다양한 환경에서 시도해봤고, 각 환경마다 장단점이 분명했다. 내 경우에는 Colab에서 시작했으나 자주 끊기는 세션과 VRAM 부족 문제가 반복되었고, 이후 RunPod로 전환하면서 안정적인 실험이 가능해졌다.
기본적인 설치 흐름은 다음과 같았다:
- diffusers 라이브러리 설치 (0.26.3 이상 필요)
- transformers, xformers, accelerate, safetensors, imageio 등 필수 의존성 설치
- 모델 체크포인트(.safetensors) 준비 및 huggingface에서 motion adapter 로드
- AnimateDiffPipeline을 통한 초기화 및 scheduler 세팅
from diffusers import AnimateDiffPipeline, DDIMScheduler, MotionAdapter
import torch
adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", torch_dtype=torch.float16)
model_id = "SG161222/Realistic_Vision_V5.1_noVAE"
pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, torch_dtype=torch.float16)
pipe.enable_vae_slicing()
pipe.enable_model_cpu_offload()
2. 첫 번째 실험과 예상 밖의 실패
모든 설치를 마친 뒤, 나는 16프레임짜리 짧은 애니메이션을 만들어보기로 했다. 프롬프트는 다음과 같았다:
prompt = (
"a young girl walking through a foggy forest, ethereal light, cinematic atmosphere, muted color palette"
)
하지만 결과는 당황스러웠다. 첫 번째 프레임은 괜찮았으나, 뒤로 갈수록 인물이 왜곡되거나 배경이 흐려졌다. 특히 움직임이 부자연스러웠는데, motion_bucket_id 값을 아무 설정 없이 기본값으로 두었던 것이 문제였다. 또한 num_inference_steps 값이 낮아 품질이 떨어졌고, guidance_scale 값이 지나치게 높아 불안정한 움직임이 발생했다.
이후 다음과 같은 파라미터 튜닝을 시도했다:
- motion_bucket_id: 50 → 150 으로 증가 (더 풍부한 움직임 유도)
- guidance_scale: 7.5 → 4.0 (과도한 정밀도 요구 억제)
- num_inference_steps: 25 → 50 (프레임 디테일 개선)
이후에는 결과가 상당히 개선되었고, 인물의 움직임이 부드러워지며 배경과의 조화도 살아났다.
3. 프레임 수에 따른 이미지 퀄리티 비교
프레임 수는 결과물의 퀄리티에 직접적인 영향을 준다. 다음은 내가 실험해본 프레임 수 별 결과 요약이다:
프레임 수 특성 장점 단점
8 | 단편적, 루프같음 | 생성 속도 빠름 | 움직임 거의 없음 |
16 | 자연스러운 미니 클립 | 감정 묘사 가능 | 배경 일관성 약함 |
24 | 애니메이션 느낌 | 카메라 워크 가능 | VRAM 사용량 증가 |
32 이상 | 시네마틱한 장면 가능 | 감정+조명 표현 탁월 | 렌더링 시간 증가 |
16~24 프레임이 가장 이상적인 밸런스 구간이라는 결론을 얻었다. 32프레임 이상에서는 배경이 살짝 흔들리거나 의도하지 않은 왜곡이 나타났으며, VRAM이 부족해 실패하는 경우도 종종 있었다.
4. 프롬프트 설계 예제와 결과 비교
같은 장면을 프롬프트만 바꿔서 실험했을 때의 결과도 흥미로웠다. 아래는 동일한 기본 장면에 프롬프트 조합을 달리한 사례다:
예제 1 - 감정 강조
a sad girl standing in the rain, looking down, soft lighting, reflective puddles
→ 결과: 인물의 고개 숙임과 감정 전달 훌륭, 배경 움직임 없음
예제 2 - 카메라 워크 강조
a girl walking slowly, side profile, leaves falling around, camera panning
→ 결과: 부드러운 좌우 이동, 움직임 역동적이나 손 떨림 느낌 있음
예제 3 - 배경 중심 연출
a field of tall grass swaying in the wind, golden hour, volumetric sunlight
→ 결과: 풍경 전체가 살아있는 듯한 움직임, 인물 없음
5. Motion Adapter 및 커스터마이징
AnimateDiff의 핵심은 motion adapter를 어떻게 쓰느냐에 달려 있다. 단순히 pretrained adapter를 사용하는 것에서 끝나지 않고, motion bucket의 범위 조정, custom adapter fine-tuning, LoRA 방식으로 세분화한 motion injection 등을 실험했다. 특히 고해상도 움직임을 위해선 adapter의 torch_dtype 설정을 float32로 설정하는 것이 품질 향상에 유리했지만, GPU VRAM 부담도 커졌다. 일부 실험에서는 motion adapter 대신 ControlNet을 병행 적용해 움직임을 좀 더 정교하게 제어할 수 있었다. 예를 들어 'camera rotation' 같은 추상적 움직임은 일반 adapter로는 표현이 어려웠고, 별도의 latent mask 혹은 pose guidance가 필요했다.
아래는 custom adapter를 적용했을 때의 초기화 코드 예시이다:
adapter = MotionAdapter.from_pretrained("custom/motion-drift-rotational-v1", torch_dtype=torch.float32)
pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter)
6. 오디오 기반 움직임 생성 실험 (Audio-Reactive Motion)
AI 이미지가 음악에 반응해 움직인다면 어떨까? 이 상상을 실현하기 위해 기본적인 음악 분할(beat tracking) 알고리즘을 접목해보았다. librosa, madmom 등의 라이브러리를 활용해 비트가 발생하는 지점마다 프레임에 motion intensity를 삽입하거나, frame range를 특정 박자에 동기화시켜보았다. 물론 아직 AnimateDiff에서 직접적으로 오디오 입력을 받는 기능은 없지만, 사운드에 맞춰 움직이는 듯한 모션을 연출하는 데는 충분한 효과를 보였다.
예:
- 4/4 비트 음악 → 8프레임 단위로 motion_bucket_id 변화를 주어 리듬감 부여
- ambient soundtrack → 전체 motion intensity를 낮추고 흐느적거리듯한 움직임 설정
앞으로 이 파트는 ControlNet의 audio2motion 확장 모델과 함께 더 깊게 연구할 계획이다.
7. 고해상도 + NSFW 프레임 최적화
AnimateDiff는 일반적인 SD 1.5 베이스 모델 기반으로 동작하기 때문에, NSFW 스타일의 프롬프트를 적용하는 데 별다른 제약은 없다. 다만 고해상도 생성 시에는 다음과 같은 문제가 자주 발생한다:
- 프레임 간 피부톤, 질감 불일치
- 의복이나 배경이 프레임마다 달라지는 현상 (aliasing)
- 손, 눈, 입 주변의 왜곡
이 문제를 해결하기 위해 다음 전략들을 시도했다:
- 프레임당 cross-attention weight freezing
- VAE 설정을 float32로 변경 후 재샘플링
- 같은 시드로 동일 base noise 적용 후 latent blending
- denoising_start=0.2, denoising_end=0.9 값 고정으로 안정화
결과적으로 세미 리얼리즘 기반의 모델(예: ChilloutMix, AOM3)에선 가장 일관된 프레임 품질을 확보할 수 있었고, RealisticVision + PerfectWorld 조합은 피부 질감이 너무 다르게 나오는 문제가 있어 조심스러웠다.
8. WebUI 연동과 자동화 루틴 구축
WebUI (AUTOMATIC1111 기반)에 AnimateDiff 확장을 붙이는 방법도 여러 가지 실험했다. WebUI에서는 AnimateDiff 확장 탭을 통해 직접 프레임 수, motion strength, interpolation 기능을 조절할 수 있으며, deforum 플러그인을 연동하면 더욱 다양한 키프레임 기반의 움직임 설계가 가능하다. 특히 WebUI의 batch scheduling 기능을 이용하면 다음과 같은 워크플로우도 구현할 수 있다:
- prompt rotation으로 프레임 간 스타일 변화 실험
- LoRA weight 조정으로 캐릭터 감정 변화 표현
- gif export + audio overlay 자동 실행 스크립트로 최종 아트 생성
WebUI는 초심자에게 접근성이 좋고, 다양한 확장을 적용하기 편하지만, 고해상도 + 긴 프레임 처리에는 CLI 기반 diffusers 스크립트가 더 효율적이었다. 특히 4090, A100급 GPU를 쓸 수 있는 RunPod, Paperspace 등의 플랫폼에서 CLI 기반으로 애니메이션을 생성할 경우 VRAM 효율성이 압도적으로 높았다.
9. AnimateDiff 실전 활용 사례 (내가 만든 장면들)
🎬 케이스 1 - 밤거리에서 우산을 쓰고 걷는 여성
- 프롬프트: a girl walking with an umbrella at night, soft glow, raindrops, cinematic angle
- 모델: ChilloutMix
- 프레임 수: 24
- 특이사항: motion_bucket_id 160, guidance_scale 5.5 → 자연스러운 걸음과 머리카락의 떨림 묘사 성공
🎬 케이스 2 - 해변에서 파도를 바라보는 인물
- 프롬프트: a person standing at the shore, waves crashing, orange sunset, wind blowing hair
- 모델: RealisticVision + LoRA (beach-light)
- 프레임 수: 32
- 특이사항: 해수면 애니메이션은 background interpolation으로 구현, 눈 깜빡임은 frame 시드 offset으로 생성
🎬 케이스 3 - 스튜디오에서 포즈 잡는 인물
- 프롬프트: portrait of a model, rotating camera angle, softbox lighting
- 모델: PerfectWorld
- 프레임 수: 16
- 특이사항: 카메라 팬 효과는 motion adapter 커스터마이징으로 직접 구성
10. AnimateDiff의 미래 가능성과 내 활용 계획
AnimateDiff는 단순한 이미지 생성 기술이 아니다. 이건 일종의 시간 축 위에 이미지와 감정을 배치하는 새로운 서술 도구다. 나는 앞으로 이 기술을 다음과 같은 프로젝트에 활용할 계획이다:
- 유튜브 쇼츠 스타일의 시네마틱 클립 생성 (5초 ~ 10초 애니메이션)
- AI 캐릭터 기반 뮤직비디오 제작 (사운드 연동)
- 감정 변화 시각화 콘텐츠 (예: 분노→슬픔→안정 프레임 설계)
또한 LoRA와 AnimateDiff의 결합을 통해 인물의 감정 변화, 연기 스타일 전환 등을 연구하고 있으며, Diffusers와 AnimateDiff의 커스터마이징 API를 직접 구축해 batch inference에 최적화된 자동화 파이프라인을 설계 중이다.
결론적으로 AnimateDiff는 그저 움직이는 그림을 만드는 기술이 아니라, 창작자에게 시간적 사고를 요구하는 예술적 도구라고 생각한다. 단일 이미지가 아닌 '순간들의 연결'을 표현하고 싶을 때, AnimateDiff는 가장 설득력 있는 대답이 될 수 있다.
'AI' 카테고리의 다른 글
[AI] AI 이미지 생성 여정: 내가 직접 써본 도구와 경험들 (0) | 2025.04.20 |
---|---|
[AI] 클라우드 환경 비교: AI 이미지 생성을 위한 최고의 플랫폼은? (0) | 2025.04.20 |
[AI] WebUI 기반 AI 이미지 생성 실험 - 설치, 설정, NSFW 활용까지의 여정 (0) | 2025.04.20 |
[AI] 다양한 모델 비교 체험기 - AI 이미지 생성에서 모델을 선택하는 기준 (1) | 2025.04.20 |
[AI] 프롬프트 작성 실험 - AI 이미지 생성의 핵심을 탐구하다 (2) | 2025.04.20 |