Buckets:

mishig's picture
|
download
raw
188 kB
# Генерация видео из текста с помощью AnimateDiff ## Обзор [AnimateDiff: Анимация ваших персонализированных диффузионных моделей «текст в изображение» без специальной настройки](https://huggingface.co/papers/2307.04725) от Yuwei Guo, Ceyuan Yang, Anyi Rao, Yaohui Wang, Yu Qiao, Dahua Lin, Bo Dai. Аннотация к статье следующая: *С развитием моделей преобразования текста в изображение (например, Stable Diffusion) и соответствующих методов персонализации, таких как DreamBooth и LoRA, каждый может воплотить свои идеи в высококачественные изображения по доступной цене. Вслед за этим возникла значительная потребность в методах анимации изображений, чтобы объединять сгенерированные статичные изображения с динамикой движения. В данном отчёте мы предлагаем практический фреймворк, позволяющий один раз и навсегда анимировать большинство существующих персонализированных моделей преобразования текста в изображение, экономя усилия на настройке под конкретную модель. В основе предложенного фреймворка лежит вставка нового модуля моделирования движения с инициализацией с нуля в замороженную модель преобразования текста в изображение и его обучение на видеоклипах для дистилляции разумных априорных представлений о движении. После обучения достаточно просто внедрить этот модуль моделирования движения, и все персонализированные версии, полученные из одной и той же базовой T2I, сразу превращаются в модели, управляемые текстом, которые генерируют разнообразные и персонализированные анимированные изображения. Мы провели оценку на нескольких публичных репрезентативных персонализированных моделях преобразования текста в изображение на примере аниме-иллюстраций и реалистичных фотографий и показали, что предложенный нами фреймворк помогает этим моделям генерировать временнó-плавные анимационные клипы, сохраняя при этом домен и разнообразие их выходов. Код и предобученные веса будут публично доступны по [этой ссылке](https://animatediff.github.io/).* ## Доступные конвейеры | Конвейер | Задачи | Демо |---|---|:---:| | [AnimateDiffPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff.py) | *Генерация видео из текста с помощью AnimateDiff* | | [AnimateDiffControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py) | *Управляемая генерация видео из видео с помощью AnimateDiff и ControlNet* | | [AnimateDiffSparseControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py) | *Управляемая генерация видео из видео с помощью AnimateDiff и SparseCtrl* | | [AnimateDiffSDXLPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py) | *Генерация видео из видео с помощью AnimateDiff* | | [AnimateDiffVideoToVideoPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py) | *Генерация видео из видео с помощью AnimateDiff* | | [AnimateDiffVideoToVideoControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py) | *Генерация видео из видео с помощью AnimateDiff и ControlNet* | ## Доступные контрольные точки Чекпоинты Motion Adapter можно найти в репозитории [guoyww](https://huggingface.co/guoyww/). Эти чекпоинты предназначены для работы с любой моделью на основе Stable Diffusion 1.4/1.5. ## Пример использования ### AnimateDiffPipeline AnimateDiff работает с контрольной точкой MotionAdapter и контрольной точкой модели Stable Diffusion. MotionAdapter представляет собой набор Motion Modules, отвечающих за добавление согласованного движения между кадрами изображения. Эти модули применяются после блоков Resnet и Attention в UNet Stable Diffusion. В следующем примере показано, как использовать контрольную точку *MotionAdapter* с Diffusers для инференса на основе StableDiffusion-1.4/1.5. ```python import torch from diffusers import AnimateDiffPipeline, DDIMScheduler, MotionAdapter from diffusers.utils import export_to_gif # Load the motion adapter adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", dtype=torch.float16) # load SD 1.5 based finetuned model model_id = "SG161222/Realistic_Vision_V5.1_noVAE" pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16) scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", clip_sample=False, timestep_spacing="linspace", beta_schedule="linear", steps_offset=1, ) pipe.scheduler = scheduler # enable memory savings pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() output = pipe( prompt=( "masterpiece, bestquality, highlydetailed, ultradetailed, sunset, " "orange sky, warm lighting, fishing boats, ocean waves seagulls, " "rippling water, wharf, silhouette, serene atmosphere, dusk, evening glow, " "golden hour, coastal landscape, seaside scenery" ), negative_prompt="bad quality, worse quality", num_frames=16, guidance_scale=7.5, num_inference_steps=25, generator=torch.Generator("cpu").manual_seed(42), ) frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` Вот несколько примеров вывода: masterpiece, bestquality, sunset. <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-realistic-doc.gif" alt="masterpiece, bestquality, sunset" style="width: 300px;" /> > [!TIP] > AnimateDiff, как правило, лучше работает с дообученными моделями Stable Diffusion. Если вы планируете использовать планировщик, способный обрезать выборки, убедитесь, что эта функция отключена, установив `clip_sample=False` в планировщике, поскольку это также может негативно влиять на генерируемые образцы. Кроме того, контрольные точки AnimateDiff могут быть чувствительны к бета-расписанию планировщика. Мы рекомендуем установить его в значение `linear`. ### AnimateDiffControlNetPipeline AnimateDiff также можно использовать с ControlNet. ControlNet был представлен в статье [Adding Conditional Control to Text-to-Image Diffusion Models](https://huggingface.co/papers/2302.05543) авторами Lvmin Zhang, Anyi Rao и Maneesh Agrawala. С помощью модели ControlNet вы можете предоставить дополнительное управляющее изображение для настройки и управления генерацией Stable Diffusion. Например, если вы предоставите карты глубины, модель ControlNet сгенерирует видео, сохраняющее пространственную информацию из этих карт. Это более гибкий и точный способ управления процессом генерации видео. ```python import torch from diffusers import AnimateDiffControlNetPipeline, AutoencoderKL, ControlNetModel, MotionAdapter, LCMScheduler from diffusers.utils import export_to_gif, load_video # Additionally, you will need a preprocess videos before they can be used with the ControlNet # HF maintains just the right package for it: `pip install controlnet_aux` from controlnet_aux.processor import ZoeDetector # Download controlnets from https://huggingface.co/lllyasviel/ControlNet-v1-1 to use .from_single_file # Download Diffusers-format controlnets, such as https://huggingface.co/lllyasviel/sd-controlnet-depth, to use .from_pretrained() controlnet = ControlNetModel.from_single_file("control_v11f1p_sd15_depth.pth", dtype=torch.float16) # We use AnimateLCM for this example but one can use the original motion adapters as well (for example, https://huggingface.co/guoyww/animatediff-motion-adapter-v1-5-3) motion_adapter = MotionAdapter.from_pretrained("wangfuyun/AnimateLCM") vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", dtype=torch.float16) pipe: AnimateDiffControlNetPipeline = AnimateDiffControlNetPipeline.from_pretrained( "SG161222/Realistic_Vision_V5.1_noVAE", motion_adapter=motion_adapter, controlnet=controlnet, vae=vae, ).to(device="cuda", dtype=torch.float16) # or "mps", "xpu", "cpu" pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config, beta_schedule="linear") pipe.load_lora_weights("wangfuyun/AnimateLCM", weight_name="AnimateLCM_sd15_t2v_lora.safetensors", adapter_name="lcm-lora") pipe.set_adapters(["lcm-lora"], [0.8]) depth_detector = ZoeDetector.from_pretrained("lllyasviel/Annotators").to("cuda") video = load_video("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-input-1.gif") conditioning_frames = [] with pipe.progress_bar(total=len(video)) as progress_bar: for frame in video: conditioning_frames.append(depth_detector(frame)) progress_bar.update() prompt = "a panda, playing a guitar, sitting in a pink boat, in the ocean, mountains in background, realistic, high quality" negative_prompt = "bad quality, worst quality" video = pipe( prompt=prompt, negative_prompt=negative_prompt, num_frames=len(video), num_inference_steps=10, guidance_scale=2.0, conditioning_frames=conditioning_frames, generator=torch.Generator().manual_seed(42), ).frames[0] export_to_gif(video, "animatediff_controlnet.gif", fps=8) ``` Вот несколько примеров вывода: Исходное видео Видео на выходе енот играет на гитаре панда, играющая на гитаре, сидящая в розовой лодке, в океане, горы на заднем плане, реалистично, высокое качество ### AnimateDiffSparseControlNetPipeline [SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models](https://huggingface.co/papers/2311.16933) для достижения контролируемой генерации в диффузионных моделях «текст-в-видео» от Yuwei Guo, Ceyuan Yang, Anyi Rao, Maneesh Agrawala, Dahua Lin и Bo Dai. Аннотация из статьи: *Развитие технологий генерации видео по тексту (T2V), то есть создания видео по заданному текстовому запросу, значительно продвинулось в последние годы. Однако опора исключительно на текстовые запросы часто приводит к неоднозначной композиции кадров из-за пространственной неопределённости. В связи с этим исследовательское сообщество использует плотные структурные сигналы, например, последовательности глубины или контуров для каждого кадра, чтобы повысить управляемость, что, соответственно, увеличивает нагрузку на этап инференса. В данной работе мы представляем SparseCtrl, который обеспечивает гибкое структурное управление с помощью временных разреженных сигналов, требуя лишь одного или нескольких входных данных, как показано на рисунке 1. Он включает дополнительный кодировщик условий для обработки этих разреженных сигналов, при этом предварительно обученная T2V-модель остаётся неизменной. Предложенный подход совместим с различными модальностями, включая эскизы, карты глубины и RGB-изображения, что обеспечивает более практичное управление генерацией видео и способствует применению таких задач, как раскадровка, рендеринг глубины, анимация по ключевым кадрам и интерполяция. Обширные эксперименты демонстрируют обобщающую способность SparseCtrl как для оригинальных, так и для персонализированных T2V-генераторов. Код и модели будут общедоступны по [этой ссылке](https://guoyww.github.io/projects/SparseCtrl).* SparseCtrl представляет следующие контрольные точки для контролируемой генерации видео по тексту: - [SparseCtrl Scribble](https://huggingface.co/guoyww/animatediff-sparsectrl-scribble) - [SparseCtrl RGB](https://huggingface.co/guoyww/animatediff-sparsectrl-rgb) #### Использование SparseCtrl Scribble ```python import torch from diffusers import AnimateDiffSparseControlNetPipeline from diffusers.models import AutoencoderKL, MotionAdapter, SparseControlNetModel from diffusers.schedulers import DPMSolverMultistepScheduler from diffusers.utils import export_to_gif, load_image model_id = "SG161222/Realistic_Vision_V5.1_noVAE" motion_adapter_id = "guoyww/animatediff-motion-adapter-v1-5-3" controlnet_id = "guoyww/animatediff-sparsectrl-scribble" lora_adapter_id = "guoyww/animatediff-motion-lora-v1-5-3" vae_id = "stabilityai/sd-vae-ft-mse" device = "cuda" # or "mps", "xpu", "cpu" motion_adapter = MotionAdapter.from_pretrained(motion_adapter_id, dtype=torch.float16).to(device) controlnet = SparseControlNetModel.from_pretrained(controlnet_id, dtype=torch.float16).to(device) vae = AutoencoderKL.from_pretrained(vae_id, dtype=torch.float16).to(device) scheduler = DPMSolverMultistepScheduler.from_pretrained( model_id, subfolder="scheduler", beta_schedule="linear", algorithm_type="dpmsolver++", use_karras_sigmas=True, ) pipe = AnimateDiffSparseControlNetPipeline.from_pretrained( model_id, motion_adapter=motion_adapter, controlnet=controlnet, vae=vae, scheduler=scheduler, dtype=torch.float16, ).to(device) pipe.load_lora_weights(lora_adapter_id, adapter_name="motion_lora") pipe.fuse_lora(lora_scale=1.0) prompt = "an aerial view of a cyberpunk city, night time, neon lights, masterpiece, high quality" negative_prompt = "low quality, worst quality, letterboxed" image_files = [ "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-1.png", "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-2.png", "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-3.png" ] condition_frame_indices = [0, 8, 15] conditioning_frames = [load_image(img_file) for img_file in image_files] video = pipe( prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=25, conditioning_frames=conditioning_frames, controlnet_conditioning_scale=1.0, controlnet_frame_indices=condition_frame_indices, generator=torch.Generator().manual_seed(1337), ).frames[0] export_to_gif(video, "output.gif") ``` Вот несколько примеров вывода: вид с воздуха на киберпанк-город, ночь, неоновые огни, шедевр, высокое качество #### Использование SparseCtrl RGB ```python import torch from diffusers import AnimateDiffSparseControlNetPipeline from diffusers.models import AutoencoderKL, MotionAdapter, SparseControlNetModel from diffusers.schedulers import DPMSolverMultistepScheduler from diffusers.utils import export_to_gif, load_image model_id = "SG161222/Realistic_Vision_V5.1_noVAE" motion_adapter_id = "guoyww/animatediff-motion-adapter-v1-5-3" controlnet_id = "guoyww/animatediff-sparsectrl-rgb" lora_adapter_id = "guoyww/animatediff-motion-lora-v1-5-3" vae_id = "stabilityai/sd-vae-ft-mse" device = "cuda" # or "mps", "xpu", "cpu" motion_adapter = MotionAdapter.from_pretrained(motion_adapter_id, dtype=torch.float16).to(device) controlnet = SparseControlNetModel.from_pretrained(controlnet_id, dtype=torch.float16).to(device) vae = AutoencoderKL.from_pretrained(vae_id, dtype=torch.float16).to(device) scheduler = DPMSolverMultistepScheduler.from_pretrained( model_id, subfolder="scheduler", beta_schedule="linear", algorithm_type="dpmsolver++", use_karras_sigmas=True, ) pipe = AnimateDiffSparseControlNetPipeline.from_pretrained( model_id, motion_adapter=motion_adapter, controlnet=controlnet, vae=vae, scheduler=scheduler, dtype=torch.float16, ).to(device) pipe.load_lora_weights(lora_adapter_id, adapter_name="motion_lora") image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-firework.png") video = pipe( prompt="closeup face photo of man in black clothes, night city street, bokeh, fireworks in background", negative_prompt="low quality, worst quality", num_inference_steps=25, conditioning_frames=image, controlnet_frame_indices=[0], controlnet_conditioning_scale=1.0, generator=torch.Generator().manual_seed(42), ).frames[0] export_to_gif(video, "output.gif") ``` Вот несколько примеров вывода: closeup face photo of man in black clothes, night city street, bokeh, fireworks in background ### AnimateDiffSDXLPipeline AnimateDiff также можно использовать с моделями SDXL. На данный момент это экспериментальная функция, так как доступна только бета-версия контрольной точки адаптера движения. ```python import torch from diffusers.models import MotionAdapter from diffusers import AnimateDiffSDXLPipeline, DDIMScheduler from diffusers.utils import export_to_gif adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-sdxl-beta", dtype=torch.float16) model_id = "stabilityai/stable-diffusion-xl-base-1.0" scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", clip_sample=False, timestep_spacing="linspace", beta_schedule="linear", steps_offset=1, ) pipe = AnimateDiffSDXLPipeline.from_pretrained( model_id, motion_adapter=adapter, scheduler=scheduler, dtype=torch.float16, variant="fp16", ).to("cuda") # or "mps", "xpu", "cpu" # enable memory savings pipe.vae.enable_slicing() pipe.vae.enable_tiling() output = pipe( prompt="a panda surfing in the ocean, realistic, high quality", negative_prompt="low quality, worst quality", num_inference_steps=20, guidance_scale=8, width=1024, height=1024, num_frames=16, ) frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` ### AnimateDiffVideoToVideoPipeline AnimateDiff также можно использовать для генерации визуально похожих видео или для внесения изменений в стиль, персонажей, фон и другие элементы, начиная с исходного видео, что позволяет бесшовно исследовать творческие возможности. ```python import imageio import requests import torch from diffusers import AnimateDiffVideoToVideoPipeline, DDIMScheduler, MotionAdapter from diffusers.utils import export_to_gif from io import BytesIO from PIL import Image # Load the motion adapter adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", dtype=torch.float16) # load SD 1.5 based finetuned model model_id = "SG161222/Realistic_Vision_V5.1_noVAE" pipe = AnimateDiffVideoToVideoPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16) scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", clip_sample=False, timestep_spacing="linspace", beta_schedule="linear", steps_offset=1, ) pipe.scheduler = scheduler # enable memory savings pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() # helper function to load videos def load_video(file_path: str): images = [] if file_path.startswith(('http://', 'https://')): # If the file_path is a URL response = requests.get(file_path) response.raise_for_status() content = BytesIO(response.content) vid = imageio.get_reader(content) else: # Assuming it's a local file path vid = imageio.get_reader(file_path) for frame in vid: pil_image = Image.fromarray(frame) images.append(pil_image) return images video = load_video("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-input-1.gif") output = pipe( video = video, prompt="panda playing a guitar, on a boat, in the ocean, high quality", negative_prompt="bad quality, worse quality", guidance_scale=7.5, num_inference_steps=25, strength=0.5, generator=torch.Generator("cpu").manual_seed(42), ) frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` Вот несколько примеров вывода: Исходное видео Видео на выходе енот играет на гитаре <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-input-1.gif" alt="racoon playing a guitar" style="width: 300px;" /> панда играет на гитаре <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-output-1.gif" alt="panda playing a guitar" style="width: 300px;" /> крупный план Марго Робби, фейерверк на заднем плане, высокое качество <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-input-2.gif" alt="closeup of margot robbie, fireworks in the background, high quality" style="width: 300px;" /> крупный план Тони Старка, Роберт Дауни-младший, фейерверк <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-vid2vid-output-2.gif" alt="closeup of tony stark, robert downey jr, fireworks" style="width: 300px;" /> ### AnimateDiffVideoToVideoControlNetPipeline AnimateDiff можно использовать вместе с ControlNets для улучшения генерации видео из видео, обеспечивая точный контроль над результатом. ControlNet был представлен в статье [Adding Conditional Control to Text-to-Image Diffusion Models](https://huggingface.co/papers/2302.05543) авторами Lvmin Zhang, Anyi Rao и Maneesh Agrawala и позволяет использовать дополнительное управляющее изображение для условного формирования Stable Diffusion, чтобы сохранить пространственную информацию на протяжении всего видео. Этот конвейер позволяет задавать условия для генерации как на основе исходного видео, так и на основе последовательности управляющих изображений. ```python import torch from PIL import Image from tqdm.auto import tqdm from controlnet_aux.processor import OpenposeDetector from diffusers import AnimateDiffVideoToVideoControlNetPipeline from diffusers.utils import export_to_gif, load_video from diffusers import AutoencoderKL, ControlNetModel, MotionAdapter, LCMScheduler # Load the ControlNet controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose", dtype=torch.float16) # Load the motion adapter motion_adapter = MotionAdapter.from_pretrained("wangfuyun/AnimateLCM") # Load SD 1.5 based finetuned model vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", dtype=torch.float16) pipe = AnimateDiffVideoToVideoControlNetPipeline.from_pretrained( "SG161222/Realistic_Vision_V5.1_noVAE", motion_adapter=motion_adapter, controlnet=controlnet, vae=vae, ).to(device="cuda", dtype=torch.float16) # or "mps", "xpu", "cpu" # Enable LCM to speed up inference pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config, beta_schedule="linear") pipe.load_lora_weights("wangfuyun/AnimateLCM", weight_name="AnimateLCM_sd15_t2v_lora.safetensors", adapter_name="lcm-lora") pipe.set_adapters(["lcm-lora"], [0.8]) video = load_video("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/dance.gif") video = [frame.convert("RGB") for frame in video] prompt = "astronaut in space, dancing" negative_prompt = "bad quality, worst quality, jpeg artifacts, ugly" # Create controlnet preprocessor open_pose = OpenposeDetector.from_pretrained("lllyasviel/Annotators").to("cuda") # Preprocess controlnet images conditioning_frames = [] for frame in tqdm(video): conditioning_frames.append(open_pose(frame)) strength = 0.8 with torch.inference_mode(): video = pipe( video=video, prompt=prompt, negative_prompt=negative_prompt, num_inference_steps=10, guidance_scale=2.0, controlnet_conditioning_scale=0.75, conditioning_frames=conditioning_frames, strength=strength, generator=torch.Generator().manual_seed(42), ).frames[0] video = [frame.resize(conditioning_frames[0].size) for frame in video] export_to_gif(video, f"animatediff_vid2vid_controlnet.gif", fps=8) ``` Вот несколько примеров вывода: Исходное видео Видео на выходе anime girl, dancing астронавт в космосе, танцует **Свет и композиция были перенесены из исходного видео.** ## Использование Motion LoRAs Motion LoRAs — это набор LoRAs, работающих с чекпоинтом `guoyww/animatediff-motion-adapter-v1-5-2`. Эти LoRAs отвечают за добавление конкретных типов движения в анимации. ```python import torch from diffusers import AnimateDiffPipeline, DDIMScheduler, MotionAdapter from diffusers.utils import export_to_gif # Load the motion adapter adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", dtype=torch.float16) # load SD 1.5 based finetuned model model_id = "SG161222/Realistic_Vision_V5.1_noVAE" pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16) pipe.load_lora_weights( "guoyww/animatediff-motion-lora-zoom-out", adapter_name="zoom-out" ) scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", clip_sample=False, beta_schedule="linear", timestep_spacing="linspace", steps_offset=1, ) pipe.scheduler = scheduler # enable memory savings pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() output = pipe( prompt=( "masterpiece, bestquality, highlydetailed, ultradetailed, sunset, " "orange sky, warm lighting, fishing boats, ocean waves seagulls, " "rippling water, wharf, silhouette, serene atmosphere, dusk, evening glow, " "golden hour, coastal landscape, seaside scenery" ), negative_prompt="bad quality, worse quality", num_frames=16, guidance_scale=7.5, num_inference_steps=25, generator=torch.Generator("cpu").manual_seed(42), ) frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` masterpiece, bestquality, sunset. <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-zoom-out-lora.gif" alt="masterpiece, bestquality, sunset" style="width: 300px;" /> ## Использование Motion LoRAs с PEFT Вы также можете использовать бэкенд [PEFT](https://github.com/huggingface/peft), чтобы объединять Motion LoRA и создавать более сложные анимации. Сначала установите PEFT с ```shell pip install peft ``` Затем вы можете использовать следующий код для объединения Motion LoRAs. ```python import torch from diffusers import AnimateDiffPipeline, DDIMScheduler, MotionAdapter from diffusers.utils import export_to_gif # Load the motion adapter adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", dtype=torch.float16) # load SD 1.5 based finetuned model model_id = "SG161222/Realistic_Vision_V5.1_noVAE" pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16) pipe.load_lora_weights( "diffusers/animatediff-motion-lora-zoom-out", adapter_name="zoom-out", ) pipe.load_lora_weights( "diffusers/animatediff-motion-lora-pan-left", adapter_name="pan-left", ) pipe.set_adapters(["zoom-out", "pan-left"], adapter_weights=[1.0, 1.0]) scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", clip_sample=False, timestep_spacing="linspace", beta_schedule="linear", steps_offset=1, ) pipe.scheduler = scheduler # enable memory savings pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() output = pipe( prompt=( "masterpiece, bestquality, highlydetailed, ultradetailed, sunset, " "orange sky, warm lighting, fishing boats, ocean waves seagulls, " "rippling water, wharf, silhouette, serene atmosphere, dusk, evening glow, " "golden hour, coastal landscape, seaside scenery" ), negative_prompt="bad quality, worse quality", num_frames=16, guidance_scale=7.5, num_inference_steps=25, generator=torch.Generator("cpu").manual_seed(42), ) frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` masterpiece, bestquality, sunset. <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-zoom-out-pan-left-lora.gif" alt="masterpiece, bestquality, sunset" style="width: 300px;" /> ## Использование FreeInit [FreeInit: Bridging Initialization Gap in Video Diffusion Models](https://huggingface.co/papers/2312.07537) — Tianxing Wu, Chenyang Si, Yuming Jiang, Ziqi Huang, Ziwei Liu. FreeInit — это эффективный метод, который улучшает временную согласованность и общее качество видео, генерируемого с помощью video-diffusion-models, без дополнительного обучения. Его можно бесшовно применять к AnimateDiff, ModelScope, VideoCrafter и различным другим моделям генерации видео на этапе инференса; метод работает за счет итеративного уточнения шума инициализации латентов. Более подробная информация представлена в статье. Следующий пример демонстрирует использование FreeInit. ```python import torch from diffusers import MotionAdapter, AnimateDiffPipeline, DDIMScheduler from diffusers.utils import export_to_gif adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2") model_id = "SG161222/Realistic_Vision_V5.1_noVAE" pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu" pipe.scheduler = DDIMScheduler.from_pretrained( model_id, subfolder="scheduler", beta_schedule="linear", clip_sample=False, timestep_spacing="linspace", steps_offset=1 ) # enable memory savings pipe.vae.enable_slicing() pipe.vae.enable_tiling() # enable FreeInit # Refer to the enable_free_init documentation for a full list of configurable parameters pipe.enable_free_init(method="butterworth", use_fast_sampling=True) # run inference output = pipe( prompt="a panda playing a guitar, on a boat, in the ocean, high quality", negative_prompt="bad quality, worse quality", num_frames=16, guidance_scale=7.5, num_inference_steps=20, generator=torch.Generator("cpu").manual_seed(666), ) # disable FreeInit pipe.disable_free_init() frames = output.frames[0] export_to_gif(frames, "animation.gif") ``` > [!WARNING] > FreeInit не является по-настоящему бесплатным — повышение качества достигается за счёт дополнительных вычислений. В зависимости от параметра `num_iters`, задаваемого при включении метода, требуется несколько дополнительных итераций сэмплирования. Установка параметра `use_fast_sampling` в значение `True` может улучшить общую производительность (хотя качество будет ниже, чем при `use_fast_sampling=False`, но результаты всё равно будут лучше, чем у стандартных моделей генерации видео). > [!TIP] > Обязательно ознакомьтесь с [руководством по планировщикам](../../using-diffusers/schedulers), чтобы узнать, как исследовать баланс между скоростью и качеством планировщика, а также с разделом [повторное использование компонентов в разных конвейерах](../../using-diffusers/loading#reusing-models-in-multiple-pipelines), чтобы узнать, как эффективно загружать одни и те же компоненты в несколько конвейеров. Без включённого FreeInit С включённым FreeInit панда играет на гитаре <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-no-freeinit.gif" alt="panda playing a guitar" style="width: 300px;" /> панда играет на гитаре <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-freeinit.gif" alt="panda playing a guitar" style="width: 300px;" /> ## Использование AnimateLCM [AnimateLCM](https://animatelcm.github.io/) — это контрольная точка модуля движения и LCM LoRA, созданные с использованием стратегии обучения на основе согласованности, которая разделяет дистилляцию априорных знаний для генерации изображений и априорных знаний для генерации движения. ```python import torch from diffusers import AnimateDiffPipeline, LCMScheduler, MotionAdapter from diffusers.utils import export_to_gif adapter = MotionAdapter.from_pretrained("wangfuyun/AnimateLCM") pipe = AnimateDiffPipeline.from_pretrained("emilianJR/epiCRealism", motion_adapter=adapter) pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config, beta_schedule="linear") pipe.load_lora_weights("wangfuyun/AnimateLCM", weight_name="sd15_lora_beta.safetensors", adapter_name="lcm-lora") pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() output = pipe( prompt="A space rocket with trails of smoke behind it launching into space from the desert, 4k, high resolution", negative_prompt="bad quality, worse quality, low resolution", num_frames=16, guidance_scale=1.5, num_inference_steps=6, generator=torch.Generator("cpu").manual_seed(0), ) frames = output.frames[0] export_to_gif(frames, "animatelcm.gif") ``` Космическая ракета, 4K. <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatelcm-output.gif" alt="A space rocket, 4K" style="width: 300px;" /> AnimateLCM также совместим с существующими [Motion LoRAs](https://huggingface.co/collections/dn6/animatediff-motion-loras-654cb8ad732b9e3cf4d3c17e). ```python import torch from diffusers import AnimateDiffPipeline, LCMScheduler, MotionAdapter from diffusers.utils import export_to_gif adapter = MotionAdapter.from_pretrained("wangfuyun/AnimateLCM") pipe = AnimateDiffPipeline.from_pretrained("emilianJR/epiCRealism", motion_adapter=adapter) pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config, beta_schedule="linear") pipe.load_lora_weights("wangfuyun/AnimateLCM", weight_name="sd15_lora_beta.safetensors", adapter_name="lcm-lora") pipe.load_lora_weights("guoyww/animatediff-motion-lora-tilt-up", adapter_name="tilt-up") pipe.set_adapters(["lcm-lora", "tilt-up"], [1.0, 0.8]) pipe.vae.enable_slicing() pipe.enable_model_cpu_offload() output = pipe( prompt="A space rocket with trails of smoke behind it launching into space from the desert, 4k, high resolution", negative_prompt="bad quality, worse quality, low resolution", num_frames=16, guidance_scale=1.5, num_inference_steps=6, generator=torch.Generator("cpu").manual_seed(0), ) frames = output.frames[0] export_to_gif(frames, "animatelcm-motion-lora.gif") ``` Космическая ракета, 4K. <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatelcm-motion-lora.gif" alt="A space rocket, 4K" style="width: 300px;" /> ## Использование FreeNoise [FreeNoise: Tuning-Free Longer Video Diffusion via Noise Rescheduling](https://huggingface.co/papers/2310.15169) от Haonan Qiu, Menghan Xia, Yong Zhang, Yingqing He, Xintao Wang, Ying Shan, Ziwei Liu. FreeNoise — это механизм выборки, который позволяет генерировать более длинные видео с помощью моделей генерации коротких видео за счёт перепланирования шума, временного внимания по скользящим окнам и взвешенного усреднения латентных кадров. Его также можно использовать с несколькими промптами для получения интерполированных видео. Подробнее в статье. Среди поддерживаемых в настоящее время пайплайнов AnimateDiff, которые можно использовать с FreeNoise, есть: - [AnimateDiffPipeline](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.AnimateDiffPipeline) - [AnimateDiffControlNetPipeline](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.AnimateDiffControlNetPipeline) - [AnimateDiffVideoToVideoPipeline](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.AnimateDiffVideoToVideoPipeline) - [AnimateDiffVideoToVideoControlNetPipeline](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.AnimateDiffVideoToVideoControlNetPipeline) Для использования FreeNoise необходимо добавить одну строку в код инференса после загрузки пайплайнов. ```diff + pipe.enable_free_noise() ``` После этого можно использовать как один промпт, так и несколько промптов, передаваемых в виде словаря пар «целое число — строка». Целочисленные ключи словаря соответствуют индексу кадра, на котором влияние данного промпта будет максимальным. Каждый индекс кадра должен соответствовать одному строковому промпту. Промпты для промежуточных индексов кадров, которые не переданы в словаре, создаются путём интерполяции между переданными промптами кадров. По умолчанию используется простая линейная интерполяция. Однако вы можете настроить это поведение с помощью обратного вызова для параметра `prompt_interpolation_callback` при включении FreeNoise. Полный пример: ```python import torch from diffusers import AutoencoderKL, AnimateDiffPipeline, LCMScheduler, MotionAdapter from diffusers.utils import export_to_video, load_image # Load pipeline dtype = torch.float16 motion_adapter = MotionAdapter.from_pretrained("wangfuyun/AnimateLCM", dtype=dtype) vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse", dtype=dtype) pipe = AnimateDiffPipeline.from_pretrained("emilianJR/epiCRealism", motion_adapter=motion_adapter, vae=vae, dtype=dtype) pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config, beta_schedule="linear") pipe.load_lora_weights( "wangfuyun/AnimateLCM", weight_name="AnimateLCM_sd15_t2v_lora.safetensors", adapter_name="lcm_lora" ) pipe.set_adapters(["lcm_lora"], [0.8]) # Enable FreeNoise for long prompt generation pipe.enable_free_noise(context_length=16, context_stride=4) pipe.to("cuda") # or "mps", "xpu", "cpu" # Can be a single prompt, or a dictionary with frame timesteps prompt = { 0: "A caterpillar on a leaf, high quality, photorealistic", 40: "A caterpillar transforming into a cocoon, on a leaf, near flowers, photorealistic", 80: "A cocoon on a leaf, flowers in the background, photorealistic", 120: "A cocoon maturing and a butterfly being born, flowers and leaves visible in the background, photorealistic", 160: "A beautiful butterfly, vibrant colors, sitting on a leaf, flowers in the background, photorealistic", 200: "A beautiful butterfly, flying away in a forest, photorealistic", 240: "A cyberpunk butterfly, neon lights, glowing", } negative_prompt = "bad quality, worst quality, jpeg artifacts" # Run inference output = pipe( prompt=prompt, negative_prompt=negative_prompt, num_frames=256, guidance_scale=2.5, num_inference_steps=10, generator=torch.Generator("cpu").manual_seed(0), ) # Save video frames = output.frames[0] export_to_video(frames, "output.mp4", fps=16) ``` ### Экономия памяти FreeNoise Поскольку FreeNoise обрабатывает несколько кадров одновременно, в моделировании есть участки, где требуемый объём памяти превышает доступный на обычных потребительских GPU. Основными узкими местами по памяти, которые мы выявили, являются блоки пространственного и временного внимания, блоки апсемплинга и даунсемплинга, блоки resnet и слои feed-forward. Поскольку большинство этих блоков эффективно работают только по размерности канала/эмбеддинга, можно выполнять чанкованный инференс по размерностям батча. Размерность батча в AnimateDiff имеет либо пространственную (`[B x F, H x W, C]`), либо временную (`B x H x W, F, C`) природу (обратите внимание, что это может показаться контринтуитивным, но размерности батча здесь указаны верно, поскольку пространственные блоки обрабатывают данные по размерности `B x F`, а временные — по размерности `B x H x W`). Мы вводим `SplitInferenceModule`, который упрощает разбиение на чанки по любому измерению и выполнение инференса. Это значительно экономит память, но требует больше времени на инференс. ```diff # Load pipeline and adapters # ... + pipe.enable_free_noise_split_inference() + pipe.unet.enable_forward_chunking(16) ``` Вызов метода `pipe.enable_free_noise_split_inference` принимает два параметра: `spatial_split_size` (по умолчанию `256`) и `temporal_split_size` (по умолчанию `16`). Их значения можно настроить в зависимости от доступного объёма VRAM. Меньший размер разбиения приводит к меньшему потреблению памяти, но замедляет инференс, тогда как больший размер разбиения ускоряет инференс за счёт увеличения потребления памяти. ## Использование `from_single_file` с MotionAdapter `diffusers>=0.30.0` поддерживает загрузку контрольных точек AnimateDiff в `MotionAdapter` в их исходном формате с помощью `from_single_file` ```python from diffusers import MotionAdapter ckpt_path = "https://huggingface.co/Lightricks/LongAnimateDiff/blob/main/lt_long_mm_32_frames.ckpt" adapter = MotionAdapter.from_single_file(ckpt_path, dtype=torch.float16) pipe = AnimateDiffPipeline.from_pretrained("emilianJR/epiCRealism", motion_adapter=adapter) ``` ## AnimateDiffPipeline[[diffusers.AnimateDiffPipeline]] #### diffusers.AnimateDiffPipeline[[diffusers.AnimateDiffPipeline]] ```python diffusers.AnimateDiffPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, tokenizer: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler | diffusers.schedulers.scheduling_euler_discrete.EulerDiscreteScheduler | diffusers.schedulers.scheduling_euler_ancestral_discrete.EulerAncestralDiscreteScheduler | diffusers.schedulers.scheduling_dpmsolver_multistep.DPMSolverMultistepScheduler, feature_extractor: CLIPImageProcessorPil = None, image_encoder: CLIPVisionModelWithProjection = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff.py#L78) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : замороженный текстовый энкодер ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). tokenizer (`CLIPTokenizer`) : [CLIPTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPTokenizer) для токенизации текста. unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : [UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel), используемый для создания UNetMotionModel, который выполняет удаление шума из закодированных латентов видео. motion_adapter (`MotionAdapter`) : `MotionAdapter`, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений видео. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). Пайплайн для генерации видео по тексту. Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса. Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffPipeline.__call__]] ```python __call__(prompt: str | list[str] | None = None, num_frames: int | None = 16, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, guidance_scale: float = 7.5, negative_prompt: str | list[str] | None = None, num_videos_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: list[torch.Tensor] | None = None, output_type: str | None = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], decode_chunk_size: int = 16, **kwargs) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff.py#L571) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds`. height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого видео в пикселях. width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого видео в пикселях. num_frames (`int`, *optional*, по умолчанию 16) : Количество генерируемых кадров видео. По умолчанию 16 кадров, что при 8 кадрах в секунду составляет 2 секунды видео. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. guidance_scale (`float`, *optional*, по умолчанию 7.5) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить из генерируемого изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`). num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками. generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *optional*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не указано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`. Латенты должны иметь форму `(batch_size, num_channel, num_frames, height, width)`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, текстовые эмбеддинги генерируются из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, `negative_prompt_embeds` генерируются из входного аргумента `negative_prompt`. ip_adapter_image : (`PipelineImageInput`, *необязательный*): Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Должен представлять собой список, длина которого равна количеству IP-адаптеров. Каждый элемент должен быть тензором формы `(batch_size, num_images, emb_dim)`. Если `do_classifier_free_guidance` установлен в `True`, должен содержать отрицательный эмбеддинг изображения. Если не указан, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите один из вариантов: `torch.Tensor`, `PIL.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `~pipelines.text_to_video_synthesis.TextToVideoSDPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. decode_chunk_size (`int`, по умолчанию `16`) : количество кадров, которые декодируются за один вызов метода `decode_latents`. **Возвращает:** [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция вызова конвейера для генерации. Примеры: ```py >>> import torch >>> from diffusers import MotionAdapter, AnimateDiffPipeline, DDIMScheduler >>> from diffusers.utils import export_to_gif >>> adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2") >>> pipe = AnimateDiffPipeline.from_pretrained("frankjoshua/toonyou_beta6", motion_adapter=adapter) >>> pipe.scheduler = DDIMScheduler(beta_schedule="linear", steps_offset=1, clip_sample=False) >>> output = pipe(prompt="A corgi walking in the park") >>> frames = output.frames[0] >>> export_to_gif(frames, "animation.gif") ``` #### encode_prompt[[diffusers.AnimateDiffPipeline.encode_prompt]] ```python encode_prompt(prompt, device, num_images_per_prompt, do_classifier_free_guidance, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff.py#L154) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования device : (`torch.device`): устройство torch num_images_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *необязательный*) : Масштаб LoRA, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. ## AnimateDiffControlNetPipeline[[diffusers.AnimateDiffControlNetPipeline]] #### diffusers.AnimateDiffControlNetPipeline[[diffusers.AnimateDiffControlNetPipeline]] ```python diffusers.AnimateDiffControlNetPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, tokenizer: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, controlnet: diffusers.models.controlnets.controlnet.ControlNetModel | list[diffusers.models.controlnets.controlnet.ControlNetModel] | tuple[diffusers.models.controlnets.controlnet.ControlNetModel] | diffusers.models.controlnets.multicontrolnet.MultiControlNetModel, scheduler: KarrasDiffusionSchedulers, feature_extractor: transformers.models.clip.image_processing_pil_clip.CLIPImageProcessorPil | None = None, image_encoder: transformers.models.clip.modeling_clip.CLIPVisionModelWithProjection | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py#L120) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : замороженный текстовый энкодер ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). tokenizer (`CLIPTokenizer`) : [CLIPTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPTokenizer) для токенизации текста. unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : [UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel), используемый для создания UNetMotionModel, который выполняет удаление шума из закодированных латентов видео. motion_adapter (`MotionAdapter`) : `MotionAdapter`, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений видео. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). Пайплайн для генерации видео из текста с управлением через ControlNet. Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса. Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffControlNetPipeline.__call__]] ```python __call__(prompt: str | list[str] = None, num_frames: int | None = 16, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, guidance_scale: float = 7.5, negative_prompt: str | list[str] | None = None, num_videos_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, conditioning_frames: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, output_type: str | None = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, controlnet_conditioning_scale: float | list[float] = 1.0, guess_mode: bool = False, control_guidance_start: float | list[float] = 0.0, control_guidance_end: float | list[float] = 1.0, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], decode_chunk_size: int = 16) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py#L721) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds`. height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого видео в пикселях. width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого видео в пикселях. num_frames (`int`, *optional*, по умолчанию 16) : Количество генерируемых кадров видео. По умолчанию 16 кадров, что при 8 кадрах в секунду составляет 2 секунды видео. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. guidance_scale (`float`, *optional*, по умолчанию 7.5) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить из генерируемого изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`). num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками. generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *optional*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не указано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`. Латенты должны иметь форму `(batch_size, num_channel, num_frames, height, width)`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, текстовые эмбеддинги генерируются из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, `negative_prompt_embeds` генерируются из входного аргумента `negative_prompt`. ip_adapter_image (`PipelineImageInput`, *необязательный*) : Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Должен представлять собой список, длина которого равна количеству IP-адаптеров. Каждый элемент должен быть тензором формы `(batch_size, num_images, emb_dim)`. Если `do_classifier_free_guidance` установлен в `True`, должен содержать отрицательный эмбеддинг изображения. Если не указан, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. conditioning_frames (`list[PipelineImageInput]`, *optional*) : Условие входа ControlNet для предоставления руководящих сигналов `unet` при генерации. Если указано несколько ControlNet, изображения должны передаваться в виде списка, чтобы каждый элемент списка мог быть корректно сгруппирован в пакет для входа в один ControlNet. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите один из вариантов: `torch.Tensor`, `PIL.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `~pipelines.text_to_video_synthesis.TextToVideoSDPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). controlnet_conditioning_scale (`float` или `list[float]`, *необязательный*, по умолчанию 1.0) : Выходные данные ControlNet умножаются на `controlnet_conditioning_scale` перед добавлением к остаточному соединению в исходном `unet`. Если в `init` указано несколько ControlNet, соответствующий масштаб можно задать в виде списка. guess_mode (`bool`, *необязательный*, по умолчанию `False`) : Кодер ControlNet пытается распознать содержимое входного изображения, даже если вы удалите все промпты. Рекомендуется значение `guidance_scale` в диапазоне от 3.0 до 5.0. control_guidance_start (`float` или `list[float]`, *необязательный*, по умолчанию 0.0) : Доля от общего числа шагов, на которой ControlNet начинает применяться. control_guidance_end (`float` или `list[float]`, *необязательный*, по умолчанию 1.0) : Доля от общего числа шагов, на которой ControlNet прекращает применяться. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. decode_chunk_size (`int`, по умолчанию `16`) : количество кадров, которые декодируются за один вызов метода `decode_latents`. **Возвращает:** [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция вызова конвейера для генерации. Примеры: #### encode_prompt[[diffusers.AnimateDiffControlNetPipeline.encode_prompt]] ```python encode_prompt(prompt, device, num_images_per_prompt, do_classifier_free_guidance, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py#L199) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования device : (`torch.device`): устройство torch num_images_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *необязательный*) : Масштаб LoRA, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. ## AnimateDiffSparseControlNetPipeline[[diffusers.AnimateDiffSparseControlNetPipeline]] #### diffusers.AnimateDiffSparseControlNetPipeline[[diffusers.AnimateDiffSparseControlNetPipeline]] ```python diffusers.AnimateDiffSparseControlNetPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, tokenizer: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, controlnet: SparseControlNetModel, scheduler: KarrasDiffusionSchedulers, feature_extractor: CLIPImageProcessorPil = None, image_encoder: CLIPVisionModelWithProjection = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py#L132) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : замороженный текстовый энкодер ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). tokenizer (`CLIPTokenizer`) : [CLIPTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPTokenizer) для токенизации текста. unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : [UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel), используемый для создания UNetMotionModel, который выполняет удаление шума из закодированных латентов видео. motion_adapter (`MotionAdapter`) : `MotionAdapter`, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений видео. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). Pipeline for controlled text-to-video generation using the method described in [SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models](https://huggingface.co/papers/2311.16933). Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса. Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffSparseControlNetPipeline.__call__]] ```python __call__(prompt: str | list[str] | None = None, height: int | None = None, width: int | None = None, num_frames: int = 16, num_inference_steps: int = 50, guidance_scale: float = 7.5, negative_prompt: str | list[str] | None = None, num_videos_per_prompt: int = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: list[torch.Tensor] | None = None, conditioning_frames: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, output_type: str = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, controlnet_conditioning_scale: float | list[float] = 1.0, controlnet_frame_indices: list[int] = [0], guess_mode: bool = False, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents']) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py#L712) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds`. height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого видео в пикселях. width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого видео в пикселях. num_frames (`int`, *optional*, по умолчанию 16) : Количество генерируемых кадров видео. По умолчанию 16 кадров, что при 8 кадрах в секунду составляет 2 секунды видео. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. guidance_scale (`float`, *optional*, по умолчанию 7.5) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить из генерируемого изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`). num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками. generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *optional*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не указано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`. Латенты должны иметь форму `(batch_size, num_channel, num_frames, height, width)`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, текстовые эмбеддинги генерируются из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, `negative_prompt_embeds` генерируются из входного аргумента `negative_prompt`. ip_adapter_image : (`PipelineImageInput`, *необязательный*): Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Должен представлять собой список, длина которого равна количеству IP-адаптеров. Каждый элемент должен быть тензором формы `(batch_size, num_images, emb_dim)`. Если `do_classifier_free_guidance` установлен в `True`, должен содержать отрицательный эмбеддинг изображения. Если не указан, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. conditioning_frames (`list[PipelineImageInput]`, *необязательный*) : Ввод SparseControlNet для предоставления руководящих указаний `unet` при генерации. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите один из вариантов: `torch.Tensor`, `PIL.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `~pipelines.text_to_video_synthesis.TextToVideoSDPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). controlnet_conditioning_scale (`float` или `list[float]`, *необязательный*, по умолчанию 1.0) : Выходные данные ControlNet умножаются на `controlnet_conditioning_scale` перед добавлением к остаточному соединению в исходном `unet`. Если в `init` указано несколько ControlNet, соответствующий масштаб можно задать в виде списка. controlnet_frame_indices (`list[int]`) : Индексы, в которых необходимо применить кадры условий для генерации. Можно указать несколько кадров, чтобы направить модель на генерацию выходов со схожей структурой, где `unet` может «заполнить пропуски» для интерполяционных видео, либо один кадр для общей ожидаемой структуры. Длина должна совпадать с длиной `conditioning_frames`. guess_mode (`bool`, *необязательный*, по умолчанию `False`) : Кодер ControlNet пытается распознать содержимое входного изображения, даже если вы удалите все промпты. Рекомендуется значение `guidance_scale` в диапазоне от 3.0 до 5.0. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. **Возвращает:** [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция вызова конвейера для генерации. Примеры: ```python >>> import torch >>> from diffusers import AnimateDiffSparseControlNetPipeline >>> from diffusers.models import AutoencoderKL, MotionAdapter, SparseControlNetModel >>> from diffusers.schedulers import DPMSolverMultistepScheduler >>> from diffusers.utils import export_to_gif, load_image >>> model_id = "SG161222/Realistic_Vision_V5.1_noVAE" >>> motion_adapter_id = "guoyww/animatediff-motion-adapter-v1-5-3" >>> controlnet_id = "guoyww/animatediff-sparsectrl-scribble" >>> lora_adapter_id = "guoyww/animatediff-motion-lora-v1-5-3" >>> vae_id = "stabilityai/sd-vae-ft-mse" >>> device = "cuda" >>> motion_adapter = MotionAdapter.from_pretrained(motion_adapter_id, torch_dtype=torch.float16).to(device) >>> controlnet = SparseControlNetModel.from_pretrained(controlnet_id, torch_dtype=torch.float16).to(device) >>> vae = AutoencoderKL.from_pretrained(vae_id, torch_dtype=torch.float16).to(device) >>> scheduler = DPMSolverMultistepScheduler.from_pretrained( ... model_id, ... subfolder="scheduler", ... beta_schedule="linear", ... algorithm_type="dpmsolver++", ... use_karras_sigmas=True, ... ) >>> pipe = AnimateDiffSparseControlNetPipeline.from_pretrained( ... model_id, ... motion_adapter=motion_adapter, ... controlnet=controlnet, ... vae=vae, ... scheduler=scheduler, ... torch_dtype=torch.float16, ... ).to(device) >>> pipe.load_lora_weights(lora_adapter_id, adapter_name="motion_lora") >>> pipe.fuse_lora(lora_scale=1.0) >>> prompt = "an aerial view of a cyberpunk city, night time, neon lights, masterpiece, high quality" >>> negative_prompt = "low quality, worst quality, letterboxed" >>> image_files = [ ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-1.png", ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-2.png", ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-scribble-3.png", ... ] >>> condition_frame_indices = [0, 8, 15] >>> conditioning_frames = [load_image(img_file) for img_file in image_files] >>> video = pipe( ... prompt=prompt, ... negative_prompt=negative_prompt, ... num_inference_steps=25, ... conditioning_frames=conditioning_frames, ... controlnet_conditioning_scale=1.0, ... controlnet_frame_indices=condition_frame_indices, ... generator=torch.Generator().manual_seed(1337), ... ).frames[0] >>> export_to_gif(video, "output.gif") ``` #### encode_prompt[[diffusers.AnimateDiffSparseControlNetPipeline.encode_prompt]] ```python encode_prompt(prompt, device, num_images_per_prompt, do_classifier_free_guidance, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py#L208) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования device : (`torch.device`): устройство torch num_images_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *необязательный*) : Масштаб LoRA, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. ## AnimateDiffSDXLPipeline[[diffusers.AnimateDiffSDXLPipeline]] #### diffusers.AnimateDiffSDXLPipeline[[diffusers.AnimateDiffSDXLPipeline]] ```python diffusers.AnimateDiffSDXLPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, text_encoder_2: CLIPTextModelWithProjection, tokenizer: CLIPTokenizer, tokenizer_2: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler | diffusers.schedulers.scheduling_euler_discrete.EulerDiscreteScheduler | diffusers.schedulers.scheduling_euler_ancestral_discrete.EulerAncestralDiscreteScheduler | diffusers.schedulers.scheduling_dpmsolver_multistep.DPMSolverMultistepScheduler, image_encoder: CLIPVisionModelWithProjection = None, feature_extractor: CLIPImageProcessorPil = None, force_zeros_for_empty_prompt: bool = True) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py#L210) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : Замороженный текстовый энкодер. Stable Diffusion XL использует текстовую часть [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), а именно вариант [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14). text_encoder_2 (` CLIPTextModelWithProjection`) : Второй замороженный текстовый энкодер. Stable Diffusion XL использует текстовую и пул-части [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModelWithProjection), а именно вариант [laion/CLIP-ViT-bigG-14-laion2B-39B-b160k](https://huggingface.co/laion/CLIP-ViT-bigG-14-laion2B-39B-b160k). tokenizer (`CLIPTokenizer`) : Токенизатор класса [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). tokenizer_2 (`CLIPTokenizer`) : Второй токенизатор класса [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : Условная архитектура U-Net для удаления шума из закодированных латентов изображения. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). force_zeros_for_empty_prompt (`bool`, *необязательный*, по умолчанию `"True"`) : Указывает, следует ли принудительно устанавливать эмбеддинги отрицательного промпта в 0. См. также конфигурацию `stabilityai/stable-diffusion-xl-base-1-0`. Pipeline для генерации видео из текста с использованием Stable Diffusion XL. Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). См. документацию родительского класса для общих методов, которые библиотека реализует для всех пайплайнов (например, загрузка или сохранение, запуск на конкретном устройстве и т. д.) Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [from_single_file()](/docs/diffusers/main/ru/api/loaders/single_file#diffusers.loaders.FromSingleFileMixin.from_single_file) для загрузки файлов `.ckpt` - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionXLLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionXLLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffSDXLPipeline.__call__]] ```python __call__(prompt: str | list[str] = None, prompt_2: str | list[str] | None = None, num_frames: int = 16, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, timesteps: list[int] = None, sigmas: list[float] = None, denoising_end: float | None = None, guidance_scale: float = 5.0, negative_prompt: str | list[str] | None = None, negative_prompt_2: str | list[str] | None = None, num_videos_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, pooled_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: list[torch.Tensor] | None = None, output_type: str | None = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, guidance_rescale: float = 0.0, original_size: tuple[int, int] | None = None, crops_coords_top_left: tuple[int, int] = (0, 0), target_size: tuple[int, int] | None = None, negative_original_size: tuple[int, int] | None = None, negative_crops_coords_top_left: tuple[int, int] = (0, 0), negative_target_size: tuple[int, int] | None = None, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents']) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py#L869) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией видео. Если не задан, необходимо передать `prompt_embeds` вместо него. prompt_2 (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые будут отправлены в `tokenizer_2` и `text_encoder_2`. Если не задано, в обоих текстовых кодировщиках используется `prompt` num_frames : Количество генерируемых кадров видео. По умолчанию — 16 кадров, что при 8 кадрах в секунду составляет 2 секунды видео. height (`int`, *optional*, по умолчанию self.unet.config.sample_size * self.vae_scale_factor) : Высота генерируемого видео в пикселях. По умолчанию установлено значение 1024 для достижения наилучших результатов. Значения ниже 512 пикселей будут работать некорректно для [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) и контрольных точек, которые не были специально дообучены на низких разрешениях. width (`int`, *optional*, по умолчанию self.unet.config.sample_size * self.vae_scale_factor) : Ширина генерируемого видео в пикселях. По умолчанию установлено значение 1024 для достижения наилучших результатов. Значения ниже 512 пикселей будут работать некорректно для [stabilityai/stable-diffusion-xl-base-1.0](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0) и контрольных точек, которые не были специально дообучены на низких разрешениях. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. timesteps (`list[int]`, *optional*) : Пользовательские шаги для процесса денойзинга с планировщиками, поддерживающими аргумент `timesteps` в их методе `set_timesteps`. Если не определено, будет использоваться поведение по умолчанию при передаче `num_inference_steps`. Должны быть в порядке убывания. sigmas (`list[float]`, *optional*) : Пользовательские сигмы для процесса денойзинга в планировщиках, поддерживающих аргумент `sigmas` в методе `set_timesteps`. Если не задано, будет использовано поведение по умолчанию при передаче `num_inference_steps`. denoising_end (`float`, *optional*) : When specified, determines the fraction (between 0.0 and 1.0) of the total denoising process to be completed before it is intentionally prematurely terminated. As a result, the returned sample will still retain a substantial amount of noise as determined by the discrete timesteps selected by the scheduler. The denoising_end parameter should ideally be utilized when this pipeline forms a part of a "Mixture of Denoisers" multi-pipeline setup, as elaborated in [**Refining the Image Output**](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/stable_diffusion_xl#refining-the-image-output) guidance_scale (`float`, *optional*, по умолчанию 5.0) : Масштаб направленного генерирования, как определено в [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` определяется как `w` из уравнения 2 в [Imagen Paper](https://huggingface.co/papers/2205.11487). Масштаб направленного генерирования включается при установке `guidance_scale > 1`. Более высокое значение масштаба направленного генерирования способствует созданию изображений, тесно связанных с текстовым `prompt`, обычно за счёт снижения качества видео. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию видео. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). negative_prompt_2 (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию видео, для передачи в `tokenizer_2` и `text_encoder_2`. Если не задан, `negative_prompt` используется в обоих текстовых кодировщиках num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *optional*, по умолчанию 0.0) : Соответствует параметру eta (η) в статье DDIM: https://huggingface.co/papers/2010.02502. Применяется только к [schedulers.DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), для остальных игнорируется. generator (`torch.Generator` или `list[torch.Generator]`, *необязательный*) : Один или список [генераторов torch](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не предоставлены, тензор латентов будет сгенерирован путём выборки с использованием переданного случайного `generator`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. pooled_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, пул-эмбеддинги текста будут сгенерированы из аргумента `prompt`. negative_pooled_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промптов. Если не предоставлены, пул-эмбеддинги negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. ip_adapter_image : (`PipelineImageInput`, *необязательный*): Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Если не предоставлены, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите между [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `~pipelines.stable_diffusion_xl.AnimateDiffPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в `self.processor` в [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). guidance_rescale (`float`, *optional*, defaults to 0.0) : Guidance rescale factor proposed by [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) `guidance_scale` is defined as `φ` in equation 16. of [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891). Guidance rescale factor should fix overexposure when using zero terminal SNR. original_size (`tuple[int]`, *optional*, по умолчанию (1024, 1024)) : Если `original_size` не совпадает с `target_size`, изображение будет выглядеть как уменьшенное или увеличенное. По умолчанию `original_size` равно `(height, width)`, если не указано иное. Является частью микроусловий SDXL, описанных в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). crops_coords_top_left (`tuple[int]`, *optional*, по умолчанию (0, 0)) : `crops_coords_top_left` можно использовать для генерации изображения, которое выглядит как «обрезанное» из позиции `crops_coords_top_left` вниз. Как правило, хорошо центрированные изображения получаются при установке `crops_coords_top_left` в (0, 0). Является частью микроусловий SDXL, описанных в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). target_size (`tuple[int]`, *optional*, по умолчанию (1024, 1024)) : В большинстве случаев `target_size` следует установить в желаемую высоту и ширину генерируемого изображения. Если не указано, по умолчанию будет `(height, width)`. Часть микроусловий SDXL, описанная в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). negative_original_size (`tuple[int]`, *optional*, по умолчанию (1024, 1024)) : Используется для негативного условия процесса генерации на основе конкретного разрешения изображения. Является частью микроусловия SDXL, описанной в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). Для получения дополнительной информации см. этот тред: https://github.com/huggingface/diffusers/issues/4208. negative_crops_coords_top_left (`tuple[int]`, *optional*, по умолчанию (0, 0)) : Используется для негативного обусловливания процесса генерации на основе конкретных координат кадрирования. Является частью микрообусловливания SDXL, описанной в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). Для получения дополнительной информации см. этот тред: https://github.com/huggingface/diffusers/issues/4208. negative_target_size (`tuple[int]`, *optional*, по умолчанию (1024, 1024)) : Используется для негативного обусловливания процесса генерации на основе целего разрешения изображения. В большинстве случаев должно совпадать с `target_size`. Является частью микрообусловливания SDXL, описанной в разделе 2.2 статьи [https://huggingface.co/papers/2307.01952](https://huggingface.co/papers/2307.01952). Для получения дополнительной информации см. этот тред: https://github.com/huggingface/diffusers/issues/4208. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. **Возвращает:** [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция, вызываемая при обращении к конвейеру для генерации. Примеры: ```py >>> import torch >>> from diffusers.models import MotionAdapter >>> from diffusers import AnimateDiffSDXLPipeline, DDIMScheduler >>> from diffusers.utils import export_to_gif >>> adapter = MotionAdapter.from_pretrained( ... "a-r-r-o-w/animatediff-motion-adapter-sdxl-beta", torch_dtype=torch.float16 ... ) >>> model_id = "stabilityai/stable-diffusion-xl-base-1.0" >>> scheduler = DDIMScheduler.from_pretrained( ... model_id, ... subfolder="scheduler", ... clip_sample=False, ... timestep_spacing="linspace", ... beta_schedule="linear", ... steps_offset=1, ... ) >>> pipe = AnimateDiffSDXLPipeline.from_pretrained( ... model_id, ... motion_adapter=adapter, ... scheduler=scheduler, ... torch_dtype=torch.float16, ... variant="fp16", ... ).to("cuda") >>> # enable memory savings >>> pipe.vae.enable_slicing() >>> pipe.vae.enable_tiling() >>> output = pipe( ... prompt="a panda surfing in the ocean, realistic, high quality", ... negative_prompt="low quality, worst quality", ... num_inference_steps=20, ... guidance_scale=8, ... width=1024, ... height=1024, ... num_frames=16, ... ) >>> frames = output.frames[0] >>> export_to_gif(frames, "animation.gif") ``` #### encode_prompt[[diffusers.AnimateDiffSDXLPipeline.encode_prompt]] ```python encode_prompt(prompt: str, prompt_2: str | None = None, device: typing.Optional[torch.device] = None, num_videos_per_prompt: int = 1, do_classifier_free_guidance: bool = True, negative_prompt: str | None = None, negative_prompt_2: str | None = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, pooled_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py#L327) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования prompt_2 (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые будут отправлены в `tokenizer_2` и `text_encoder_2`. Если не задано, в обоих текстовых кодировщиках используется `prompt` device : (`torch.device`): устройство torch num_videos_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). negative_prompt_2 (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения, и которые передаются в `tokenizer_2` и `text_encoder_2`. Если не задан, `negative_prompt` используется в обоих текстовых кодировщиках prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. pooled_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, пул-эмбеддинги текста будут сгенерированы из аргумента `prompt`. negative_pooled_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные пул-эмбеддинги текста. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промптов. Если не предоставлены, пул-эмбеддинги negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *optional*) : масштаб lora, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. #### get_guidance_scale_embedding[[diffusers.AnimateDiffSDXLPipeline.get_guidance_scale_embedding]] ```python get_guidance_scale_embedding(w: Tensor, embedding_dim: int = 512, dtype: dtype = torch.float32) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py#L804) **Параметры:** w (`torch.Tensor`) : Генерирует векторы эмбеддингов с заданным масштабом руководства (guidance scale) для последующего обогащения эмбеддингов временных шагов. embedding_dim (`int`, *необязательный*, по умолчанию 512) : Размерность генерируемых эмбеддингов. dtype (`torch.dtype`, *необязательный*, по умолчанию `torch.float32`) : Тип данных для генерируемых эмбеддингов. **Возвращает:** `torch.Tensor` Векторы встраиваний с формой `(len(w), embedding_dim)`. См. https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298 ## AnimateDiffVideoToVideoPipeline[[diffusers.AnimateDiffVideoToVideoPipeline]] #### diffusers.AnimateDiffVideoToVideoPipeline[[diffusers.AnimateDiffVideoToVideoPipeline]] ```python diffusers.AnimateDiffVideoToVideoPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, tokenizer: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler | diffusers.schedulers.scheduling_euler_discrete.EulerDiscreteScheduler | diffusers.schedulers.scheduling_euler_ancestral_discrete.EulerAncestralDiscreteScheduler | diffusers.schedulers.scheduling_dpmsolver_multistep.DPMSolverMultistepScheduler, feature_extractor: CLIPImageProcessorPil = None, image_encoder: CLIPVisionModelWithProjection = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py#L181) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : замороженный текстовый энкодер ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). tokenizer (`CLIPTokenizer`) : [CLIPTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPTokenizer) для токенизации текста. unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : [UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel), используемый для создания UNetMotionModel, который выполняет удаление шума из закодированных латентов видео. motion_adapter (`MotionAdapter`) : `MotionAdapter`, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений видео. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). Пайплайн для генерации видео из видео. Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса. Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffVideoToVideoPipeline.__call__]] ```python __call__(video: list[list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]]] = None, prompt: str | list[str] | None = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, enforce_inference_steps: bool = False, timesteps: list[int] | None = None, sigmas: list[float] | None = None, guidance_scale: float = 7.5, strength: float = 0.8, negative_prompt: str | list[str] | None = None, num_videos_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: list[torch.Tensor] | None = None, output_type: str | None = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], decode_chunk_size: int = 16) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py#L744) **Параметры:** video (`list[PipelineImageInput]`) : Входное видео, на основе которого выполняется генерация. Должно быть списком изображений/кадров видео. prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds`. height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого видео в пикселях. width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого видео в пикселях. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. enforce_inference_steps (`bool`, *необязательный*, по умолчанию `False`) : Следует ли строго соблюдать количество шагов денойзинга `num_inference_steps` независимо от параметра `strength`. Если установлено значение `False`, эффективное количество шагов инференса уменьшается в соответствии с `strength`. timesteps (`list[int]`, *optional*) : Пользовательские шаги для процесса денойзинга с планировщиками, поддерживающими аргумент `timesteps` в их методе `set_timesteps`. Если не определено, будет использоваться поведение по умолчанию при передаче `num_inference_steps`. Должны быть в порядке убывания. sigmas (`list[float]`, *optional*) : Пользовательские сигмы для процесса денойзинга в планировщиках, поддерживающих аргумент `sigmas` в методе `set_timesteps`. Если не задано, будет использовано поведение по умолчанию при передаче `num_inference_steps`. strength (`float`, *optional*, по умолчанию 0.8) : Чем выше значение, тем больше различий между исходным и сгенерированным видео. guidance_scale (`float`, *optional*, по умолчанию 7.5) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить из генерируемого изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`). num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками. generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *optional*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не указано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`. Латенты должны иметь форму `(batch_size, num_channel, num_frames, height, width)`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, текстовые эмбеддинги генерируются из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, `negative_prompt_embeds` генерируются из входного аргумента `negative_prompt`. ip_adapter_image : (`PipelineImageInput`, *необязательный*): Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Должен представлять собой список, длина которого равна количеству IP-адаптеров. Каждый элемент должен быть тензором формы `(batch_size, num_images, emb_dim)`. Если `do_classifier_free_guidance` установлен в `True`, должен содержать отрицательный эмбеддинг изображения. Если не указан, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите один из вариантов: `torch.Tensor`, `PIL.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `AnimateDiffPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. decode_chunk_size (`int`, по умолчанию `16`) : количество кадров, которые декодируются за один вызов метода `decode_latents`. **Возвращает:** [pipelines.animatediff.pipeline_output.AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [pipelines.animatediff.pipeline_output.AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция вызова конвейера для генерации. Примеры: #### encode_prompt[[diffusers.AnimateDiffVideoToVideoPipeline.encode_prompt]] ```python encode_prompt(prompt, device, num_images_per_prompt, do_classifier_free_guidance, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py#L256) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования device : (`torch.device`): устройство torch num_images_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *необязательный*) : Масштаб LoRA, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. ## AnimateDiffVideoToVideoControlNetPipeline[[diffusers.AnimateDiffVideoToVideoControlNetPipeline]] #### diffusers.AnimateDiffVideoToVideoControlNetPipeline[[diffusers.AnimateDiffVideoToVideoControlNetPipeline]] ```python diffusers.AnimateDiffVideoToVideoControlNetPipeline(vae: AutoencoderKL, text_encoder: CLIPTextModel, tokenizer: CLIPTokenizer, unet: diffusers.models.unets.unet_2d_condition.UNet2DConditionModel | diffusers.models.unets.unet_motion_model.UNetMotionModel, motion_adapter: MotionAdapter, controlnet: diffusers.models.controlnets.controlnet.ControlNetModel | list[diffusers.models.controlnets.controlnet.ControlNetModel] | tuple[diffusers.models.controlnets.controlnet.ControlNetModel] | diffusers.models.controlnets.multicontrolnet.MultiControlNetModel, scheduler: diffusers.schedulers.scheduling_ddim.DDIMScheduler | diffusers.schedulers.scheduling_pndm.PNDMScheduler | diffusers.utils.dummy_torch_and_scipy_objects.LMSDiscreteScheduler | diffusers.schedulers.scheduling_euler_discrete.EulerDiscreteScheduler | diffusers.schedulers.scheduling_euler_ancestral_discrete.EulerAncestralDiscreteScheduler | diffusers.schedulers.scheduling_dpmsolver_multistep.DPMSolverMultistepScheduler, feature_extractor: CLIPImageProcessorPil = None, image_encoder: CLIPVisionModelWithProjection = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py#L199) **Параметры:** vae ([AutoencoderKL](/docs/diffusers/main/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. text_encoder (`CLIPTextModel`) : замороженный текстовый энкодер ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). tokenizer (`CLIPTokenizer`) : [CLIPTokenizer](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPTokenizer) для токенизации текста. unet ([UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel)) : [UNet2DConditionModel](/docs/diffusers/main/ru/api/models/unet2d-cond#diffusers.UNet2DConditionModel), используемый для создания UNetMotionModel, который выполняет удаление шума из закодированных латентов видео. motion_adapter (`MotionAdapter`) : `MotionAdapter`, используемый в сочетании с `unet` для удаления шума из закодированных латентных представлений видео. controlnet ([ControlNetModel](/docs/diffusers/main/ru/api/models/controlnet#diffusers.ControlNetModel) или `list[ControlNetModel]` или `tuple[ControlNetModel]` или `MultiControlNetModel`) : Предоставляет дополнительное условие для `unet` в процессе денойзинга. Если вы зададите несколько ControlNet в виде списка, выходы каждого ControlNet будут сложены вместе, чтобы создать одно объединённое дополнительное условие. scheduler ([SchedulerMixin](/docs/diffusers/main/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `unet` для удаления шума из закодированных латентов изображения. Может быть одним из [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler), [LMSDiscreteScheduler](/docs/diffusers/main/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler) или [PNDMScheduler](/docs/diffusers/main/ru/api/schedulers/pndm#diffusers.PNDMScheduler). Пайплайн для генерации видео из видео с управлением через ControlNet. Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Общую документацию по методам, реализованным для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.), см. в документации родительского класса. Пайплайн также наследует следующие методы загрузки: - [load_textual_inversion()](/docs/diffusers/main/ru/api/loaders/textual_inversion#diffusers.loaders.TextualInversionLoaderMixin.load_textual_inversion) для загрузки эмбеддингов текстовой инверсии - [load_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.load_lora_weights) для загрузки весов LoRA - [save_lora_weights()](/docs/diffusers/main/ru/api/loaders/lora#diffusers.loaders.StableDiffusionLoraLoaderMixin.save_lora_weights) для сохранения весов LoRA - [load_ip_adapter()](/docs/diffusers/main/ru/api/loaders/ip_adapter#diffusers.loaders.IPAdapterMixin.load_ip_adapter) для загрузки IP-адаптеров #### __call__[[diffusers.AnimateDiffVideoToVideoControlNetPipeline.__call__]] ```python __call__(video: list[list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]]] = None, prompt: str | list[str] | None = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 50, enforce_inference_steps: bool = False, timesteps: list[int] | None = None, sigmas: list[float] | None = None, guidance_scale: float = 7.5, strength: float = 0.8, negative_prompt: str | list[str] | None = None, num_videos_per_prompt: int | None = 1, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = None, ip_adapter_image_embeds: list[torch.Tensor] | None = None, conditioning_frames: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = None, output_type: str | None = 'pil', return_dict: bool = True, cross_attention_kwargs: dict[str, typing.Any] | None = None, controlnet_conditioning_scale: float | list[float] = 1.0, guess_mode: bool = False, control_guidance_start: float | list[float] = 0.0, control_guidance_end: float | list[float] = 1.0, clip_skip: int | None = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], decode_chunk_size: int = 16) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py#L909) **Параметры:** video (`list[PipelineImageInput]`) : Входное видео, на основе которого выполняется генерация. Должно быть списком изображений/кадров видео. prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds`. height (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Высота генерируемого видео в пикселях. width (`int`, *необязательный*, по умолчанию `self.unet.config.sample_size * self.vae_scale_factor`) : Ширина генерируемого видео в пикселях. num_inference_steps (`int`, *optional*, по умолчанию 50) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но за счёт более медленного вывода. enforce_inference_steps (`bool`, *необязательный*, по умолчанию `False`) : Следует ли строго соблюдать количество шагов денойзинга `num_inference_steps` независимо от параметра `strength`. Если установлено значение `False`, эффективное количество шагов инференса уменьшается в соответствии с `strength`. timesteps (`list[int]`, *optional*) : Пользовательские шаги для процесса денойзинга с планировщиками, поддерживающими аргумент `timesteps` в их методе `set_timesteps`. Если не определено, будет использоваться поведение по умолчанию при передаче `num_inference_steps`. Должны быть в порядке убывания. sigmas (`list[float]`, *optional*) : Пользовательские сигмы для процесса денойзинга в планировщиках, поддерживающих аргумент `sigmas` в методе `set_timesteps`. Если не задано, будет использовано поведение по умолчанию при передаче `num_inference_steps`. strength (`float`, *optional*, по умолчанию 0.8) : Чем выше значение, тем больше различий между исходным и сгенерированным видео. guidance_scale (`float`, *optional*, по умолчанию 7.5) : Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым `prompt`, за счёт снижения качества изображения. Guidance scale активируется, когда `guidance_scale > 1`. negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, определяющие, что следует исключить из генерируемого изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющая (`guidance_scale < 1`). num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество видео, генерируемых на один промпт. eta (`float`, *необязательный*, по умолчанию 0.0) : Соответствует параметру eta (η) из статьи [DDIM](https://huggingface.co/papers/2010.02502). Применяется только к [DDIMScheduler](/docs/diffusers/main/ru/api/schedulers/ddim#diffusers.DDIMScheduler) и игнорируется другими планировщиками. generator (`torch.Generator` или `list[torch.Generator]`, *необязательно*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. latents (`torch.Tensor`, *optional*) : Предварительно сгенерированные шумовые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с разными промптами. Если не указано, тензор латентов генерируется путём выборки с использованием переданного случайного `generator`. Латенты должны иметь форму `(batch_size, num_channel, num_frames, height, width)`. prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, текстовые эмбеддинги генерируются из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не предоставлены, `negative_prompt_embeds` генерируются из входного аргумента `negative_prompt`. ip_adapter_image : (`PipelineImageInput`, *необязательный*): Необязательное входное изображение для работы с IP-адаптерами. ip_adapter_image_embeds (`list[torch.Tensor]`, *необязательный*) : Предварительно сгенерированные эмбеддинги изображений для IP-Adapter. Должен представлять собой список, длина которого равна количеству IP-адаптеров. Каждый элемент должен быть тензором формы `(batch_size, num_images, emb_dim)`. Если `do_classifier_free_guidance` установлен в `True`, должен содержать отрицательный эмбеддинг изображения. Если не указан, эмбеддинги вычисляются из входного аргумента `ip_adapter_image`. conditioning_frames (`list[PipelineImageInput]`, *optional*) : Условие входа ControlNet для предоставления руководящих сигналов `unet` при генерации. Если указано несколько ControlNet, изображения должны передаваться в виде списка, чтобы каждый элемент списка мог быть корректно сгруппирован в пакет для входа в один ControlNet. output_type (`str`, *необязательный*, по умолчанию `"pil"`) : Формат вывода сгенерированного видео. Выберите один из вариантов: `torch.Tensor`, `PIL.Image` или `np.array`. return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `AnimateDiffPipelineOutput` вместо обычного кортежа. cross_attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в [`self.processor`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). controlnet_conditioning_scale (`float` или `list[float]`, *необязательный*, по умолчанию 1.0) : Выходные данные ControlNet умножаются на `controlnet_conditioning_scale` перед добавлением к остаточному соединению в исходном `unet`. Если в `init` указано несколько ControlNet, соответствующий масштаб можно задать в виде списка. guess_mode (`bool`, *необязательный*, по умолчанию `False`) : Кодер ControlNet пытается распознать содержимое входного изображения, даже если вы удалите все промпты. Рекомендуется значение `guidance_scale` в диапазоне от 3.0 до 5.0. control_guidance_start (`float` или `list[float]`, *необязательный*, по умолчанию 0.0) : Доля от общего числа шагов, на которой ControlNet начинает применяться. control_guidance_end (`float` или `list[float]`, *необязательный*, по умолчанию 1.0) : Доля от общего числа шагов, на которой ControlNet прекращает применяться. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. callback_on_step_end (`Callable`, *необязательный*) : функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs` будет содержать список всех тензоров, как указано в `callback_on_step_end_tensor_inputs`. callback_on_step_end_tensor_inputs (`list`, *optional*) : Список тензорных входных данных для функции `callback_on_step_end`. Тензоры, указанные в списке, будут переданы в качестве аргумента `callback_kwargs`. Вы сможете включать только переменные, перечисленные в атрибуте `._callback_tensor_inputs` вашего класса pipeline. decode_chunk_size (`int`, по умолчанию `16`) : количество кадров, которые декодируются за один вызов метода `decode_latents`. **Возвращает:** [pipelines.animatediff.pipeline_output.AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput) или `tuple` Если `return_dict` равно `True`, возвращается [pipelines.animatediff.pipeline_output.AnimateDiffPipelineOutput](/docs/diffusers/main/ru/api/pipelines/animatediff#diffusers.pipelines.animatediff.AnimateDiffPipelineOutput), иначе возвращается `tuple`, где первый элемент — это список сгенерированных кадров. Функция вызова конвейера для генерации. Примеры: #### encode_prompt[[diffusers.AnimateDiffVideoToVideoControlNetPipeline.encode_prompt]] ```python encode_prompt(prompt, device, num_images_per_prompt, do_classifier_free_guidance, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, lora_scale: float | None = None, clip_skip: int | None = None) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py#L287) **Параметры:** prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования device : (`torch.device`): устройство torch num_images_per_prompt (`int`) : количество изображений, которые должны быть сгенерированы для каждого промпта do_classifier_free_guidance (`bool`) : использовать ли классификаторное свободное наведение (classifier free guidance) negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`). prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, текстовые эмбеддинги будут сгенерированы из входного аргумента `prompt`. negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, *например* для взвешивания промпта. Если не предоставлены, negative_prompt_embeds будут сгенерированы из входного аргумента `negative_prompt`. lora_scale (`float`, *необязательный*) : Масштаб LoRA, который будет применён ко всем слоям LoRA текстового энкодера, если слои LoRA загружены. clip_skip (`int`, *optional*) : Количество слоев, которые пропускаются в CLIP при вычислении эмбеддингов промпта. Значение 1 означает, что для вычисления эмбеддингов промпта будет использоваться выход предпоследнего слоя. Кодирует промпт в скрытые состояния текстового энкодера. ## AnimateDiffPipelineOutput[[diffusers.pipelines.animatediff.AnimateDiffPipelineOutput]] #### diffusers.pipelines.animatediff.AnimateDiffPipelineOutput[[diffusers.pipelines.animatediff.AnimateDiffPipelineOutput]] ```python diffusers.pipelines.animatediff.AnimateDiffPipelineOutput(frames: typing.Union[torch.Tensor, numpy.ndarray, list[list[PIL.Image.Image]]]) ``` [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_output.py#L11) **Параметры:** frames (`torch.Tensor`, `np.ndarray` или list[list[PIL.Image.Image]]) : список видеовыходов — может быть вложенным списком длины `batch_size,`, где каждый подсписок содержит разшумленные Класс результата для пайплайнов AnimateDiff. Последовательности изображений PIL длины `num_frames.` Также может быть массивом NumPy или тензором Torch с формой `(batch_size, num_frames, channels, height, width)`
# Генерация видео из текста с помощью AnimateDiff
## Обзор
[AnimateDiff: Анимация ваших персонализированных диффузионных моделей «текст в изображение» без специальной настройки](https://huggingface.co/papers/2307.04725) от Yuwei Guo, Ceyuan Yang, Anyi Rao, Yaohui Wang, Yu Qiao, Dahua Lin, Bo Dai.
Аннотация к статье следующая:
*С развитием моделей преобразования текста в изображение (например, Stable Diffusion) и соответствующих методов персонализации, таких как DreamBooth и LoRA, каждый может воплотить свои идеи в высококачественные изображения по доступной цене. Вслед за этим возникла значительная потребность в методах анимации изображений, чтобы объединять сгенерированные статичные изображения с динамикой движения. В данном отчёте мы предлагаем практический фреймворк, позволяющий один раз и навсегда анимировать большинство существующих персонализированных моделей преобразования текста в изображение, экономя усилия на настройке под конкретную модель. В основе предложенного фреймворка лежит вставка нового модуля моделирования движения с инициализацией с нуля в замороженную модель преобразования текста в изображение и его обучение на видеоклипах для дистилляции разумных априорных представлений о движении. После обучения достаточно просто внедрить этот модуль моделирования движения, и все персонализированные версии, полученные из одной и той же базовой T2I, сразу превращаются в модели, управляемые текстом, которые генерируют разнообразные и персонализированные анимированные изображения. Мы провели оценку на нескольких публичных репрезентативных персонализированных моделях преобразования текста в изображение на примере аниме-иллюстраций и реалистичных фотографий и показали, что предложенный нами фреймворк помогает этим моделям генерировать временнó-плавные анимационные клипы, сохраняя при этом домен и разнообразие их выходов. Код и предобученные веса будут публично доступны по [этой ссылке](https://animatediff.github.io/).*
## Доступные конвейеры
| Конвейер | Задачи | Демо
|---|---|:---:|
| [AnimateDiffPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff.py) | *Генерация видео из текста с помощью AnimateDiff* |
| [AnimateDiffControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_controlnet.py) | *Управляемая генерация видео из видео с помощью AnimateDiff и ControlNet* |
| [AnimateDiffSparseControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sparsectrl.py) | *Управляемая генерация видео из видео с помощью AnimateDiff и SparseCtrl* |
| [AnimateDiffSDXLPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_sdxl.py) | *Генерация видео из видео с помощью AnimateDiff* |
| [AnimateDiffVideoToVideoPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video.py) | *Генерация видео из видео с помощью AnimateDiff* |
| [AnimateDiffVideoToVideoControlNetPipeline](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/animatediff/pipeline_animatediff_video2video_controlnet.py) | *Генерация видео из видео с помощью AnimateDiff и ControlNet* |
## Доступные контрольные точки
Чекпоинты Motion Adapter можно найти в репозитории [guoyww](https://huggingface.co/guoyww/). Эти чекпоинты предназначены для работы с любой моделью на основе Stable Diffusion 1.4/1.5.
## Пример использования
### AnimateDiffPipeline
AnimateDiff работает с контрольной точкой MotionAdapter и контрольной точкой модели Stable Diffusion. MotionAdapter представляет собой набор Motion Modules, отвечающих за добавление согласованного движения между кадрами изображения. Эти модули применяются после блоков Resnet и Attention в UNet Stable Diffusion.
В следующем примере показано, как использовать контрольную точку *MotionAdapter* с Diffusers для инференса на основе StableDiffusion-1.4/1.5.
```python
import torch
from diffusers import AnimateDiffPipeline, DDIMScheduler, MotionAdapter
from diffusers.utils import export_to_gif
# Load the motion adapter
adapter = MotionAdapter.from_pretrained("guoyww/animatediff-motion-adapter-v1-5-2", dtype=torch.float16)
# load SD 1.5 based finetuned model
model_id = "SG161222/Realistic_Vision_V5.1_noVAE"
pipe = AnimateDiffPipeline.from_pretrained(model_id, motion_adapter=adapter, dtype=torch.float16)
scheduler = DDIMScheduler.from_pretrained(
model_id,
subfolder="scheduler",
clip_sample=False,
timestep_spacing="linspace",
beta_schedule="linear",
steps_offset=1,
)
pipe.scheduler = scheduler
# enable memory savings
pipe.vae.enable_slicing()
pipe.enable_model_cpu_offload()
output = pipe(
prompt=(
"masterpiece, bestquality, highlydetailed, ultradetailed, sunset, "
"orange sky, warm lighting, fishing boats, ocean waves seagulls, "
"rippling water, wharf, silhouette, serene atmosphere, dusk, evening glow, "
"golden hour, coastal landscape, seaside scenery"
),
negative_prompt="bad quality, worse quality",
num_frames=16,
guidance_scale=7.5,
num_inference_steps=25,
generator=torch.Generator("cpu").manual_seed(42),
)
frames = output.frames[0]
export_to_gif(frames, "animation.gif")
```
Вот несколько примеров вывода:
masterpiece, bestquality, sunset.
<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/animatediff-realistic-doc.gif"
alt="masterpiece, bestquality, sunset"
style="width: 300px;" />
> [!TIP]
> AnimateDiff, как правило, лучше работает с дообученными моделями Stable Diffusion. Если вы планируете использовать планировщик, способный обрезать выборки, убедитесь, что эта функция отключена, установив `clip_sample=False` в планировщике, поскольку это также может негативно влиять на генерируемые образцы. Кроме того, контрольные точки AnimateDiff могут быть чувствительны к бета-расписанию планировщика. Мы рекомендуем установить его в значение `linear`.
### AnimateDiffControlNetPipeline
AnimateDiff также можно использовать с ControlNet. ControlNet был представлен в статье [Adding Conditional Control to Text-to-Image Diffusion Models](https://huggingface.co/papers/2302.05543) авторами Lvmin Zhang, Anyi Rao и Maneesh Agrawala. С помощью модели ControlNet вы можете предоставить дополнительное управляющее изображение для настройки и управления генерацией Stable Diffusion. Например, если вы предоставите карты глубины, модель ControlNet сгенерирует видео, сохраняющее пространственную информацию из этих карт. Это более гибкий и точный способ управления процессом генерации видео.
```python
import torch
from diffusers import AnimateDiffControlNetPipeline, AutoencoderKL, ControlNetModel, MotionAdapter, LCMScheduler
from diffusers.utils import export_to_gif, load_video

Xet Storage Details

Size:
188 kB
·
Xet hash:
7508ac8f58a8ba50186267e5e9fbc3d7fed1e6a21748c327d5db98080b219c51

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.