# Stable Video Diffusion

Stable Video Diffusion была предложена в статье [Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets](https://hf.co/papers/2311.15127) авторами Andreas Blattmann, Tim Dockhorn, Sumith Kulal, Daniel Mendelevitch, Maciej Kilian, Dominik Lorenz, Yam Levi, Zion English, Vikram Voleti, Adam Letts, Varun Jampani, Robin Rombach.

Аннотация из статьи:

*Мы представляем Stable Video Diffusion — латентную модель диффузии для видео, обеспечивающую генерацию видео высокого разрешения по тексту и изображению на уровне современных достижений. Недавно латентные диффузионные модели, обученные для синтеза 2D-изображений, были превращены в генеративные модели видео путем добавления временных слоев и дообучения на небольших наборах данных с высококачественным видео. Однако методы обучения, описанные в литературе, сильно различаются, и в области еще не выработан единый подход к формированию видеоданных. В данной статье мы выделяем и оцениваем три различных этапа успешного обучения видео-ЛДМ: предварительное обучение «текст-в-изображение», предварительное обучение на видео и дообучение на высококачественном видео. Кроме того, мы демонстрируем необходимость тщательно отобранного набора данных для предварительного обучения для генерации высококачественного видео и предлагаем систематический процесс формирования данных для обучения сильной базовой модели, включая стратегии подписывания и фильтрации. Затем мы исследуем влияние дообучения нашей базовой модели на высококачественных данных и обучаем модель «текст-в-видео», конкурентоспособную с закрытыми системами генерации видео. Мы также показываем, что наша базовая модель обеспечивает мощное представление движения для задач нижнего уровня, таких как генерация видео по изображению, и позволяет адаптироваться к модулям LoRA, специфичным для движения камеры. Наконец, мы демонстрируем, что наша модель предоставляет сильный многовидовой 3D-приор и может служить основой для дообучения многовидовой диффузионной модели, которая совместно генерирует несколько видов объектов в режиме прямого распространения, превосходя методы на основе изображений при значительно меньших вычислительных затратах. Мы публикуем код и веса модели по этой ссылке: https URL.*

> [!TIP]
> Ознакомьтесь с организацией [Stability AI](https://huggingface.co/stabilityai) на Hugging Face Hub, где доступны контрольные точки [base](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) и [extended frame](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt)!

Убедитесь, что у вас установлены следующие библиотеки.

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

Существуют два варианта этой модели: [SVD](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid) и [SVD-XT](https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt). Чекпоинт SVD обучен генерировать 14 кадров, а чекпоинт SVD-XT дополнительно дообучен для генерации 25 кадров.

Для этого руководства вы будете использовать контрольную точку SVD-XT.

```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)
```

  
    
    "исходное изображение ракеты"
  
  
    
    "видео, сгенерированное из исходного изображения"
  

## torch.compile

Вы можете получить ускорение на 20–25% за счёт незначительного увеличения потребления памяти, [скомпилировав](../../../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)
```

## Сокращение использования памяти

Генерация видео требует значительных объёмов памяти, поскольку по сути вы генерируете `num_frames` кадров одновременно, что аналогично генерации изображений по тексту с большим размером батча. Для снижения требований к памяти существует несколько вариантов, которые жертвуют скоростью инференса ради уменьшения потребления памяти:

- включить выгрузку модели: каждый компонент конвейера выгружается на CPU, когда в нём больше нет необходимости.
- включить послойное разбиение (chunking) для полносвязных слоёв: полносвязный слой выполняется в цикле вместо одного прохода с очень большим размером батча.
- reduce `decode_chunk_size`: VAE декодирует кадры по частям, а не все сразу. Установка `decode_chunk_size=1` декодирует по одному кадру за раз и использует минимальное количество памяти (мы рекомендуем подбирать это значение в зависимости от объёма памяти вашей GPU), но в видео может наблюдаться мерцание.

```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]
```

Использование всех этих приёмов вместе должно снизить требования к памяти до менее чем 8 ГБ VRAM.

## Микроусловие

Stable Diffusion Video также принимает микровоздействие (micro-conditioning) в дополнение к изображению-условию, что позволяет более точно управлять генерируемым видео:

- `fps`: количество кадров в секунде в сгенерированном видео.
- `motion_bucket_id`: идентификатор корзины движения, используемый для генерируемого видео. Этот параметр позволяет управлять степенью движения в видео. Увеличение значения идентификатора корзины движения приводит к увеличению динамики в генерируемом видео.
- `noise_aug_strength`: количество шума, добавляемого к изображению-условию. Чем выше значение, тем меньше сгенерированное видео напоминает исходное изображение. Увеличение этого значения также усиливает движение в видео.

Например, чтобы сгенерировать видео с большей динамикой, используйте параметры микроусловий `motion_bucket_id` и `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)
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py#L147)

**Параметры:**

vae (`AutoencoderKLTemporalDecoder`) : вариационная автокодирующая модель (VAE) для кодирования изображений в латентные представления и декодирования из них.

image_encoder ([CLIPVisionModelWithProjection](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPVisionModelWithProjection)) : замороженный CLIP-кодировщик изображений ([laion/CLIP-ViT-H-14-laion2B-s32B-b79K](https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K)).

unet (`UNetSpatioTemporalConditionModel`) : `UNetSpatioTemporalConditionModel` для удаления шума из закодированных латентов изображения.

scheduler ([EulerDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/euler#diffusers.EulerDiscreteScheduler)) : планировщик, используемый в связке с `unet` для удаления шума из закодированных латентов изображения.

feature_extractor ([CLIPImageProcessor](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPImageProcessor)) : `CLIPImageProcessor` для извлечения признаков из сгенерированных изображений.

Pipeline для генерации видео из входного изображения с использованием Stable Video Diffusion.

Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.

## 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])
```

[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_video_diffusion/pipeline_stable_video_diffusion.py#L134)

**Параметры:**

frames (`[list[list[PIL.Image.Image]]`, `np.ndarray`, `torch.Tensor`]) : список денойзированных изображений PIL длиной `batch_size` или массив numpy или тензор torch с формой `(batch_size, num_frames, height, width, num_channels)`.

Класс вывода для конвейера Stable Video Diffusion.

