# Stable Video Diffusion

Stable Video Diffusion diusulkan dalam [Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets](https://hf.co/papers/2311.15127) oleh Andreas Blattmann, Tim Dockhorn, Sumith Kulal, Daniel Mendelevitch, Maciej Kilian, Dominik Lorenz, Yam Levi, Zion English, Vikram Voleti, Adam Letts, Varun Jampani, Robin Rombach.

Abstrak dari makalah tersebut adalah:

*Kami memperkenalkan Stable Video Diffusion - model difusi video laten untuk generasi teks-ke-video dan gambar-ke-video resolusi tinggi yang mutakhir. Baru-baru ini, model difusi laten yang dilatih untuk sintesis gambar 2D telah diubah menjadi model video generatif dengan menyisipkan lapisan temporal dan melakukan penyesuaian halus (finetuning) pada dataset video kecil berkualitas tinggi. Namun, metode pelatihan dalam literatur bervariasi secara luas, dan bidang ini belum mencapai kesepakatan tentang strategi terpadu untuk kurasi data video. Dalam makalah ini, kami mengidentifikasi dan mengevaluasi tiga tahap berbeda untuk pelatihan LDM video yang sukses: pra-pelatihan teks-ke-gambar, pra-pelatihan video, dan penyesuaian halus video berkualitas tinggi. Selain itu, kami mendemonstrasikan kebutuhan akan dataset pra-pelatihan yang dikurasi dengan baik untuk menghasilkan video berkualitas tinggi dan menyajikan proses kurasi sistematis untuk melatih model dasar yang kuat, termasuk strategi penulisan keterangan (captioning) dan penyaringan (filtering). Kami kemudian mengeksplorasi dampak dari penyesuaian halus model dasar kami pada data berkualitas tinggi dan melatih model teks-ke-video yang kompetitif dengan generasi video sumber tertutup. Kami juga menunjukkan bahwa model dasar kami menyediakan representasi gerakan yang kuat untuk tugas turunan seperti generasi gambar-ke-video dan kemampuan adaptasi terhadap modul LoRA yang spesifik untuk gerakan kamera. Terakhir, kami mendemonstrasikan bahwa model kami menyediakan prior 3D multi-view yang kuat dan dapat berfungsi sebagai dasar untuk melatih model difusi multi-view yang secara bersama-sama menghasilkan beberapa tampilan objek secara feedforward, melampaui metode berbasis gambar dengan sepersekian dari anggaran komputasi mereka. Kami merilis kode dan bobot model di https URL ini.*

> [!TIP]
> Lihat organisasi [Stability AI](https://huggingface.co/stabilityai) di Hub untuk checkpoint [base](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) dan [extended frame](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt)!

Pastikan Anda telah menginstal pustaka berikut.

```py
# Uncomment to install the necessary libraries in Colab
!pip install -q -U diffusers transformers accelerate
```

Terdapat dua varian dari model ini, yaitu [SVD](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) dan [SVD-XT](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt). Checkpoint SVD dilatih untuk menghasilkan 14 frame, sedangkan checkpoint SVD-XT dipoles lebih lanjut untuk menghasilkan 25 frame.

Anda akan menggunakan checkpoint SVD-XT untuk panduan ini.

```python
import torch

from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video

pipe = StableVideoDiffusionPipeline.from_pretrained(
    "stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()

# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))

generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]

export_to_video(frames, "generated.mp4", fps=7)
```

  
    
    "source image of a rocket"
  
  
    
    "video yang dihasilkan dari gambar sumber"
  

## torch.compile

Anda dapat memperoleh peningkatan kecepatan 20-25% dengan sedikit peningkatan memori melalui [kompilasi](../../../optimization/fp16#torchcompile) UNet.

```diff
- pipe.enable_model_cpu_offload()
+ pipe.to("cuda")  # or "mps", "xpu", "cpu"
+ pipe.unet = torch.compile(pipe.unet, mode="reduce-overhead", fullgraph=True)
```

## Kurangi penggunaan memori

Generasi video sangat intensif terhadap memori karena pada dasarnya Anda menghasilkan `num_frames` sekaligus, mirip dengan generasi teks-ke-gambar dengan ukuran batch yang tinggi. Untuk mengurangi kebutuhan memori, terdapat beberapa opsi yang mengorbankan kecepatan inferensi demi kebutuhan memori yang lebih rendah:

- mengaktifkan offloading model: setiap komponen pipeline akan di-offload ke CPU begitu tidak lagi dibutuhkan.
- aktifkan chunking feed-forward: lapisan feed-forward dijalankan dalam sebuah loop alih-alih menjalankan satu feed-forward dengan ukuran batch yang sangat besar.
- reduce `decode_chunk_size`: VAE mengodekan ulang frame dalam chunk alih-alih mengodekan semuanya sekaligus. Mengatur `decode_chunk_size=1` akan mengodekan satu frame pada satu waktu dan menggunakan memori paling sedikit (kami menyarankan untuk menyesuaikan nilai ini berdasarkan memori GPU Anda) tetapi video mungkin mengalami beberapa flickering.

```diff
- pipe.enable_model_cpu_offload()
- frames = pipe(image, decode_chunk_size=8, generator=generator).frames[0]
+ pipe.enable_model_cpu_offload()
+ pipe.unet.enable_forward_chunking()
+ frames = pipe(image, decode_chunk_size=2, generator=generator, num_frames=25).frames[0]
```

Menggunakan semua trik ini secara bersamaan seharusnya dapat menurunkan kebutuhan memori menjadi kurang dari 8GB VRAM.

## Micro-conditioning

Stable Diffusion Video juga menerima micro-conditioning, selain gambar conditioning, yang memungkinkan kontrol lebih besar terhadap video yang dihasilkan:

- `fps`: jumlah frame per detik dari video yang dihasilkan.
- `motion_bucket_id`: id bucket gerak yang akan digunakan untuk video yang dihasilkan. Parameter ini dapat digunakan untuk mengontrol gerak pada video yang dihasilkan. Meningkatkan nilai id bucket gerak akan meningkatkan gerak pada video yang dihasilkan.
- `noise_aug_strength`: jumlah noise yang ditambahkan ke gambar conditioning. Semakin tinggi nilainya, semakin kecil kemiripan video dengan gambar conditioning. Meningkatkan nilai ini juga meningkatkan gerakan pada video yang dihasilkan.

Sebagai contoh, untuk menghasilkan video dengan lebih banyak gerakan, gunakan parameter mikro-kondisi `motion_bucket_id` dan `noise_aug_strength`:

```python
import torch

from diffusers import StableVideoDiffusionPipeline
from diffusers.utils import load_image, export_to_video

pipe = StableVideoDiffusionPipeline.from_pretrained(
  "stabilityai/stable-video-diffusion-img2vid-xt", dtype=torch.float16, variant="fp16"
)
pipe.enable_model_cpu_offload()

# Load the conditioning image
image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/rocket.png")
image = image.resize((1024, 576))

generator = torch.manual_seed(42)
frames = pipe(image, decode_chunk_size=8, generator=generator, motion_bucket_id=180, noise_aug_strength=0.1).frames[0]
export_to_video(frames, "generated.mp4", fps=7)
```

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/svd/output_rocket_with_conditions.gif)

## StableVideoDiffusionPipeline[[diffusers.StableVideoDiffusionPipeline]]

#### diffusers.StableVideoDiffusionPipeline[[diffusers.StableVideoDiffusionPipeline]]

```python
diffusers.StableVideoDiffusionPipeline(vae: AutoencoderKLTemporalDecoder, image_encoder: CLIPVisionModelWithProjection, unet: UNetSpatioTemporalConditionModel, scheduler: EulerDiscreteScheduler, feature_extractor: CLIPImageProcessorPil)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py#L147)

**Parameter:**

vae (`AutoencoderKLTemporalDecoder`) : Model Variational Auto-Encoder (VAE) untuk mengkodekan dan mendekodekan gambar ke dan dari representasi laten.

image_encoder ([CLIPVisionModelWithProjection](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/clip#transformers.CLIPVisionModelWithProjection)) : Pengkode gambar CLIP beku ([laion/CLIP-ViT-H-14-laion2B-s32B-b79K](https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K)).

unet (`UNetSpatioTemporalConditionModel`) : Sebuah `UNetSpatioTemporalConditionModel` untuk menghilangkan noise dari latens gambar yang telah dikodekan.

scheduler ([EulerDiscreteScheduler](/docs/diffusers/v0.43.0/id/api/schedulers/euler#diffusers.EulerDiscreteScheduler)) : Penjadwal yang digunakan bersama `unet` untuk menghilangkan noise pada latens gambar yang telah dikodekan.

feature_extractor ([CLIPImageProcessor](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/clip#transformers.CLIPImageProcessor)) : Sebuah `CLIPImageProcessor` untuk mengekstrak fitur dari gambar yang dihasilkan.

Pipeline untuk menghasilkan video dari gambar input menggunakan Stable Video Diffusion.

Model ini mewarisi dari [DiffusionPipeline](/docs/diffusers/v0.43.0/id/api/pipelines/overview#diffusers.DiffusionPipeline). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan untuk semua pipeline (mengunduh, menyimpan, menjalankan pada perangkat tertentu, dll.).

## StableVideoDiffusionPipelineOutput[[diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput]]

#### diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput[[diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput]]

```python
diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput(frames: typing.Union[list[list[PIL.Image.Image]], numpy.ndarray, torch.Tensor])
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py#L134)

**Parameter:**

frames (`[list[list[PIL.Image.Image]]`, `np.ndarray`, `torch.Tensor`]) : daftar gambar PIL yang telah didenois dengan panjang `batch_size` atau array numpy atau tensor torch dengan bentuk `(batch_size, num_frames, height, width, num_channels)`.

Kelas output untuk pipeline Stable Video Diffusion.

