Update engineers/deformes3D.py
Browse files- engineers/deformes3D.py +18 -22
engineers/deformes3D.py
CHANGED
|
@@ -29,7 +29,6 @@ logger = logging.getLogger(__name__)
|
|
| 29 |
class Deformes3DEngine:
|
| 30 |
"""
|
| 31 |
ADUC Specialist for static image (keyframe) generation.
|
| 32 |
-
Primary engine is FLUX, with an experimental LTX enrichment step.
|
| 33 |
"""
|
| 34 |
def __init__(self, workspace_dir):
|
| 35 |
self.workspace_dir = workspace_dir
|
|
@@ -38,7 +37,7 @@ class Deformes3DEngine:
|
|
| 38 |
|
| 39 |
def _generate_single_keyframe(self, prompt: str, reference_images: list[Image.Image], output_filename: str, width: int, height: int, callback: callable = None) -> str:
|
| 40 |
"""
|
| 41 |
-
Low-level function that generates a single image using the
|
| 42 |
"""
|
| 43 |
logger.info(f"Generating keyframe '{output_filename}' with prompt: '{prompt}'")
|
| 44 |
generated_image = self.image_generation_helper.generate_image(
|
|
@@ -52,9 +51,7 @@ class Deformes3DEngine:
|
|
| 52 |
|
| 53 |
def generate_keyframes_from_storyboard(self, storyboard: list, initial_ref_path: str, global_prompt: str, keyframe_resolution: int, general_ref_paths: list, progress_callback_factory: callable = None):
|
| 54 |
"""
|
| 55 |
-
Orchestrates the generation of all keyframes.
|
| 56 |
-
generates a version with FLUX, and then an "enriched" version with LTX
|
| 57 |
-
for direct comparison.
|
| 58 |
"""
|
| 59 |
current_base_image_path = initial_ref_path
|
| 60 |
previous_prompt = "N/A (initial reference image)"
|
|
@@ -63,7 +60,7 @@ class Deformes3DEngine:
|
|
| 63 |
target_resolution_tuple = (width, height)
|
| 64 |
|
| 65 |
num_keyframes_to_generate = len(storyboard) - 1
|
| 66 |
-
logger.info(f"IMAGE SPECIALIST: Received order to generate {num_keyframes_to_generate} keyframes (
|
| 67 |
|
| 68 |
for i in range(num_keyframes_to_generate):
|
| 69 |
scene_index = i + 1
|
|
@@ -74,26 +71,26 @@ class Deformes3DEngine:
|
|
| 74 |
logger.info(f"--> Generating Keyframe {scene_index}/{num_keyframes_to_generate}...")
|
| 75 |
|
| 76 |
# --- STEP A: Generate with FLUX (Primary Method) ---
|
| 77 |
-
logger.info(f" - Step A: Generating with
|
| 78 |
|
| 79 |
-
|
| 80 |
global_prompt=global_prompt, scene_history=previous_prompt,
|
| 81 |
current_scene_desc=current_scene, future_scene_desc=future_scene,
|
| 82 |
last_image_path=current_base_image_path, fixed_ref_paths=general_ref_paths
|
| 83 |
)
|
| 84 |
|
| 85 |
-
flux_ref_paths = list(set([current_base_image_path] + general_ref_paths))
|
| 86 |
-
flux_ref_images = [Image.open(p) for p in flux_ref_paths]
|
| 87 |
|
| 88 |
-
flux_keyframe_path = self._generate_single_keyframe(
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
)
|
| 93 |
-
final_keyframes_gallery.append(flux_keyframe_path)
|
| 94 |
|
| 95 |
# --- STEP B: LTX Enrichment Experiment ---
|
| 96 |
-
logger.info(f" - Step B: Generating enrichment with LTX...")
|
| 97 |
|
| 98 |
ltx_context_paths = []
|
| 99 |
context_paths = []
|
|
@@ -102,7 +99,6 @@ class Deformes3DEngine:
|
|
| 102 |
ltx_context_paths = list(reversed(context_paths))
|
| 103 |
logger.info(f" - LTX Context Order (Reversed): {[os.path.basename(p) for p in ltx_context_paths]}")
|
| 104 |
|
| 105 |
-
|
| 106 |
ltx_conditioning_items = []
|
| 107 |
|
| 108 |
weight = 0.6
|
|
@@ -121,7 +117,7 @@ class Deformes3DEngine:
|
|
| 121 |
generated_latents, _ = ltx_manager_singleton.generate_latent_fragment(
|
| 122 |
height=height, width=width,
|
| 123 |
conditioning_items_data=ltx_conditioning_items,
|
| 124 |
-
motion_prompt=
|
| 125 |
video_total_frames=48,
|
| 126 |
video_fps=24,
|
| 127 |
**ltx_base_params
|
|
@@ -136,10 +132,10 @@ class Deformes3DEngine:
|
|
| 136 |
final_keyframes_gallery.append(ltx_keyframe_path)
|
| 137 |
|
| 138 |
# Use the FLUX keyframe as the base for the next iteration to maintain the primary narrative path
|
| 139 |
-
current_base_image_path = flux_keyframe_path
|
| 140 |
-
previous_prompt =
|
| 141 |
|
| 142 |
-
logger.info(f"IMAGE SPECIALIST: Generation of all keyframe versions (
|
| 143 |
return final_keyframes_gallery
|
| 144 |
|
| 145 |
# --- HELPER FUNCTIONS ---
|
|
|
|
| 29 |
class Deformes3DEngine:
|
| 30 |
"""
|
| 31 |
ADUC Specialist for static image (keyframe) generation.
|
|
|
|
| 32 |
"""
|
| 33 |
def __init__(self, workspace_dir):
|
| 34 |
self.workspace_dir = workspace_dir
|
|
|
|
| 37 |
|
| 38 |
def _generate_single_keyframe(self, prompt: str, reference_images: list[Image.Image], output_filename: str, width: int, height: int, callback: callable = None) -> str:
|
| 39 |
"""
|
| 40 |
+
Low-level function that generates a single image using the LTX helper.
|
| 41 |
"""
|
| 42 |
logger.info(f"Generating keyframe '{output_filename}' with prompt: '{prompt}'")
|
| 43 |
generated_image = self.image_generation_helper.generate_image(
|
|
|
|
| 51 |
|
| 52 |
def generate_keyframes_from_storyboard(self, storyboard: list, initial_ref_path: str, global_prompt: str, keyframe_resolution: int, general_ref_paths: list, progress_callback_factory: callable = None):
|
| 53 |
"""
|
| 54 |
+
Orchestrates the generation of all keyframes.
|
|
|
|
|
|
|
| 55 |
"""
|
| 56 |
current_base_image_path = initial_ref_path
|
| 57 |
previous_prompt = "N/A (initial reference image)"
|
|
|
|
| 60 |
target_resolution_tuple = (width, height)
|
| 61 |
|
| 62 |
num_keyframes_to_generate = len(storyboard) - 1
|
| 63 |
+
logger.info(f"IMAGE SPECIALIST: Received order to generate {num_keyframes_to_generate} keyframes (LTX versions).")
|
| 64 |
|
| 65 |
for i in range(num_keyframes_to_generate):
|
| 66 |
scene_index = i + 1
|
|
|
|
| 71 |
logger.info(f"--> Generating Keyframe {scene_index}/{num_keyframes_to_generate}...")
|
| 72 |
|
| 73 |
# --- STEP A: Generate with FLUX (Primary Method) ---
|
| 74 |
+
logger.info(f" - Step A: Generating with keyframe...")
|
| 75 |
|
| 76 |
+
img_prompt = deformes2d_thinker_singleton.get_anticipatory_keyframe_prompt(
|
| 77 |
global_prompt=global_prompt, scene_history=previous_prompt,
|
| 78 |
current_scene_desc=current_scene, future_scene_desc=future_scene,
|
| 79 |
last_image_path=current_base_image_path, fixed_ref_paths=general_ref_paths
|
| 80 |
)
|
| 81 |
|
| 82 |
+
#flux_ref_paths = list(set([current_base_image_path] + general_ref_paths))
|
| 83 |
+
#flux_ref_images = [Image.open(p) for p in flux_ref_paths]
|
| 84 |
|
| 85 |
+
#flux_keyframe_path = self._generate_single_keyframe(
|
| 86 |
+
# prompt=img_prompt, reference_images=flux_ref_images,
|
| 87 |
+
# output_filename=f"keyframe_{scene_index}_flux.png", width=width, height=height,
|
| 88 |
+
# callback=progress_callback_flux
|
| 89 |
+
#)
|
| 90 |
+
#final_keyframes_gallery.append(flux_keyframe_path)
|
| 91 |
|
| 92 |
# --- STEP B: LTX Enrichment Experiment ---
|
| 93 |
+
#logger.info(f" - Step B: Generating enrichment with LTX...")
|
| 94 |
|
| 95 |
ltx_context_paths = []
|
| 96 |
context_paths = []
|
|
|
|
| 99 |
ltx_context_paths = list(reversed(context_paths))
|
| 100 |
logger.info(f" - LTX Context Order (Reversed): {[os.path.basename(p) for p in ltx_context_paths]}")
|
| 101 |
|
|
|
|
| 102 |
ltx_conditioning_items = []
|
| 103 |
|
| 104 |
weight = 0.6
|
|
|
|
| 117 |
generated_latents, _ = ltx_manager_singleton.generate_latent_fragment(
|
| 118 |
height=height, width=width,
|
| 119 |
conditioning_items_data=ltx_conditioning_items,
|
| 120 |
+
motion_prompt=img_prompt,
|
| 121 |
video_total_frames=48,
|
| 122 |
video_fps=24,
|
| 123 |
**ltx_base_params
|
|
|
|
| 132 |
final_keyframes_gallery.append(ltx_keyframe_path)
|
| 133 |
|
| 134 |
# Use the FLUX keyframe as the base for the next iteration to maintain the primary narrative path
|
| 135 |
+
current_base_image_path = ltx_keyframe_path #flux_keyframe_path
|
| 136 |
+
previous_prompt = img_prompt
|
| 137 |
|
| 138 |
+
logger.info(f"IMAGE SPECIALIST: Generation of all keyframe versions (LTX) complete.")
|
| 139 |
return final_keyframes_gallery
|
| 140 |
|
| 141 |
# --- HELPER FUNCTIONS ---
|