Support leapfusion img2vid

https://github.com/AeroScripts/leapfusion-hunyuan-image2video
This commit is contained in:
kijai
2025-01-24 17:11:16 +02:00
parent 88823b79b7
commit 5d7b0e4339
2 changed files with 22 additions and 4 deletions
@@ -237,7 +237,8 @@ class HunyuanVideoPipeline(DiffusionPipeline):
denoise_strength=1.0,
freenoise=False,
context_size=None,
context_overlap=None
context_overlap=None,
leapfusion_img2vid=False
):
shape = (
batch_size,
@@ -286,8 +287,12 @@ class HunyuanVideoPipeline(DiffusionPipeline):
# apply shuffled indexes
#print("place_idx:", place_idx, "delta:", delta, "list_idx:", list_idx)
noise[:, :, place_idx:place_idx + delta, :, :] = noise[:, :, list_idx, :, :]
if latents is None:
latents = noise
elif leapfusion_img2vid:
noise[:, :, [0,], :, :] = latents[:, :, [0,], :, :]
latents = noise.to(device)
elif denoise_strength < 1.0:
latents = latents.to(device)
timesteps, num_inference_steps = self.get_timesteps(num_inference_steps, denoise_strength, device)
@@ -421,6 +426,7 @@ class HunyuanVideoPipeline(DiffusionPipeline):
stg_end_percent: Optional[float] = 1.0,
context_options: Optional[Dict[str, Any]] = None,
feta_args: Optional[Dict] = None,
leapfusion_img2vid: Optional[bool] = False,
**kwargs,
):
r"""
@@ -604,7 +610,9 @@ class HunyuanVideoPipeline(DiffusionPipeline):
freqs_cos = freqs_cos.to(device)
freqs_sin = freqs_sin.to(device)
if leapfusion_img2vid:
logger.info("Single input latent frame detected, LeapFusion img2vid enabled")
original_latents = latents
# 5. Prepare latent variables
num_channels_latents = self.transformer.config.in_channels
latents, timesteps = self.prepare_latents(
@@ -621,7 +629,8 @@ class HunyuanVideoPipeline(DiffusionPipeline):
denoise_strength=denoise_strength,
freenoise=freenoise,
context_size=context_frames,
context_overlap=context_overlap
context_overlap=context_overlap,
leapfusion_img2vid=leapfusion_img2vid
)
# 6. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline
@@ -693,6 +702,10 @@ class HunyuanVideoPipeline(DiffusionPipeline):
latent_model_input = self.scheduler.scale_model_input(latent_model_input, t)
t_expand = t.repeat(latent_model_input.shape[0])
if leapfusion_img2vid:
latent_model_input[:, :, [0,], :, :] = original_latents[:, :, [0,], :, :].to(latent_model_input)
if embedded_guidance_scale is not None and not cfg_enabled:
guidance_expand = (
torch.tensor(
@@ -808,5 +821,6 @@ class HunyuanVideoPipeline(DiffusionPipeline):
# Offload all models
#self.maybe_free_model_hooks()
if leapfusion_img2vid:
latents[:, :, [0,], :, :] = original_latents[:, :, [0,], :, :].to(latent_model_input)
return latents
+4
View File
@@ -1156,6 +1156,9 @@ class HyVideoSampler:
cfg = 1.0
cfg_start_percent = 0.0
cfg_end_percent = 1.0
if embedded_guidance_scale == 0.0:
embedded_guidance_scale = None
generator = torch.Generator(device=torch.device("cpu")).manual_seed(seed)
@@ -1259,6 +1262,7 @@ class HyVideoSampler:
stg_end_percent=stg_args["stg_end_percent"] if stg_args is not None else 1.0,
context_options=context_options,
feta_args=feta_args,
leapfusion_img2vid = True if samples["samples"].shape[2] == 1 else False,
)
print_memory(device)