Diffusers documentation

Stable Video Diffusion

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Stable Video Diffusion

Stable Video Diffusion была предложена в статье Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets авторами 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.

Ознакомьтесь с организацией Stability AI на Hugging Face Hub, где доступны контрольные точки base и extended frame!

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

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

Существуют два варианта этой модели: SVD и SVD-XT. Чекпоинт SVD обучен генерировать 14 кадров, а чекпоинт SVD-XT дополнительно дообучен для генерации 25 кадров.

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

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% за счёт незначительного увеличения потребления памяти, скомпилировав UNet.

- 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), но в видео может наблюдаться мерцание.
- 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:

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)

StableVideoDiffusionPipeline

класс diffusers.StableVideoDiffusionPipeline

< >

( vae: AutoencoderKLTemporalDecoderimage_encoder: CLIPVisionModelWithProjectionunet: UNetSpatioTemporalConditionModelscheduler: EulerDiscreteSchedulerfeature_extractor: CLIPImageProcessorPil )

Параметры

  • vae (AutoencoderKLTemporalDecoder) — Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.
  • image_encoder (CLIPVisionModelWithProjection) — Замороженный CLIP-кодировщик изображений (laion/CLIP-ViT-H-14-laion2B-s32B-b79K).
  • unet (UNetSpatioTemporalConditionModel) — UNetSpatioTemporalConditionModel для удаления шума из закодированных латентов изображения.
  • scheduler (EulerDiscreteScheduler) — планировщик, используемый в связке с unet для удаления шума из закодированных латентов изображения.
  • feature_extractor (CLIPImageProcessor) — CLIPImageProcessor для извлечения признаков из сгенерированных изображений.

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

Эта модель наследуется от DiffusionPipeline. Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса.

StableVideoDiffusionPipelineOutput

класс diffusers.pipelines.stable_video_diffusion.StableVideoDiffusionPipelineOutput

< >

( frames: typing.Union[list[list[PIL.Image.Image]], numpy.ndarray, torch.Tensor] )

Параметры

  • 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.

Update on GitHub