Files
EricRorich-ComfyUI-face-shaper/test_render.py

199 lines
7.9 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,
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,
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,
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,
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")
if __name__ == "__main__":
print("Running render tests...\n")
test_default_render()
test_nose_tip_adjustment()
test_debug_geometry()
test_eye_rotation()
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°)")