Diffusers documentation
Wan
Wan
Wan-2.1 par l'équipe Wan.
Ce rapport présente Wan, une suite complète et ouverte de modèles de fondation pour la vidéo, conçue pour repousser les limites de la génération vidéo. Construite sur le paradigme principal du diffusion transformer, Wan obtient des avancées significatives en capacités génératives grâce à une série d'innovations, notamment notre VAE novateur, des stratégies de pré-entraînement évolutives, une curation de données à grande échelle et des métriques d'évaluation automatisées. Ces contributions améliorent collectivement les performances et la polyvalence du modèle. Plus précisément, Wan se caractérise par quatre fonctionnalités clés : Performance de pointe : Le modèle 14B de Wan, entraîné sur un vaste jeu de données comprenant des milliards d'images et de vidéos, démontre les lois d'échelle de la génération vidéo en fonction à la fois de la taille des données et du modèle. Il surpasse systématiquement les modèles open source existants ainsi que les solutions commerciales de pointe sur de multiples benchmarks internes et externes, démontrant une supériorité de performance claire et significative. Exhaustivité : Wan propose deux modèles performants, à savoir 1,3B et 14B paramètres, pour l'efficacité et l'effectivité respectivement. Il couvre également plusieurs applications en aval, y compris l'image-à-vidéo, l'édition vidéo guidée par des instructions et la génération vidéo personnelle, englobant jusqu'à huit tâches. Efficacité de niveau grand public : Le modèle 1,3B démontre une efficacité des ressources exceptionnelle, nécessitant seulement 8,19 Go de VRAM, ce qui le rend compatible avec une large gamme de GPU de niveau grand public. Ouverture : Nous mettons en open source l'ensemble de la série Wan, y compris le code source et tous les modèles, dans le but de favoriser la croissance de la communauté de la génération vidéo. Cette ouverture vise à élargir considérablement les possibilités créatives de la production vidéo dans l'industrie et à fournir à l'académie des modèles de fondation vidéo de haute qualité. Tout le code et les modèles sont disponibles à cette URL https.
Vous pouvez trouver tous les points de contrôle originaux de Wan2.1 sous l'organisation Wan-AI.
Les modèles Wan suivants sont pris en charge dans Diffusers :
- Wan 2.1 T2V 1.3B
- Wan 2.1 T2V 14B
- Wan 2.1 I2V 14B - 480P
- Wan 2.1 I2V 14B - 720P
- Wan 2.1 FLF2V 14B - 720P
- Wan 2.1 VACE 1.3B
- Wan 2.1 VACE 14B
- Wan 2.2 T2V 14B
- Wan 2.2 I2V 14B
- Wan 2.2 TI2V 5B
- Wan 2.2 Animate 14B
Cliquez sur les modèles Wan dans la barre latérale droite pour plus d’exemples de génération de vidéos.
Génération de texte en vidéo
L'exemple ci-dessous montre comment générer une vidéo à partir de texte, optimisée pour la mémoire ou la vitesse d'inférence.
Reportez-vous au guide Réduire l'utilisation de la mémoire pour plus de détails sur les différentes techniques d'économie de mémoire.
Le modèle de génération de vidéo à partir de texte Wan2.1 ci-dessous nécessite environ 13 Go de VRAM.
# pip install ftfy
import torch
import numpy as np
from diffusers import AutoModel, WanPipeline
from diffusers.quantizers import PipelineQuantizationConfig
from diffusers.hooks.group_offloading import apply_group_offloading
from diffusers.utils import export_to_video, load_image
from transformers import UMT5EncoderModel
text_encoder = UMT5EncoderModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="text_encoder", dtype=torch.bfloat16)
vae = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="vae", dtype=torch.float32)
transformer = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="transformer", dtype=torch.bfloat16)
# group-offloading
onload_device = torch.device("cuda")
offload_device = torch.device("cpu")
apply_group_offloading(text_encoder,
onload_device=onload_device,
offload_device=offload_device,
offload_type="block_level",
num_blocks_per_group=4
)
transformer.enable_group_offload(
onload_device=onload_device,
offload_device=offload_device,
offload_type="leaf_level",
use_stream=True
)
pipeline = WanPipeline.from_pretrained(
"Wan-AI/Wan2.1-T2V-14B-Diffusers",
vae=vae,
transformer=transformer,
text_encoder=text_encoder,
dtype=torch.bfloat16
)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
prompt = """
The camera rushes from far to near in a low-angle shot,
revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in
for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground.
Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic
shadows and warm highlights. Medium composition, front view, low angle, with depth of field.
"""
negative_prompt = """
Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality,
low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured,
misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards
"""
output = pipeline(
prompt=prompt,
negative_prompt=negative_prompt,
num_frames=81,
guidance_scale=5.0,
).frames[0]
export_to_video(output, "output.mp4", fps=16)Compilation est lente lors de la première exécution, mais les appels suivants au pipeline sont plus rapides. Le cache peut également accélérer l'inférence en stockant et en réutilisant les sorties intermédiaires.
# pip install ftfy
import torch
import numpy as np
from diffusers import AutoModel, WanPipeline
from diffusers.hooks.group_offloading import apply_group_offloading
from diffusers.utils import export_to_video, load_image
from transformers import UMT5EncoderModel
text_encoder = UMT5EncoderModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="text_encoder", dtype=torch.bfloat16)
vae = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="vae", dtype=torch.float32)
transformer = AutoModel.from_pretrained("Wan-AI/Wan2.1-T2V-14B-Diffusers", subfolder="transformer", dtype=torch.bfloat16)
pipeline = WanPipeline.from_pretrained(
"Wan-AI/Wan2.1-T2V-14B-Diffusers",
vae=vae,
transformer=transformer,
text_encoder=text_encoder,
dtype=torch.bfloat16
)
pipeline.to("cuda") # or "mps", "xpu", "cpu"
# torch.compile
pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.transformer = torch.compile(
pipeline.transformer, mode="max-autotune", fullgraph=True
)
prompt = """
The camera rushes from far to near in a low-angle shot,
revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in
for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground.
Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic
shadows and warm highlights. Medium composition, front view, low angle, with depth of field.
"""
negative_prompt = """
Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality,
low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured,
misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards
"""
output = pipeline(
prompt=prompt,
negative_prompt=negative_prompt,
num_frames=81,
guidance_scale=5.0,
).frames[0]
export_to_video(output, "output.mp4", fps=16)Génération de vidéo à partir de la première et de la dernière image
L'exemple ci-dessous montre comment utiliser le pipeline image-verso-vidéo pour générer une vidéo à partir d'une description textuelle, d'une image de départ et d'une image de fin.
import numpy as np
import torch
import torchvision.transforms.functional as TF
from diffusers import AutoencoderKLWan, WanImageToVideoPipeline
from diffusers.utils import export_to_video, load_image
from transformers import CLIPVisionModel
model_id = "Wan-AI/Wan2.1-FLF2V-14B-720P-diffusers"
image_encoder = CLIPVisionModel.from_pretrained(model_id, subfolder="image_encoder", dtype=torch.float32)
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32)
pipe = WanImageToVideoPipeline.from_pretrained(
model_id, vae=vae, image_encoder=image_encoder, dtype=torch.bfloat16
)
pipe.to("cuda") # or "mps", "xpu", "cpu"
first_frame = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_first_frame.png")
last_frame = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_last_frame.png")
def aspect_ratio_resize(image, pipe, max_area=720 * 1280):
aspect_ratio = image.height / image.width
mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1]
height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value
width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value
image = image.resize((width, height))
return image, height, width
def center_crop_resize(image, height, width):
# Calculate resize ratio to match first frame dimensions
resize_ratio = max(width / image.width, height / image.height)
# Resize the image
width = round(image.width * resize_ratio)
height = round(image.height * resize_ratio)
size = [width, height]
image = TF.center_crop(image, size)
return image, height, width
first_frame, height, width = aspect_ratio_resize(first_frame, pipe)
if last_frame.size != first_frame.size:
last_frame, _, _ = center_crop_resize(last_frame, height, width)
prompt = "CG animation style, a small blue bird takes off from the ground, flapping its wings. The bird's feathers are delicate, with a unique pattern on its chest. The background shows a blue sky with white clouds under bright sunshine. The camera follows the bird upward, capturing its flight and the vastness of the sky from a close-up, low-angle perspective."
output = pipe(
image=first_frame, last_image=last_frame, prompt=prompt, height=height, width=width, guidance_scale=5.5
).frames[0]
export_to_video(output, "output.mp4", fps=16)Génération contrôlable de n'importe quel type vers vidéo
Wan VACE prend en charge diverses techniques de génération permettant une génération de vidéos contrôlable. Parmi les fonctionnalités incluses :
- Contrôle vidéo à vidéo (profondeur, pose, esquisse, flux, niveaux de gris, gribouillis, mise en page, boîte de contour, etc.). Bibliothèque recommandée pour prétraiter les vidéos afin d’obtenir des vidéos de contrôle : huggingface/controlnet_aux
- Image/vidéo vers vidéo (première image, dernière image, clip de départ, clip de fin, clips aléatoires)
- Inpainting et Outpainting
- Sujet de la vidéo (visages, objets, personnages, etc.)
- Composition vers vidéo (référencer n'importe quoi, animer n'importe quoi, échanger n'importe quoi, étendre n'importe quoi, déplacer n'importe quoi, etc.)
Les extraits de code disponibles dans cette pull request illustrent quelques exemples de la manière dont des vidéos peuvent être générées à l'aide de signaux de contrôlabilité.
La règle générale à garder en tête lors de la préparation des entrées pour le pipeline VACE est que les images d’entrée, ou les frames d’une vidéo que vous souhaitez utiliser pour le conditionnement, doivent être accompagnées d’un masque correspondant, de couleur noire. Le masque noir indique que le modèle ne générera pas de nouveau contenu pour cette zone, et n’utilisera ces parties que pour conditionner le processus de génération. Pour les parties/frames qui doivent être générées par le modèle, le masque doit être de couleur blanche.
Wan-Animate : Animation et remplacement unifiés de personnages avec réplique holistique
Wan-Animate par l'équipe Wan.
Nous présentons Wan-Animate, un cadre unifié pour l’animation et le remplacement de personnages. À partir d’une image de personnage et d’une vidéo de référence, Wan-Animate peut animer le personnage en reproduisant avec précision les expressions et les mouvements du personnage dans la vidéo, afin de générer des vidéos de personnage haute fidélité. Alternativement, il peut intégrer le personnage animé dans la vidéo de référence pour remplacer le personnage d’origine, en reproduisant l’éclairage et la tonalité de couleur de la scène afin d’obtenir une intégration environnementale sans couture. Wan-Animate est construit sur le modèle Wan. Pour l’adapter aux tâches d’animation de personnage, nous utilisons un paradigme d’entrée modifié pour distinguer les conditions de référence des régions de génération. Cette conception unifie plusieurs tâches dans une représentation symbolique commune. Nous utilisons des signaux de squelette alignés spatialement pour reproduire le mouvement du corps et des caractéristiques faciales implicites extraites des images sources pour rejouer les expressions, permettant la génération de vidéos de personnage avec une grande contrôlabilité et expressivité. De plus, pour améliorer l’intégration environnementale lors du remplacement de personnage, nous développons un Relighting LoRA auxiliaire. Ce module préserve la cohérence de l’apparence du personnage tout en appliquant l’éclairage et la tonalité de couleur environnementaux appropriés. Les résultats expérimentaux démontrent que Wan-Animate atteint des performances de pointe. Nous nous engageons à open-sourcer les poids du modèle et son code source.
La page du projet : https://humanaigc.github.io/wan-animate
Ce modèle a été principalement contribué par M. Tolga Cangöz.
Utilisation
Le pipeline Wan-Animate prend en charge deux modes de fonctionnement :
- Mode Animation (par défaut) : Anime une image de personnage en se basant sur le mouvement et l'expression issus de vidéos de référence
- Mode de remplacement : Remplace un personnage dans une vidéo d'arrière-plan par un nouveau personnage tout en préservant la scène
Prérequis
Avant d'utiliser le pipeline, vous devez prétraiter votre vidéo de référence pour extraire :
- Vidéo de pose : Contient des points clés squelettiques représentant le mouvement du corps
- Vidéo du visage : Contient des représentations des traits du visage pour le contrôle des expressions
Pour le mode de remplacement, vous avez également besoin de :
- Vidéo d'arrière-plan : La vidéo d'origine contenant la scène
- Vidéo de masque : un masque indiquant où générer du contenu (blanc) par rapport à conserver l’original (noir)
Les vidéos brutes ne doivent pas être utilisées pour des entrées telles que
pose_video, pour lesquelles le pipeline s’attend à ce qu’elles soient prétraitées afin d’extraire les informations appropriées. Des scripts de prétraitement pour préparer ces entrées sont disponibles dans le dépôt original Wan-Animate. L’intégration de ces étapes de prétraitement dans Diffusers est prévue pour une future version.
L'exemple ci-dessous montre comment utiliser le pipeline Wan-Animate :
import numpy as np
import torch
from diffusers import AutoencoderKLWan, WanAnimatePipeline
from diffusers.utils import export_to_video, load_image, load_video
model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers"
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32)
pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16)
pipe.to("cuda") # or "mps", "xpu", "cpu"
# Load character image and preprocessed videos
image = load_image("path/to/character.jpg")
pose_video = load_video("path/to/pose_video.mp4") # Preprocessed skeletal keypoints
face_video = load_video("path/to/face_video.mp4") # Preprocessed facial features
# Resize image to match VAE constraints
def aspect_ratio_resize(image, pipe, max_area=720 * 1280):
aspect_ratio = image.height / image.width
mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1]
height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value
width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value
image = image.resize((width, height))
return image, height, width
image, height, width = aspect_ratio_resize(image, pipe)
prompt = "A person dancing energetically in a studio with dynamic lighting and professional camera work"
negative_prompt = "blurry, low quality, distorted, deformed, static, poorly drawn"
# Generate animated video
output = pipe(
image=image,
pose_video=pose_video,
face_video=face_video,
prompt=prompt,
negative_prompt=negative_prompt,
height=height,
width=width,
segment_frame_length=77,
guidance_scale=1.0,
mode="animate", # Animation mode (default)
).frames[0]
export_to_video(output, "animated_character.mp4", fps=30)import numpy as np
import torch
from diffusers import AutoencoderKLWan, WanAnimatePipeline
from diffusers.utils import export_to_video, load_image, load_video
model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers"
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32)
pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16)
pipe.to("cuda") # or "mps", "xpu", "cpu"
# Load all required inputs for replacement mode
image = load_image("path/to/new_character.jpg")
pose_video = load_video("path/to/pose_video.mp4") # Preprocessed skeletal keypoints
face_video = load_video("path/to/face_video.mp4") # Preprocessed facial features
background_video = load_video("path/to/background_video.mp4") # Original scene
mask_video = load_video("path/to/mask_video.mp4") # Black: preserve, White: generate
# Resize image to match video dimensions
def aspect_ratio_resize(image, pipe, max_area=720 * 1280):
aspect_ratio = image.height / image.width
mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1]
height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value
width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value
image = image.resize((width, height))
return image, height, width
image, height, width = aspect_ratio_resize(image, pipe)
prompt = "A person seamlessly integrated into the scene with consistent lighting and environment"
negative_prompt = "blurry, low quality, inconsistent lighting, floating, disconnected from scene"
# Replace character in background video
output = pipe(
image=image,
pose_video=pose_video,
face_video=face_video,
background_video=background_video,
mask_video=mask_video,
prompt=prompt,
negative_prompt=negative_prompt,
height=height,
width=width,
segment_frame_lengths=77,
guidance_scale=1.0,
mode="replace", # Replacement mode
).frames[0]
export_to_video(output, "character_replaced.mp4", fps=30)import numpy as np
import torch
from diffusers import AutoencoderKLWan, WanAnimatePipeline
from diffusers.utils import export_to_video, load_image, load_video
model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers"
vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", dtype=torch.float32)
pipe = WanAnimatePipeline.from_pretrained(model_id, vae=vae, dtype=torch.bfloat16)
pipe.to("cuda") # or "mps", "xpu", "cpu"
image = load_image("path/to/character.jpg")
pose_video = load_video("path/to/pose_video.mp4")
face_video = load_video("path/to/face_video.mp4")
def aspect_ratio_resize(image, pipe, max_area=720 * 1280):
aspect_ratio = image.height / image.width
mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1]
height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value
width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value
image = image.resize((width, height))
return image, height, width
image, height, width = aspect_ratio_resize(image, pipe)
prompt = "A person dancing energetically in a studio"
negative_prompt = "blurry, low quality"
# Advanced: Use temporal guidance and custom callback
def callback_fn(pipe, step_index, timestep, callback_kwargs):
# You can modify latents or other tensors here
print(f"Step {step_index}, Timestep {timestep}")
return callback_kwargs
output = pipe(
image=image,
pose_video=pose_video,
face_video=face_video,
prompt=prompt,
negative_prompt=negative_prompt,
height=height,
width=width,
segment_frame_length=77,
num_inference_steps=50,
guidance_scale=5.0,
prev_segment_conditioning_frames=5, # Use 5 frames for temporal guidance (1 or 5 recommended)
callback_on_step_end=callback_fn,
callback_on_step_end_tensor_inputs=["latents"],
).frames[0]
export_to_video(output, "animated_advanced.mp4", fps=30)Paramètres clés
- mode : Choisissez entre
"animate"(par défaut) ou"replace" - prev_segment_conditioning_frames : Nombre de frames pour le guidage temporel (1 ou 5 recommandé). L'utilisation de 5 offre une meilleure cohérence temporelle mais nécessite plus de mémoire
- guidance_scale : Contrôle dans quelle mesure la sortie suit le prompt texte. Des valeurs plus élevées (5-7) produisent des résultats plus alignés avec le prompt. Pour Wan-Animate, le CFG est désactivé par défaut (
guidance_scale=1.0) mais peut être activé pour prendre en charge les prompts négatifs et un contrôle plus fin des expressions faciales. (Notez que le CFG ne ciblera que le prompt texte et le conditionnement du visage.)
Notes
Wan2.1 prend en charge les LoRA avec load_lora_weights().
Afficher le code d'exemple
# pip install ftfy import torch from diffusers import AutoModel, WanPipeline from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler from diffusers.utils import export_to_video vae = AutoModel.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", subfolder="vae", dtype=torch.float32 ) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", vae=vae, dtype=torch.bfloat16 ) pipeline.scheduler = UniPCMultistepScheduler.from_config( pipeline.scheduler.config, flow_shift=5.0 ) pipeline.to("cuda") # or "mps", "xpu", "cpu" pipeline.load_lora_weights("benjamin-paine/steamboat-willie-1.3b", adapter_name="steamboat-willie") pipeline.set_adapters("steamboat-willie") pipeline.enable_model_cpu_offload() # use "steamboat willie style" to trigger the LoRA prompt = """ steamboat willie style, golden era animation, The camera rushes from far to near in a low-angle shot, revealing a white ferret on a log. It plays, leaps into the water, and emerges, as the camera zooms in for a close-up. Water splashes berry bushes nearby, while moss, snow, and leaves blanket the ground. Birch trees and a light blue sky frame the scene, with ferns in the foreground. Side lighting casts dynamic shadows and warm highlights. Medium composition, front view, low angle, with depth of field. """ output = pipeline( prompt=prompt, num_frames=81, guidance_scale=5.0, ).frames[0] export_to_video(output, "output.mp4", fps=16)WanTransformer3DModel et AutoencoderKLWan prennent en charge le chargement à partir de fichiers uniques via from_single_file().
Afficher le code d'exemple
# pip install ftfy import torch from diffusers import WanPipeline, WanTransformer3DModel, AutoencoderKLWan vae = AutoencoderKLWan.from_single_file( "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/vae/wan_2.1_vae.safetensors" ) transformer = WanTransformer3DModel.from_single_file( "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/blob/main/split_files/diffusion_models/wan2.1_t2v_1.3B_bf16.safetensors", dtype=torch.bfloat16 ) pipeline = WanPipeline.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", vae=vae, transformer=transformer, dtype=torch.bfloat16 )Définissez le dtype de AutoencoderKLWan sur
torch.float32pour une meilleure qualité de décodage.Le nombre d'images par seconde (fps) ou
kdoit être calculé par4 * k + 1.Essayez des valeurs de
shiftplus basses (2.0à5.0) pour les vidéos de faible résolution et des valeurs deshiftplus élevées (7.0à12.0) pour les images de haute résolution.Wan 2.1 et 2.2 prennent en charge l'utilisation de LightX2V LoRAs pour accélérer l'inférence. Leur utilisation sur Wan 2.2 est légèrement plus complexe. Consultez ce fragment de code pour en savoir plus.
Wan 2.2 dispose de deux débruiteurs. Par défaut, les LoRA ne sont chargés que dans le premier débruiteur. Il est possible de définir
load_into_transformer_2=Truepour charger les LoRA dans le second débruiteur. Consultez les exemples celui-ci et celui-là pour en savoir plus.
WanPipeline
classe diffusers.WanPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModelvae: AutoencoderKLWanscheduler: FlowMatchEulerDiscreteSchedulertransformer: diffusers.models.transformers.transformer_wan.WanTransformer3DModel | None = Nonetransformer_2: diffusers.models.transformers.transformer_wan.WanTransformer3DModel | None = Noneboundary_ratio: float | None = Noneexpand_timesteps: bool = False )
Paramètres
- tokenizer (
T5Tokenizer) — Tokenizer issu de T5, plus précisément la variante google/umt5-xxl. - text_encoder (
T5EncoderModel) — T5, plus précisément la variante google/umt5-xxl. - transformer (WanTransformer3DModel) — Transformer conditionnel pour débruyer les latents d’entrée.
- scheduler (UniPCMultistepScheduler) —
Un planificateur à utiliser en combinaison avec
transformerpour débruyer les latents d'image encodés. - vae (AutoencoderKLWan) — Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des vidéos vers et depuis des représentations latentes.
- transformer_2 (WanTransformer3DModel, facultatif) —
Transformer conditionnel utilisé pour débruyer les latents d’entrée pendant l’étape à faible bruit. S’il est fourni, il active
un débruyage en deux étapes où
transformergère les étapes à fort bruit ettransformer_2gère les étapes à faible bruit. S’il n’est pas fourni, seultransformerest utilisé. - boundary_ratio (
float, facultatif, par défautNone) — Ratio des timesteps totaux à utiliser comme limite pour le passage entre les transformers dans le débruitage en deux étapes. Le timestep de limite effectif est calculé commeboundary_ratio * num_train_timesteps. S'il est fourni,transformergère les timesteps >= boundary_timestep ettransformer_2gère les timesteps < boundary_timestep. SiNone, seultransformerest utilisé pour l'ensemble du processus de débruitage.
Pipeline pour la génération de vidéos à partir de texte utilisant Wan.
Ce modèle hérite de DiffusionPipeline. Consultez la documentation de la classe parente pour les méthodes génériques implémentées pour tous les pipelines (téléchargement, sauvegarde, exécution sur un appareil particulier, etc.).
__call__
< source >( prompt: str | list[str] = Nonenegative_prompt: str | list[str] = Noneheight: int = 480width: int = 832num_frames: int = 81num_inference_steps: int = 50guidance_scale: float = 5.0guidance_scale_2: float | None = Nonenum_videos_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'np'return_dict: bool = Trueattention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~WanPipelineOutput or tuple
Paramètres
- prompt (
stroulist[str], facultatif) — Le prompt ou les prompts pour guider la génération d’image. S’il n’est pas défini, passez plutôtprompt_embeds. - negative_prompt (
stroulist[str], facultatif) — Le prompt ou les prompts à éviter lors de la génération d’image. S’il n’est pas défini, passez plutôtnegative_prompt_embeds. Ignoré lorsque le guidage n’est pas utilisé (guidance_scale<1). - height (
int, par défaut480) — La hauteur en pixels de l'image générée. - width (
int, par défaut832) — La largeur en pixels de l'image générée. - num_frames (
int, par défaut81) — Le nombre de frames dans la vidéo générée. - num_inference_steps (
int, par défaut50) — Le nombre d'étapes de débruitage. Un plus grand nombre d'étapes de débruitage conduit généralement à une image de meilleure qualité, au prix d'une inférence plus lente. - guidance_scale (
float, par défaut5.0) — Échelle de guidage telle que définie dans Classifier-Free Diffusion Guidance.guidance_scaleest défini commewde l’équation 2 de Imagen Paper. L’échelle de guidage est activée en définissantguidance_scale > 1. Une échelle de guidage plus élevée encourage la génération d’images étroitement liées auprompttexte, généralement au détriment de la qualité de l’image. - guidance_scale_2 (
float, facultatif, par défautNone) — Échelle de guidage pour le transformer de la phase à faible bruit (transformer_2). SiNoneet que leboundary_ratiodu pipeline n’est pas None, utilise la même valeur queguidance_scale. Utilisé uniquement lorsquetransformer_2et leboundary_ratiodu pipeline ne sont pas None. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Untorch.Generatorpour rendre la génération déterministe. - latents (
torch.Tensor, facultatif) — Latents bruités pré-générés, échantillonnés à partir d’une distribution gaussienne, à utiliser comme entrées pour la génération d’images. Peut servir à ajuster la même génération avec des prompts différents. S’il n’est pas fourni, un tenseur de latents est généré par échantillonnage à l’aide dugeneratoraléatoire fourni. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'ils ne sont pas fournis, lesnegative_prompt_embedssont générés à partir de l'argument d'entréenegative_prompt. - output_type (
str, facultatif, par défaut"np") — Le format de sortie de l'image générée. Choisissez entrePIL.Imageounp.array. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unWanPipelineOutputplutôt qu'un simple tuple. - attention_kwargs (
dict, facultatif) — Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'AttentionProcessordéfini sousself.processordans diffusers.models.attention_processor. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, facultatif) — Une fonction ou une sous-classe dePipelineCallbackouMultiPipelineCallbacksqui est appelée à la fin de chaque étape de débruitage pendant l’inférence, avec les arguments suivants :callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargscontiendra une liste de tous les tenseurs spécifiés parcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, facultatif) — La liste des entrées tensorielles pour la fonctioncallback_on_step_end. Les tenseurs spécifiés dans la liste seront passés en tant qu'argumentcallback_kwargs. Vous ne pourrez inclure que les variables listées dans l'attribut._callback_tensor_inputsde votre classe de pipeline. - max_sequence_length (
int, par défaut512) — La longueur de séquence maximale de l’encodeur de texte. Si le prompt est plus long que cela, il sera tronqué. S’il est plus court, il sera complété jusqu’à cette longueur.
Retourne
~WanPipelineOutput ou tuple
Si return_dict est True, WanPipelineOutput est retourné, sinon un tuple est retourné dont
le premier élément est une liste des images générées et le deuxième élément est une liste de bool
indiquant si l’image générée correspondante contient du contenu « not-safe-for-work » (nsfw).
La fonction d'appel du pipeline pour la génération.
Exemples :
>>> import torch
>>> from diffusers.utils import export_to_video
>>> from diffusers import AutoencoderKLWan, WanPipeline
>>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler
>>> # Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
>>> model_id = "Wan-AI/Wan2.1-T2V-14B-Diffusers"
>>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
>>> pipe = WanPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16)
>>> flow_shift = 5.0 # 5.0 for 720P, 3.0 for 480P
>>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift)
>>> pipe.to("cuda")
>>> prompt = "A cat and a dog baking a cake together in a kitchen. The cat is carefully measuring flour, while the dog is stirring the batter with a wooden spoon. The kitchen is cozy, with sunlight streaming through the window."
>>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
>>> output = pipe(
... prompt=prompt,
... negative_prompt=negative_prompt,
... height=720,
... width=1280,
... num_frames=81,
... guidance_scale=5.0,
... ).frames[0]
>>> export_to_video(output, "output.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
Paramètres
- prompt (
stroulist[str], facultatif) — prompt à encoder - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - do_classifier_free_guidance (
bool, facultatif, valeur par défautTrue) — Indique s'il faut utiliser le classifier free guidance ou non. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Nombre de vidéos à générer par invite. Appareil torch sur lequel placer les embeddings résultants - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, negative_prompt_embeds sera généré à partir de l'argument d'entréenegative_prompt. - device — (
torch.device, facultatif) : torch device - dtype — (
torch.dtype, facultatif) : dtype torch
Encode le prompt dans les états cachés de l'encodeur de texte.
WanImageToVideoPipeline
classe diffusers.WanImageToVideoPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModelvae: AutoencoderKLWanscheduler: FlowMatchEulerDiscreteSchedulerimage_processor: CLIPImageProcessorPil = Noneimage_encoder: CLIPVisionModel = Nonetransformer: WanTransformer3DModel = Nonetransformer_2: WanTransformer3DModel = Noneboundary_ratio: float | None = Noneexpand_timesteps: bool = False )
Paramètres
- tokenizer (
T5Tokenizer) — Tokenizer issu de T5, plus précisément la variante google/umt5-xxl. - text_encoder (
T5EncoderModel) — T5, plus précisément la variante google/umt5-xxl. - image_encoder (
CLIPVisionModel) — CLIP, plus précisément la variante clip-vit-huge-patch14. - transformer (WanTransformer3DModel) — Transformer conditionnel pour débruyer les latents d’entrée.
- scheduler (UniPCMultistepScheduler) —
Un planificateur à utiliser en combinaison avec
transformerpour débruyer les latents d'image encodés. - vae (AutoencoderKLWan) — Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des vidéos vers et depuis des représentations latentes.
- transformer_2 (WanTransformer3DModel, facultatif) —
Transformer conditionnel utilisé pour débruyer les latents d’entrée pendant l’étape à faible bruit. Dans le débruyage en deux étapes,
transformergère les étapes à fort bruit ettransformer_2gère les étapes à faible bruit. S’il n’est pas fourni, seultransformerest utilisé. - boundary_ratio (
float, facultatif, par défautNone) — Ratio des timesteps totaux à utiliser comme limite pour le passage entre les transformers dans le débruitage en deux étapes. Le timestep de limite effectif est calculé commeboundary_ratio * num_train_timesteps. S'il est fourni,transformergère les timesteps >= boundary_timestep ettransformer_2gère les timesteps < boundary_timestep. SiNone, seultransformerest utilisé pour l'ensemble du processus de débruitage.
Pipeline pour la génération de vidéos à partir d’images utilisant Wan.
Ce modèle hérite de DiffusionPipeline. Consultez la documentation de la classe parente pour les méthodes génériques implémentées pour tous les pipelines (téléchargement, sauvegarde, exécution sur un appareil particulier, etc.).
__call__
< source >( image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]prompt: str | list[str] = Nonenegative_prompt: str | list[str] = Noneheight: int = 480width: int = 832num_frames: int = 81num_inference_steps: int = 50guidance_scale: float = 5.0guidance_scale_2: float | None = Nonenum_videos_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneimage_embeds: typing.Optional[torch.Tensor] = Nonelast_image: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'np'return_dict: bool = Trueattention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~WanPipelineOutput or tuple
Paramètres
- image (
PipelineImageInput) — L'image d'entrée sur laquelle conditionner la génération. Doit être une image, une liste d'images ou untorch.Tensor. - last_image (
torch.Tensor, optional) — Optional last frame to condition the generated video on. When provided, the model interpolates betweenimage(first frame) andlast_image(last frame). - prompt (
stroulist[str], facultatif) — Le prompt ou les prompts pour guider la génération d’image. S’il n’est pas défini, il faut passerprompt_embedsà la place. - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - height (
int, par défaut480) — La hauteur de la vidéo générée. - width (
int, par défaut832) — La largeur de la vidéo générée. - num_frames (
int, par défaut81) — Le nombre de frames dans la vidéo générée. - num_inference_steps (
int, par défaut50) — Le nombre d'étapes de débruitage. Un plus grand nombre d'étapes de débruitage conduit généralement à une image de meilleure qualité, au prix d'une inférence plus lente. - guidance_scale (
float, par défaut5.0) — Échelle de guidage telle que définie dans Classifier-Free Diffusion Guidance.guidance_scaleest défini commewde l’équation 2 de Imagen Paper. L’échelle de guidage est activée en définissantguidance_scale > 1. Une échelle de guidage plus élevée encourage la génération d’images étroitement liées auprompttexte, généralement au détriment de la qualité de l’image. - guidance_scale_2 (
float, facultatif, par défautNone) — Échelle de guidage pour le transformer de la phase à faible bruit (transformer_2). SiNoneet que leboundary_ratiodu pipeline n’est pas None, utilise la même valeur queguidance_scale. Utilisé uniquement lorsquetransformer_2et leboundary_ratiodu pipeline ne sont pas None. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Untorch.Generatorpour rendre la génération déterministe. - latents (
torch.Tensor, facultatif) — Latents bruités pré-générés, échantillonnés à partir d’une distribution gaussienne, à utiliser comme entrées pour la génération d’images. Peut servir à ajuster la même génération avec des prompts différents. S’il n’est pas fourni, un tenseur de latents est généré par échantillonnage à l’aide dugeneratoraléatoire fourni. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréenegative_prompt. - image_embeds (
torch.Tensor, facultatif) — Embeddings d’image pré-générés. Peut être utilisé pour ajuster facilement les entrées d’image (pondération). S’ils ne sont pas fournis, les embeddings d’image sont générés à partir de l’argument d’entréeimage. - output_type (
str, facultatif, par défaut"np") — Le format de sortie de l'image générée. Choisissez entrePIL.Imageounp.array. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unWanPipelineOutputplutôt qu'un simple tuple. - attention_kwargs (
dict, facultatif) — Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'AttentionProcessordéfini sousself.processordans diffusers.models.attention_processor. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, facultatif) — Une fonction ou une sous-classe dePipelineCallbackouMultiPipelineCallbacksqui est appelée à la fin de chaque étape de débruitage pendant l’inférence, avec les arguments suivants :callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargscontiendra une liste de tous les tenseurs spécifiés parcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, facultatif) — La liste des entrées tensorielles pour la fonctioncallback_on_step_end. Les tenseurs spécifiés dans la liste seront passés en tant qu'argumentcallback_kwargs. Vous ne pourrez inclure que les variables listées dans l'attribut._callback_tensor_inputsde votre classe de pipeline. - max_sequence_length (
int, par défaut512) — La longueur de séquence maximale de l’encodeur de texte. Si le prompt est plus long que cela, il sera tronqué. S’il est plus court, il sera complété jusqu’à cette longueur.
Retourne
~WanPipelineOutput ou tuple
Si return_dict est True, WanPipelineOutput est retourné, sinon un tuple est retourné dont
le premier élément est une liste des images générées et le deuxième élément est une liste de bool
indiquant si l’image générée correspondante contient du contenu « not-safe-for-work » (nsfw).
La fonction d'appel du pipeline pour la génération.
Exemples :
>>> import torch
>>> import numpy as np
>>> from diffusers import AutoencoderKLWan, WanImageToVideoPipeline
>>> from diffusers.utils import export_to_video, load_image
>>> from transformers import CLIPVisionModel
>>> # Available models: Wan-AI/Wan2.1-I2V-14B-480P-Diffusers, Wan-AI/Wan2.1-I2V-14B-720P-Diffusers
>>> model_id = "Wan-AI/Wan2.1-I2V-14B-480P-Diffusers"
>>> image_encoder = CLIPVisionModel.from_pretrained(
... model_id, subfolder="image_encoder", torch_dtype=torch.float32
... )
>>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
>>> pipe = WanImageToVideoPipeline.from_pretrained(
... model_id, vae=vae, image_encoder=image_encoder, torch_dtype=torch.bfloat16
... )
>>> pipe.to("cuda")
>>> image = load_image(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg"
... )
>>> max_area = 480 * 832
>>> aspect_ratio = image.height / image.width
>>> mod_value = pipe.vae_scale_factor_spatial * pipe.transformer.config.patch_size[1]
>>> height = round(np.sqrt(max_area * aspect_ratio)) // mod_value * mod_value
>>> width = round(np.sqrt(max_area / aspect_ratio)) // mod_value * mod_value
>>> image = image.resize((width, height))
>>> prompt = (
... "An astronaut hatching from an egg, on the surface of the moon, the darkness and depth of space realised in "
... "the background. High quality, ultrarealistic detail and breath-taking movie-like camera shot."
... )
>>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
>>> output = pipe(
... image=image,
... prompt=prompt,
... negative_prompt=negative_prompt,
... height=height,
... width=width,
... num_frames=81,
... guidance_scale=5.0,
... ).frames[0]
>>> export_to_video(output, "output.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
Paramètres
- prompt (
stroulist[str], facultatif) — prompt à encoder - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - do_classifier_free_guidance (
bool, facultatif, valeur par défautTrue) — Indique s'il faut utiliser le classifier free guidance ou non. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Nombre de vidéos à générer par invite. Appareil torch sur lequel placer les embeddings résultants - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, negative_prompt_embeds sera généré à partir de l'argument d'entréenegative_prompt. - device — (
torch.device, facultatif) : torch device - dtype — (
torch.dtype, facultatif) : dtype torch
Encode le prompt dans les états cachés de l'encodeur de texte.
WanVACEPipeline
classe diffusers.WanVACEPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModelvae: AutoencoderKLWanscheduler: FlowMatchEulerDiscreteSchedulertransformer: WanVACETransformer3DModel = Nonetransformer_2: WanVACETransformer3DModel = Noneboundary_ratio: float | None = None )
Paramètres
- tokenizer (
T5Tokenizer) — Tokenizer issu de T5, plus précisément la variante google/umt5-xxl. - text_encoder (
T5EncoderModel) — T5, plus précisément la variante google/umt5-xxl. - vae (AutoencoderKLWan) — Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des vidéos vers et depuis des représentations latentes.
- scheduler (UniPCMultistepScheduler) —
Un planificateur à utiliser en combinaison avec
transformerpour débruyer les latents d'image encodés. - transformer (
WanVACETransformer3DModel, facultatif) — Transformer conditionnel pour débruyer les latents d’entrée pendant l’étape à bruit élevé. Dans le débruyage en deux étapes,transformergère les étapes à bruit élevé ettransformer_2gère les étapes à bruit faible. Au moins l’un destransformeroutransformer_2doit être fourni. - transformer_2 (
WanVACETransformer3DModel, facultatif) — Transformer conditionnel pour débruyer les latents d’entrée pendant l’étape à faible bruit. Dans le débruyage en deux étapes,transformergère les étapes à fort bruit ettransformer_2gère les étapes à faible bruit. Au moins l’un destransformeroutransformer_2doit être fourni. - boundary_ratio (
float, facultatif, par défautNone) — Ratio des timesteps totaux à utiliser comme limite pour le passage entre les transformers dans le débruitage en deux étapes. Le timestep de limite effectif est calculé commeboundary_ratio * num_train_timesteps. S'il est fourni,transformergère les timesteps >= boundary_timestep ettransformer_2gère les timesteps < boundary_timestep. SiNone, seul le transformer disponible est utilisé pour l'ensemble du processus de débruitage.
Pipeline pour la génération contrôlable à l'aide de Wan.
Ce modèle hérite de DiffusionPipeline. Consultez la documentation de la classe parente pour les méthodes génériques implémentées pour tous les pipelines (téléchargement, sauvegarde, exécution sur un appareil particulier, etc.).
__call__
< source >( prompt: str | list[str] = Nonenegative_prompt: str | list[str] = Nonevideo: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = Nonemask: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = Nonereference_images: list[typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]] | None = Noneconditioning_scale: typing.Union[float, list[float], torch.Tensor] = 1.0height: int = 480width: int = 832num_frames: int = 81num_inference_steps: int = 50guidance_scale: float = 5.0guidance_scale_2: float | None = Nonenum_videos_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'np'return_dict: bool = Trueattention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~WanPipelineOutput or tuple
Paramètres
- prompt (
stroulist[str], facultatif) — Le prompt ou les prompts pour guider la génération d’image. S’il n’est pas défini, il faut passerprompt_embedsà la place. - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - video (
list[PIL.Image.Image], facultatif) — La vidéo ou les vidéos d'entrée à utiliser comme point de départ pour la génération. La vidéo doit être une liste d'images PIL, un tableau numpy ou un tenseur torch. Actuellement, le pipeline ne prend en charge la génération que d'une seule vidéo à la fois. - mask (
list[PIL.Image.Image], facultatif) — Le masque d’entrée définit les régions de la vidéo sur lesquelles conditionner et celles à générer. Les zones noires du masque indiquent les régions de conditionnement, tandis que les zones blanches indiquent les régions de génération. Le masque doit être une liste d’images PIL, un tableau numpy ou un tenseur torch. Prend actuellement en charge la génération d’une seule vidéo à la fois. - reference_images (
list[PIL.Image.Image], facultatif) — Une liste d’une ou plusieurs images de référence servant de conditionnement supplémentaire pour la génération. Par exemple, si vous souhaitez réparer une vidéo pour changer de personnage, vous pouvez transmettre ici des images de référence du nouveau personnage. Consultez les exemples de Diffusers et le guide utilisateur original pour la liste complète des tâches et cas d’usage pris en charge. - conditioning_scale (
float,list[float],torch.Tensor, par défaut1.0) — L'échelle de conditionnement à appliquer lors de l'ajout du flux latent de conditionnement de contrôle au flux latent de débruitage dans chaque couche de contrôle du modèle. Si une valeur flottante est fournie, elle sera appliquée uniformément à toutes les couches. Si une liste ou un tenseur est fourni, il doit avoir la même longueur que le nombre de couches de contrôle du modèle (len(transformer.config.vace_layers)). - height (
int, par défaut480) — La hauteur en pixels de l'image générée. - width (
int, par défaut832) — La largeur en pixels de l'image générée. - num_frames (
int, par défaut81) — Le nombre de frames dans la vidéo générée. - num_inference_steps (
int, par défaut50) — Le nombre d'étapes de débruitage. Un plus grand nombre d'étapes de débruitage conduit généralement à une image de meilleure qualité, au prix d'une inférence plus lente. - guidance_scale (
float, par défaut5.0) — Échelle de guidage telle que définie dans Classifier-Free Diffusion Guidance.guidance_scaleest défini commewde l’équation 2 de Imagen Paper. L’échelle de guidage est activée en définissantguidance_scale > 1. Une échelle de guidage plus élevée encourage la génération d’images étroitement liées auprompttexte, généralement au détriment de la qualité de l’image. - guidance_scale_2 (
float, facultatif, par défautNone) — Échelle de guidage pour le transformer de la phase à faible bruit (transformer_2). SiNoneet que leboundary_ratiodu pipeline n’est pas None, utilise la même valeur queguidance_scale. Utilisé uniquement lorsquetransformer_2et leboundary_ratiodu pipeline ne sont pas None. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Untorch.Generatorpour rendre la génération déterministe. - latents (
torch.Tensor, facultatif) — Latents bruités pré-générés, échantillonnés à partir d’une distribution gaussienne, à utiliser comme entrées pour la génération d’images. Peut servir à ajuster la même génération avec des prompts différents. S’il n’est pas fourni, un tenseur de latents est généré par échantillonnage à l’aide dugeneratoraléatoire fourni. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'ils ne sont pas fournis, lesnegative_prompt_embedssont générés à partir de l'argument d'entréenegative_prompt. - output_type (
str, facultatif, par défaut"np") — Le format de sortie de l'image générée. Choisissez entrePIL.Imageounp.array. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unWanPipelineOutputplutôt qu'un simple tuple. - attention_kwargs (
dict, facultatif) — Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'AttentionProcessordéfini sousself.processordans diffusers.models.attention_processor. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, facultatif) — Une fonction ou une sous-classe dePipelineCallbackouMultiPipelineCallbacksqui est appelée à la fin de chaque étape de débruitage pendant l’inférence, avec les arguments suivants :callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargscontiendra une liste de tous les tenseurs spécifiés parcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, facultatif) — La liste des entrées tensorielles pour la fonctioncallback_on_step_end. Les tenseurs spécifiés dans la liste seront passés en tant qu'argumentcallback_kwargs. Vous ne pourrez inclure que les variables listées dans l'attribut._callback_tensor_inputsde votre classe de pipeline. - max_sequence_length (
int, par défaut512) — La longueur de séquence maximale de l’encodeur de texte. Si le prompt est plus long que cela, il sera tronqué. S’il est plus court, il sera complété jusqu’à cette longueur.
Retourne
~WanPipelineOutput ou tuple
Si return_dict est True, WanPipelineOutput est retourné, sinon un tuple est retourné dont
le premier élément est une liste des images générées et le deuxième élément est une liste de bool
indiquant si l’image générée correspondante contient du contenu « not-safe-for-work » (nsfw).
La fonction d'appel du pipeline pour la génération.
Exemples :
>>> import torch
>>> import PIL.Image
>>> from diffusers import AutoencoderKLWan, WanVACEPipeline
>>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler
>>> from diffusers.utils import export_to_video, load_image
def prepare_video_and_mask(first_img: PIL.Image.Image, last_img: PIL.Image.Image, height: int, width: int, num_frames: int):
first_img = first_img.resize((width, height))
last_img = last_img.resize((width, height))
frames = []
frames.append(first_img)
# Ideally, this should be 127.5 to match original code, but they perform computation on numpy arrays
# whereas we are passing PIL images. If you choose to pass numpy arrays, you can set it to 127.5 to
# match the original code.
frames.extend([PIL.Image.new("RGB", (width, height), (128, 128, 128))] * (num_frames - 2))
frames.append(last_img)
mask_black = PIL.Image.new("L", (width, height), 0)
mask_white = PIL.Image.new("L", (width, height), 255)
mask = [mask_black, *[mask_white] * (num_frames - 2), mask_black]
return frames, mask
>>> # Available checkpoints: Wan-AI/Wan2.1-VACE-1.3B-diffusers, Wan-AI/Wan2.1-VACE-14B-diffusers
>>> model_id = "Wan-AI/Wan2.1-VACE-1.3B-diffusers"
>>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
>>> pipe = WanVACEPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16)
>>> flow_shift = 3.0 # 5.0 for 720P, 3.0 for 480P
>>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift)
>>> pipe.to("cuda")
>>> prompt = "CG animation style, a small blue bird takes off from the ground, flapping its wings. The bird's feathers are delicate, with a unique pattern on its chest. The background shows a blue sky with white clouds under bright sunshine. The camera follows the bird upward, capturing its flight and the vastness of the sky from a close-up, low-angle perspective."
>>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
>>> first_frame = load_image(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_first_frame.png"
... )
>>> last_frame = load_image(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/flf2v_input_last_frame.png>>> "
... )
>>> height = 512
>>> width = 512
>>> num_frames = 81
>>> video, mask = prepare_video_and_mask(first_frame, last_frame, height, width, num_frames)
>>> output = pipe(
... video=video,
... mask=mask,
... prompt=prompt,
... negative_prompt=negative_prompt,
... height=height,
... width=width,
... num_frames=num_frames,
... num_inference_steps=30,
... guidance_scale=5.0,
... generator=torch.Generator().manual_seed(42),
... ).frames[0]
>>> export_to_video(output, "output.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
Paramètres
- prompt (
stroulist[str], facultatif) — prompt à encoder - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - do_classifier_free_guidance (
bool, facultatif, valeur par défautTrue) — Indique s'il faut utiliser le classifier free guidance ou non. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Nombre de vidéos à générer par invite. Appareil torch sur lequel placer les embeddings résultants - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, negative_prompt_embeds sera généré à partir de l'argument d'entréenegative_prompt. - device — (
torch.device, facultatif) : torch device - dtype — (
torch.dtype, facultatif) : dtype torch
Encode le prompt dans les états cachés de l'encodeur de texte.
WanVideoToVideoPipeline
classe diffusers.WanVideoToVideoPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModeltransformer: WanTransformer3DModelvae: AutoencoderKLWanscheduler: FlowMatchEulerDiscreteScheduler )
Paramètres
- tokenizer (
T5Tokenizer) — Tokenizer issu de T5, plus précisément la variante google/umt5-xxl. - text_encoder (
T5EncoderModel) — T5, plus précisément la variante google/umt5-xxl. - transformer (WanTransformer3DModel) — Transformer conditionnel pour débruyer les latents d’entrée.
- scheduler (UniPCMultistepScheduler) —
Un planificateur à utiliser en combinaison avec
transformerpour débruyer les latents d'image encodés. - vae (AutoencoderKLWan) — Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des vidéos vers et depuis des représentations latentes.
Pipeline pour la génération vidéo-à-vidéo utilisant Wan.
Ce modèle hérite de DiffusionPipeline. Consultez la documentation de la classe parente pour les méthodes génériques implémentées pour tous les pipelines (téléchargement, sauvegarde, exécution sur un appareil particulier, etc.).
__call__
< source >( video: list[PIL.Image.Image] = Noneprompt: str | list[str] = Nonenegative_prompt: str | list[str] = Noneheight: int = 480width: int = 832num_inference_steps: int = 50timesteps: list[int] | None = Noneguidance_scale: float = 5.0strength: float = 0.8num_videos_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'np'return_dict: bool = Trueattention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~WanPipelineOutput or tuple
Paramètres
- video (
list[PIL.Image.Image]) — La vidéo d’entrée utilisée comme point de départ pour la génération vidéo-à-vidéo. La vidéo doit être fournie sous forme de liste d’images PIL, de tableau numpy ou de tenseur torch. - prompt (
stroulist[str], facultatif) — Le prompt ou les prompts pour guider la génération d’image. S’il n’est pas défini, il faut passerprompt_embedsà la place. - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - height (
int, par défaut480) — La hauteur en pixels de l'image générée. - width (
int, par défaut832) — La largeur en pixels de l'image générée. - num_inference_steps (
int, par défaut50) — Le nombre d'étapes de débruitage. Un plus grand nombre d'étapes de débruitage conduit généralement à une image de meilleure qualité, au prix d'une inférence plus lente. - timesteps (
list[int], facultatif) — Timesteps personnalisés à utiliser pour le processus de débruitage avec les planificateurs qui prennent en charge un argumenttimestepsdans leur méthodeset_timesteps. S'il n'est pas défini, le comportement par défaut lorsquenum_inference_stepsest passé sera utilisé. Doit être dans l'ordre décroissant. - guidance_scale (
float, par défaut5.0) — Échelle de guidage telle que définie dans Classifier-Free Diffusion Guidance.guidance_scaleest défini commewde l’équation 2 de Imagen Paper. L’échelle de guidage est activée en définissantguidance_scale > 1. Une échelle de guidage plus élevée encourage la génération d’images étroitement liées auprompttexte, généralement au détriment de la qualité de l’image. - strength (
float, par défaut0.8) — Une valeur de strength plus élevée entraîne de plus grandes différences entre l'image d'origine et la vidéo générée. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Untorch.Generatorpour rendre la génération déterministe. - latents (
torch.Tensor, facultatif) — Latents bruités pré-générés, échantillonnés à partir d’une distribution gaussienne, à utiliser comme entrées pour la génération d’images. Peut servir à ajuster la même génération avec des prompts différents. S’il n’est pas fourni, un tenseur de latents est généré par échantillonnage à l’aide dugeneratoraléatoire fourni. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'ils ne sont pas fournis, lesnegative_prompt_embedssont générés à partir de l'argument d'entréenegative_prompt. - output_type (
str, facultatif, par défaut"np") — Le format de sortie de l'image générée. Choisissez entrePIL.Imageounp.array. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unWanPipelineOutputplutôt qu'un simple tuple. - attention_kwargs (
dict, facultatif) — Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'AttentionProcessordéfini sousself.processordans diffusers.models.attention_processor. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, facultatif) — Une fonction ou une sous-classe dePipelineCallbackouMultiPipelineCallbacksqui est appelée à la fin de chaque étape de débruitage pendant l’inférence, avec les arguments suivants :callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargscontiendra une liste de tous les tenseurs spécifiés parcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, facultatif) — La liste des entrées tensorielles pour la fonctioncallback_on_step_end. Les tenseurs spécifiés dans la liste seront passés en tant qu'argumentcallback_kwargs. Vous ne pourrez inclure que les variables listées dans l'attribut._callback_tensor_inputsde votre classe de pipeline. - max_sequence_length (
int, par défaut512) — La longueur de séquence maximale de l’encodeur de texte. Si le prompt est plus long que cela, il sera tronqué. S’il est plus court, il sera complété jusqu’à cette longueur.
Retourne
~WanPipelineOutput ou tuple
Si return_dict est True, WanPipelineOutput est retourné, sinon un tuple est retourné dont
le premier élément est une liste des images générées et le deuxième élément est une liste de bool
indiquant si l’image générée correspondante contient du contenu « not-safe-for-work » (nsfw).
La fonction d'appel du pipeline pour la génération.
Exemples :
>>> import torch
>>> from diffusers.utils import export_to_video, load_video
>>> from diffusers import AutoencoderKLWan, WanVideoToVideoPipeline
>>> from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler
>>> # Available models: Wan-AI/Wan2.1-T2V-14B-Diffusers, Wan-AI/Wan2.1-T2V-1.3B-Diffusers
>>> model_id = "Wan-AI/Wan2.1-T2V-1.3B-Diffusers"
>>> vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae", torch_dtype=torch.float32)
>>> pipe = WanVideoToVideoPipeline.from_pretrained(model_id, vae=vae, torch_dtype=torch.bfloat16)
>>> flow_shift = 3.0 # 5.0 for 720P, 3.0 for 480P
>>> pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=flow_shift)
>>> pipe.to("cuda")
>>> prompt = "A robot standing on a mountain top. The sun is setting in the background"
>>> negative_prompt = "Bright tones, overexposed, static, blurred details, subtitles, style, works, paintings, images, static, overall gray, worst quality, low quality, JPEG compression residue, ugly, incomplete, extra fingers, poorly drawn hands, poorly drawn faces, deformed, disfigured, misshapen limbs, fused fingers, still picture, messy background, three legs, many people in the background, walking backwards"
>>> video = load_video(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/hiker.mp4"
... )
>>> output = pipe(
... video=video,
... prompt=prompt,
... negative_prompt=negative_prompt,
... height=480,
... width=720,
... guidance_scale=5.0,
... strength=0.7,
... ).frames[0]
>>> export_to_video(output, "output.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
Paramètres
- prompt (
stroulist[str], facultatif) — prompt à encoder - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - do_classifier_free_guidance (
bool, facultatif, valeur par défautTrue) — Indique s'il faut utiliser le classifier free guidance ou non. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Nombre de vidéos à générer par invite. Appareil torch sur lequel placer les embeddings résultants - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, negative_prompt_embeds sera généré à partir de l'argument d'entréenegative_prompt. - device — (
torch.device, facultatif) : torch device - dtype — (
torch.dtype, facultatif) : dtype torch
Encode le prompt dans les états cachés de l'encodeur de texte.
WanAnimatePipeline
classe diffusers.WanAnimatePipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModelvae: AutoencoderKLWanscheduler: UniPCMultistepSchedulerimage_processor: CLIPImageProcessorPilimage_encoder: CLIPVisionModeltransformer: WanAnimateTransformer3DModel )
Paramètres
- tokenizer (
T5Tokenizer) — Tokenizer issu de T5, plus précisément la variante google/umt5-xxl. - text_encoder (
T5EncoderModel) — T5, plus précisément la variante google/umt5-xxl. - image_encoder (
CLIPVisionModel) — CLIP, plus précisément la variante clip-vit-huge-patch14. - transformer (WanAnimateTransformer3DModel) — Transformer conditionnel pour débruyer les latents d'entrée.
- scheduler (UniPCMultistepScheduler) —
Un planificateur à utiliser en combinaison avec
transformerpour débruyer les latents d'image encodés. - vae (AutoencoderKLWan) — Modèle de Variational Auto-Encoder (VAE) pour encoder et décoder des vidéos vers et depuis des représentations latentes.
- image_processor (
CLIPImageProcessor) — Processeur d'images pour la prétraitement des images avant encodage.
Pipeline pour l'animation et le remplacement unifiés de personnages à l'aide de Wan-Animate.
WanAnimatePipeline prend en entrée une image de personnage, une vidéo de pose et une vidéo de visage, et génère une vidéo dans deux
Mode animation : le modèle génère une vidéo de l'image du personnage qui imite le mouvement humain des vidéos d'entrée de pose et de visage. Le personnage est animé en fonction des contrôles de mouvement fournis, créant ainsi une nouvelle vidéo animée du personnage.
Mode de remplacement : le modèle remplace un personnage dans une vidéo d'arrière-plan par l'image de personnage fournie, en utilisant les vidéos de pose et de visage pour le contrôle du mouvement. Ce mode nécessite des entrées supplémentaires
background_videoetmask_video. La vidéo de masque doit contenir des zones noires là où le contenu d'origine doit être conservé et des zones blanches là où le nouveau personnage doit être généré.
Ce modèle hérite de DiffusionPipeline. Consultez la documentation de la classe parente pour les méthodes génériques implémentées pour tous les pipelines (téléchargement, sauvegarde, exécution sur un appareil particulier, etc.).
Le pipeline hérite également des méthodes de chargement suivantes :
- load_lora_weights() pour charger les poids LoRA
__call__
< source >( image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]pose_video: list[PIL.Image.Image]face_video: list[PIL.Image.Image]background_video: list[PIL.Image.Image] | None = Nonemask_video: list[PIL.Image.Image] | None = Noneprompt: str | list[str] = Nonenegative_prompt: str | list[str] = Noneheight: int = 720width: int = 1280segment_frame_length: int = 77num_inference_steps: int = 20mode: str = 'animate'prev_segment_conditioning_frames: int = 1motion_encode_batch_size: int | None = Noneguidance_scale: float = 1.0num_videos_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneimage_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'np'return_dict: bool = Trueattention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Optional[typing.Callable[[int, int, NoneType], diffusers.callbacks.PipelineCallback | diffusers.callbacks.MultiPipelineCallbacks]] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~WanPipelineOutput or tuple
Paramètres
- image (
PipelineImageInput) — L'image de caractères d'entrée sur laquelle conditionner la génération. Doit être une image, une liste d'images ou untorch.Tensor. - pose_video (
list[PIL.Image.Image]) — La vidéo de pose d'entrée pour conditionner la génération. Doit être une liste d'images PIL. - face_video (
list[PIL.Image.Image]) — La vidéo faciale d'entrée sur laquelle conditionner la génération. Doit être une liste d'images PIL. - background_video (
list[PIL.Image.Image], facultatif) — Lorsque le mode est"replace", la vidéo d'arrière-plan d'entrée sur laquelle conditionner la génération. Doit être une liste d'images PIL. - mask_video (
list[PIL.Image.Image], facultatif) — Lorsque le mode est"replace", la vidéo de masque d'entrée pour conditionner la génération. Doit être une liste d'images PIL. - prompt (
stroulist[str], facultatif) — Le prompt ou les prompts pour guider la génération d’image. S’il n’est pas défini, il faut passerprompt_embedsà la place. - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - mode (
str, par défaut"animation") — Le mode de génération. Choisissez entre"animate"et"replace". - prev_segment_conditioning_frames (
int, par défaut1) — Le nombre de frames du segment vidéo précédent à utiliser pour le guidage temporel. Il est recommandé de le définir à 1 ou 5. En général, il doit être de la forme 4N + 1, où N est un entier non négatif. - motion_encode_batch_size (
int, facultatif) — La taille de lot pour l'encodage par lots de la vidéo du visage via l'encodeur de mouvement. Cela permet de compenser la vitesse d'inférence par une réduction de l'utilisation de la mémoire en définissant une taille de lot plus petite. Par défaut, la valeur estself.transformer.config.motion_encoder_batch_sizesi elle n'est pas définie. - height (
int, par défaut720) — La hauteur de la vidéo générée. - width (
int, par défaut1280) — La largeur de la vidéo générée. - segment_frame_length (
int, par défaut77) — Le nombre de frames dans chaque segment de vidéo généré. Le nombre total de frames de la vidéo générée sera égal au nombre de frames depose_video; la vidéo sera générée par segments jusqu’à atteindre cette longueur. En général, cette valeur doit être de la forme 4N + 1, où N est un entier non négatif. - num_inference_steps (
int, par défaut20) — Le nombre d'étapes de débruitage. Un plus grand nombre d'étapes de débruitage conduit généralement à une image de meilleure qualité, au prix d'une inférence plus lente. - guidance_scale (
float, par défaut1.0) — Échelle de guidage telle que définie dans Classifier-Free Diffusion Guidance.guidance_scaleest défini commewde l’équation 2 de Imagen Paper. L’échelle de guidage est activée en définissantguidance_scale > 1. Une échelle de guidage plus élevée encourage la génération d’images étroitement liées au texteprompt, généralement au détriment de la qualité de l’image. Par défaut, CFG n’est pas utilisé lors de l’inférence de Wan Animate. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Le nombre d'images à générer par invite. - generator (
torch.Generatoroulist[torch.Generator], facultatif) — Untorch.Generatorpour rendre la génération déterministe. - latents (
torch.Tensor, facultatif) — Latents bruités pré-générés, échantillonnés à partir d’une distribution gaussienne, à utiliser comme entrées pour la génération d’images. Peut servir à ajuster la même génération avec des prompts différents. S’il n’est pas fourni, un tenseur de latents est généré par échantillonnage à l’aide dugeneratoraléatoire fourni. - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte (pondération des prompts). S'il n'est pas fourni, les embeddings de texte sont générés à partir de l'argument d'entréenegative_prompt. - image_embeds (
torch.Tensor, facultatif) — Embeddings d’image pré-générés. Peut être utilisé pour ajuster facilement les entrées d’image (pondération). S’ils ne sont pas fournis, les embeddings d’image sont générés à partir de l’argument d’entréeimage. - output_type (
str, facultatif, par défaut"np") — Le format de sortie de l'image générée. Choisissez entrePIL.Imageounp.array. - return_dict (
bool, facultatif, par défautTrue) — Indique s'il faut retourner unWanPipelineOutputplutôt qu'un simple tuple. - attention_kwargs (
dict, facultatif) — Un dictionnaire de kwargs qui, s'il est spécifié, est transmis à l'AttentionProcessordéfini sousself.processordans diffusers.models.attention_processor. - callback_on_step_end (
Callable,PipelineCallback,MultiPipelineCallbacks, facultatif) — Une fonction ou une sous-classe dePipelineCallbackouMultiPipelineCallbacksqui est appelée à la fin de chaque étape de débruitage pendant l’inférence, avec les arguments suivants :callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargscontiendra une liste de tous les tenseurs spécifiés parcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
List, facultatif) — La liste des entrées tensorielles pour la fonctioncallback_on_step_end. Les tenseurs spécifiés dans la liste seront passés en tant qu'argumentcallback_kwargs. Vous ne pourrez inclure que les variables listées dans l'attribut._callback_tensor_inputsde votre classe de pipeline. - max_sequence_length (
int, par défaut512) — La longueur de séquence maximale de l’encodeur de texte. Si le prompt est plus long que cela, il sera tronqué. S’il est plus court, il sera complété jusqu’à cette longueur.
Retourne
~WanPipelineOutput ou tuple
Si return_dict est True, WanPipelineOutput est retourné, sinon un tuple est retourné dont
le premier élément est une liste des images générées et le deuxième élément est une liste de bool
indiquant si l’image générée correspondante contient du contenu « not-safe-for-work » (nsfw).
La fonction d'appel du pipeline pour la génération.
Exemples :
>>> import torch
>>> import numpy as np
>>> from diffusers import WanAnimatePipeline
>>> from diffusers.utils import export_to_video, load_image, load_video
>>> model_id = "Wan-AI/Wan2.2-Animate-14B-Diffusers"
>>> pipe = WanAnimatePipeline.from_pretrained(model_id, torch_dtype=torch.bfloat16)
>>> # Optionally upcast the Wan VAE to FP32
>>> pipe.vae.to(torch.float32)
>>> pipe.to("cuda")
>>> # Load the reference character image
>>> image = load_image(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/astronaut.jpg"
... )
>>> # Load pose and face videos (preprocessed from reference video)
>>> # Note: Videos should be preprocessed to extract pose keypoints and face features
>>> # Refer to the Wan-Animate preprocessing documentation for details
>>> pose_video = load_video("path/to/pose_video.mp4")
>>> face_video = load_video("path/to/face_video.mp4")
>>> # CFG is generally not used for Wan Animate
>>> prompt = (
... "An astronaut hatching from an egg, on the surface of the moon, the darkness and depth of space realised in "
... "the background. High quality, ultrarealistic detail and breath-taking movie-like camera shot."
... )
>>> # Animation mode: Animate the character with the motion from pose/face videos
>>> output = pipe(
... image=image,
... pose_video=pose_video,
... face_video=face_video,
... prompt=prompt,
... height=height,
... width=width,
... segment_frame_length=77, # Frame length of each inference segment
... guidance_scale=1.0,
... num_inference_steps=20,
... mode="animate",
... ).frames[0]
>>> export_to_video(output, "output_animation.mp4", fps=30)
>>> # Replacement mode: Replace a character in the background video
>>> # Requires additional background_video and mask_video inputs
>>> background_video = load_video("path/to/background_video.mp4")
>>> mask_video = load_video("path/to/mask_video.mp4") # Black areas preserved, white areas generated
>>> output = pipe(
... image=image,
... pose_video=pose_video,
... face_video=face_video,
... background_video=background_video,
... mask_video=mask_video,
... prompt=prompt,
... height=height,
... width=width,
... segment_frame_length=77, # Frame length of each inference segment
... guidance_scale=1.0,
... num_inference_steps=20,
... mode="replace",
... ).frames[0]
>>> export_to_video(output, "output_replacement.mp4", fps=30)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
Paramètres
- prompt (
stroulist[str], facultatif) — prompt à encoder - negative_prompt (
stroulist[str], facultatif) — Le ou les prompts à ne pas utiliser pour guider la génération d’image. S’il n’est pas défini, il faut passernegative_prompt_embedsà la place. Ignoré lorsque le guidage n’est pas utilisé (c’est-à-dire ignoré siguidance_scaleest inférieur à1). - do_classifier_free_guidance (
bool, facultatif, valeur par défautTrue) — Indique s'il faut utiliser le classifier free guidance ou non. - num_videos_per_prompt (
int, facultatif, valeur par défaut 1) — Nombre de vidéos à générer par invite. Appareil torch sur lequel placer les embeddings résultants - prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, les embeddings de texte seront générés à partir de l'argument d'entréeprompt. - negative_prompt_embeds (
torch.Tensor, facultatif) — Embeddings de texte négatifs pré-générés. Peut être utilisé pour ajuster facilement les entrées de texte, par ex. le pondération des prompts. S'il n'est pas fourni, negative_prompt_embeds sera généré à partir de l'argument d'entréenegative_prompt. - device — (
torch.device, facultatif) : torch device - dtype — (
torch.dtype, facultatif) : dtype torch
Encode le prompt dans les états cachés de l'encodeur de texte.
Remplit un tableau de type vidéo frames jusqu'à num_target_frames en utilisant une stratégie de type « reflect ». La dimension des images est supposée être la première dimension. Dans le cas 1D, nous pouvons visualiser cette stratégie comme suit :
pad_video_frames([1, 2, 3, 4, 5], 10) -> [1, 2, 3, 4, 5, 4, 3, 2, 1, 2]
WanPipelineOutput
classe diffusers.pipelines.wan.pipeline_output.WanPipelineOutput
< source >( frames: Tensor )
Paramètres
- frames (
torch.Tensor,np.ndarrayou list[list[PIL.Image.Image]]) — liste des sorties vidéo - Il peut s'agir d'une liste imbriquée de longueurbatch_size,où chaque sous-liste contient des séquences d'images PIL débruitées de longueurnum_frames.Il peut également s'agir d'un tableau NumPy ou d'un tenseur Torch de forme(batch_size, num_frames, channels, height, width).
Classe de sortie pour les pipelines Wan.