Co-authored-by: EricRorich <86147326+EricRorich@users.noreply.github.com>
246 lines
9.8 KiB
Python
246 lines
9.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Test rendering script to verify the updated geometry visually."""
|
|
|
|
import sys
|
|
sys.path.insert(0, '/home/runner/work/ComfyUI-face-shaper/ComfyUI-face-shaper')
|
|
|
|
from face_shaper import ComfyUIFaceShaper
|
|
from PIL import Image
|
|
import numpy as np
|
|
|
|
def save_tensor_as_image(tensor, filename):
|
|
"""Convert a tensor to an image and save it."""
|
|
# tensor shape: [B, H, W, C]
|
|
arr = tensor[0].numpy() # Get first batch
|
|
arr = (arr * 255).astype(np.uint8)
|
|
if arr.shape[2] == 3:
|
|
img = Image.fromarray(arr, 'RGB')
|
|
else:
|
|
img = Image.fromarray(arr, 'RGBA')
|
|
img.save(filename)
|
|
print(f"Saved image to {filename}")
|
|
|
|
def test_default_render():
|
|
"""Test rendering with default parameters."""
|
|
print("Testing default render...")
|
|
node = ComfyUIFaceShaper()
|
|
|
|
result = node.draw_face(
|
|
canvas_width=1024,
|
|
canvas_height=1024,
|
|
transparent_background=False,
|
|
line_thickness=2.0,
|
|
gender="female",
|
|
fov_mm=80.0,
|
|
camera_distance=1.0,
|
|
camera_pos_x=0.0,
|
|
camera_pos_y=0.0,
|
|
head_size_x=1.0,
|
|
head_size_y=1.0,
|
|
jaw_size_x=1.0,
|
|
fore_head_size_x=1.0,
|
|
eye_left_size_x=1.0, eye_left_size_y=1.0, eye_left_pos_x=0.0, eye_left_pos_y=0.0,
|
|
eye_left_rotation=0.0,
|
|
eye_right_size_x=1.0, eye_right_size_y=1.0, eye_right_pos_x=0.0, eye_right_pos_y=0.0,
|
|
eye_right_rotation=0.0,
|
|
iris_left_size=1.0, iris_left_pos_x=0.0, iris_left_pos_y=0.0,
|
|
iris_right_size=1.0, iris_right_pos_x=0.0, iris_right_pos_y=0.0,
|
|
eyebrow_left_size_x=1.0, eyebrow_left_size_y=1.0, eyebrow_left_pos_x=0.0, eyebrow_left_pos_y=0.0, eyebrow_left_rotation=0.0,
|
|
eyebrow_right_size_x=1.0, eyebrow_right_size_y=1.0, eyebrow_right_pos_x=0.0, eyebrow_right_pos_y=0.0, eyebrow_right_rotation=0.0,
|
|
cheeks_enabled=True,
|
|
cheek_left_pos_x=0.0, cheek_left_pos_y=0.0,
|
|
cheek_right_pos_x=0.0, cheek_right_pos_y=0.0,
|
|
nose_pos_y=0.0, nose_size_x=1.0, nose_size_y=1.0,
|
|
nose_tip_pos_y=0.0,
|
|
lips_pos_y=0.0, lip_size_x=1.0,
|
|
lip_upper_size_y=1.0, lip_lower_size_y=1.0,
|
|
settings_list=None
|
|
)
|
|
|
|
tensor, settings_list = result
|
|
save_tensor_as_image(tensor, '/tmp/face_default.png')
|
|
print("✓ Default render test passed")
|
|
|
|
def test_nose_tip_adjustment():
|
|
"""Test rendering with nose tip adjustment."""
|
|
print("\nTesting nose tip adjustment...")
|
|
node = ComfyUIFaceShaper()
|
|
|
|
# Render with nose tip moved down
|
|
result = node.draw_face(
|
|
canvas_width=1024,
|
|
canvas_height=1024,
|
|
transparent_background=False,
|
|
line_thickness=2.0,
|
|
gender="female",
|
|
fov_mm=80.0,
|
|
camera_distance=1.0,
|
|
camera_pos_x=0.0,
|
|
camera_pos_y=0.0,
|
|
head_size_x=1.0,
|
|
head_size_y=1.0,
|
|
jaw_size_x=1.0,
|
|
fore_head_size_x=1.0,
|
|
eye_left_size_x=1.0, eye_left_size_y=1.0, eye_left_pos_x=0.0, eye_left_pos_y=0.0,
|
|
eye_left_rotation=0.0,
|
|
eye_right_size_x=1.0, eye_right_size_y=1.0, eye_right_pos_x=0.0, eye_right_pos_y=0.0,
|
|
eye_right_rotation=0.0,
|
|
iris_left_size=1.0, iris_left_pos_x=0.0, iris_left_pos_y=0.0,
|
|
iris_right_size=1.0, iris_right_pos_x=0.0, iris_right_pos_y=0.0,
|
|
eyebrow_left_size_x=1.0, eyebrow_left_size_y=1.0, eyebrow_left_pos_x=0.0, eyebrow_left_pos_y=0.0, eyebrow_left_rotation=0.0,
|
|
eyebrow_right_size_x=1.0, eyebrow_right_size_y=1.0, eyebrow_right_pos_x=0.0, eyebrow_right_pos_y=0.0, eyebrow_right_rotation=0.0,
|
|
cheeks_enabled=True,
|
|
cheek_left_pos_x=0.0, cheek_left_pos_y=0.0,
|
|
cheek_right_pos_x=0.0, cheek_right_pos_y=0.0,
|
|
nose_pos_y=0.0, nose_size_x=1.0, nose_size_y=1.0,
|
|
nose_tip_pos_y=0.1, # Move tip down
|
|
lips_pos_y=0.0, lip_size_x=1.0,
|
|
lip_upper_size_y=1.0, lip_lower_size_y=1.0,
|
|
settings_list=None
|
|
)
|
|
|
|
tensor, settings_list = result
|
|
save_tensor_as_image(tensor, '/tmp/face_nose_tip_down.png')
|
|
print("✓ Nose tip adjustment test passed")
|
|
|
|
def test_debug_geometry():
|
|
"""Test rendering without debug geometry (feature removed)."""
|
|
print("\nTesting without debug geometry (feature removed)...")
|
|
node = ComfyUIFaceShaper()
|
|
|
|
result = node.draw_face(
|
|
canvas_width=1024,
|
|
canvas_height=1024,
|
|
transparent_background=False,
|
|
line_thickness=2.0,
|
|
gender="female",
|
|
fov_mm=80.0,
|
|
camera_distance=1.0,
|
|
camera_pos_x=0.0,
|
|
camera_pos_y=0.0,
|
|
head_size_x=1.0,
|
|
head_size_y=1.0,
|
|
jaw_size_x=1.0,
|
|
fore_head_size_x=1.0,
|
|
eye_left_size_x=1.0, eye_left_size_y=1.0, eye_left_pos_x=0.0, eye_left_pos_y=0.0,
|
|
eye_left_rotation=0.0,
|
|
eye_right_size_x=1.0, eye_right_size_y=1.0, eye_right_pos_x=0.0, eye_right_pos_y=0.0,
|
|
eye_right_rotation=0.0,
|
|
iris_left_size=1.0, iris_left_pos_x=0.0, iris_left_pos_y=0.0,
|
|
iris_right_size=1.0, iris_right_pos_x=0.0, iris_right_pos_y=0.0,
|
|
eyebrow_left_size_x=1.0, eyebrow_left_size_y=1.0, eyebrow_left_pos_x=0.0, eyebrow_left_pos_y=0.0, eyebrow_left_rotation=0.0,
|
|
eyebrow_right_size_x=1.0, eyebrow_right_size_y=1.0, eyebrow_right_pos_x=0.0, eyebrow_right_pos_y=0.0, eyebrow_right_rotation=0.0,
|
|
cheeks_enabled=True,
|
|
cheek_left_pos_x=0.0, cheek_left_pos_y=0.0,
|
|
cheek_right_pos_x=0.0, cheek_right_pos_y=0.0,
|
|
nose_pos_y=0.0, nose_size_x=1.0, nose_size_y=1.0,
|
|
nose_tip_pos_y=0.0,
|
|
lips_pos_y=0.0, lip_size_x=1.0,
|
|
lip_upper_size_y=1.0, lip_lower_size_y=1.0,
|
|
settings_list=None
|
|
)
|
|
|
|
tensor, settings_list = result
|
|
save_tensor_as_image(tensor, '/tmp/face_no_debug.png')
|
|
print("✓ Render test (debug removed) passed")
|
|
|
|
def test_eye_rotation():
|
|
"""Test rendering with eye rotation."""
|
|
print("\nTesting eye rotation...")
|
|
node = ComfyUIFaceShaper()
|
|
|
|
# Test independent eye rotations
|
|
result = node.draw_face(
|
|
canvas_width=1024,
|
|
canvas_height=1024,
|
|
transparent_background=False,
|
|
line_thickness=2.0,
|
|
gender="female",
|
|
fov_mm=80.0,
|
|
camera_distance=1.0,
|
|
camera_pos_x=0.0,
|
|
camera_pos_y=0.0,
|
|
head_size_x=1.0,
|
|
head_size_y=1.0,
|
|
jaw_size_x=1.0,
|
|
fore_head_size_x=1.0,
|
|
eye_left_size_x=1.0, eye_left_size_y=1.0, eye_left_pos_x=0.0, eye_left_pos_y=0.0,
|
|
eye_left_rotation=15.0, # Rotate left eye 15 degrees
|
|
eye_right_size_x=1.0, eye_right_size_y=1.0, eye_right_pos_x=0.0, eye_right_pos_y=0.0,
|
|
eye_right_rotation=-15.0, # Rotate right eye -15 degrees
|
|
iris_left_size=1.0, iris_left_pos_x=0.0, iris_left_pos_y=0.0,
|
|
iris_right_size=1.0, iris_right_pos_x=0.0, iris_right_pos_y=0.0,
|
|
eyebrow_left_size_x=1.0, eyebrow_left_size_y=1.0, eyebrow_left_pos_x=0.0, eyebrow_left_pos_y=0.0, eyebrow_left_rotation=0.0,
|
|
eyebrow_right_size_x=1.0, eyebrow_right_size_y=1.0, eyebrow_right_pos_x=0.0, eyebrow_right_pos_y=0.0, eyebrow_right_rotation=0.0,
|
|
cheeks_enabled=True,
|
|
cheek_left_pos_x=0.0, cheek_left_pos_y=0.0,
|
|
cheek_right_pos_x=0.0, cheek_right_pos_y=0.0,
|
|
nose_pos_y=0.0, nose_size_x=1.0, nose_size_y=1.0,
|
|
nose_tip_pos_y=0.0,
|
|
lips_pos_y=0.0, lip_size_x=1.0,
|
|
lip_upper_size_y=1.0, lip_lower_size_y=1.0,
|
|
settings_list=None
|
|
)
|
|
|
|
tensor, settings_list = result
|
|
save_tensor_as_image(tensor, '/tmp/face_eye_rotation.png')
|
|
print("✓ Eye rotation test passed")
|
|
|
|
def test_cheeks_disabled():
|
|
"""Test rendering with cheeks disabled."""
|
|
print("\nTesting with cheeks disabled...")
|
|
node = ComfyUIFaceShaper()
|
|
|
|
result = node.draw_face(
|
|
canvas_width=1024,
|
|
canvas_height=1024,
|
|
transparent_background=False,
|
|
line_thickness=2.0,
|
|
gender="female",
|
|
fov_mm=80.0,
|
|
camera_distance=1.0,
|
|
camera_pos_x=0.0,
|
|
camera_pos_y=0.0,
|
|
head_size_x=1.0,
|
|
head_size_y=1.0,
|
|
jaw_size_x=1.0,
|
|
fore_head_size_x=1.0,
|
|
eye_left_size_x=1.0, eye_left_size_y=1.0, eye_left_pos_x=0.0, eye_left_pos_y=0.0,
|
|
eye_left_rotation=0.0,
|
|
eye_right_size_x=1.0, eye_right_size_y=1.0, eye_right_pos_x=0.0, eye_right_pos_y=0.0,
|
|
eye_right_rotation=0.0,
|
|
iris_left_size=1.0, iris_left_pos_x=0.0, iris_left_pos_y=0.0,
|
|
iris_right_size=1.0, iris_right_pos_x=0.0, iris_right_pos_y=0.0,
|
|
eyebrow_left_size_x=1.0, eyebrow_left_size_y=1.0, eyebrow_left_pos_x=0.0, eyebrow_left_pos_y=0.0, eyebrow_left_rotation=0.0,
|
|
eyebrow_right_size_x=1.0, eyebrow_right_size_y=1.0, eyebrow_right_pos_x=0.0, eyebrow_right_pos_y=0.0, eyebrow_right_rotation=0.0,
|
|
cheeks_enabled=False, # Disable cheeks
|
|
cheek_left_pos_x=0.0, cheek_left_pos_y=0.0,
|
|
cheek_right_pos_x=0.0, cheek_right_pos_y=0.0,
|
|
nose_pos_y=0.0, nose_size_x=1.0, nose_size_y=1.0,
|
|
nose_tip_pos_y=0.0,
|
|
lips_pos_y=0.0, lip_size_x=1.0,
|
|
lip_upper_size_y=1.0, lip_lower_size_y=1.0,
|
|
settings_list=None
|
|
)
|
|
|
|
tensor, settings_list = result
|
|
save_tensor_as_image(tensor, '/tmp/face_no_cheeks.png')
|
|
print("✓ Cheeks disabled test passed")
|
|
|
|
if __name__ == "__main__":
|
|
print("Running render tests...\n")
|
|
|
|
test_default_render()
|
|
test_nose_tip_adjustment()
|
|
test_debug_geometry()
|
|
test_eye_rotation()
|
|
test_cheeks_disabled()
|
|
|
|
print("\n✓ All render tests completed!")
|
|
print("\nGenerated images:")
|
|
print(" /tmp/face_default.png - Default render with updated geometry")
|
|
print(" /tmp/face_nose_tip_down.png - Nose tip adjusted down (+0.1)")
|
|
print(" /tmp/face_no_debug.png - Normal render (debug_geometry removed)")
|
|
print(" /tmp/face_eye_rotation.png - Eye rotation test (left +15°, right -15°)")
|
|
print(" /tmp/face_no_cheeks.png - Cheeks disabled test")
|