Compare commits

..

No commits in common. "5db23597e94585f2ef3241e29990b7c643ae21c9" and "ebc30b1cac62ba769c3799e15c4b25b307179932" have entirely different histories.

2 changed files with 11 additions and 37 deletions

View File

@ -2,7 +2,6 @@ import os
import shutil import shutil
from typing import Any from typing import Any
import insightface import insightface
import logging # Added logging import
import cv2 import cv2
import numpy as np import numpy as np
@ -26,27 +25,18 @@ def get_face_analyser() -> Any:
def get_one_face(frame: Frame) -> Any: def get_one_face(frame: Frame) -> Any:
faces = get_face_analyser().get(frame) face = get_face_analyser().get(frame)
if not faces:
logging.debug("Face_analyser: get_one_face: No faces found by insightface.")
return None
try: try:
return min(faces, key=lambda x: x.bbox[0]) return min(face, key=lambda x: x.bbox[0])
except ValueError: except ValueError:
logging.debug("Face_analyser: get_one_face: ValueError, likely no faces after all.")
return None return None
def get_many_faces(frame: Frame) -> Any: def get_many_faces(frame: Frame) -> Any:
faces = get_face_analyser().get(frame) try:
if not faces: # Check if faces is None or an empty list return get_face_analyser().get(frame)
logging.debug("Face_analyser: get_many_faces: No faces found by insightface.") except IndexError:
# Depending on what insightface returns for no faces, return None
# you might return None or an empty list.
# If .get() returns an empty list for no faces, this check is sufficient.
# If .get() returns None, this is also fine.
return faces # Return original (None or empty list)
return faces
def has_valid_map() -> bool: def has_valid_map() -> bool:
for map in modules.globals.source_target_map: for map in modules.globals.source_target_map:

View File

@ -136,26 +136,16 @@ def process_frame(source_face: Face, temp_frame: Frame) -> Frame:
many_faces = get_many_faces(temp_frame) many_faces = get_many_faces(temp_frame)
if many_faces: if many_faces:
for target_face in many_faces: for target_face in many_faces:
if source_face and target_face: # target_face from many_faces will always be valid here if source_face and target_face:
temp_frame = swap_face(source_face, target_face, temp_frame) temp_frame = swap_face(source_face, target_face, temp_frame)
elif not source_face: # Check source_face specifically else:
logging.error("Source face is not available or no face detected in source image. Skipping swap for this target face.") print("Face detection failed for target/source.")
# Optionally `continue` or `break` if source_face is essential for all
elif not source_face : # if many_faces is empty AND source_face is also an issue
logging.error("Source face is not available AND no faces detected in target frame.")
else: # many_faces is empty, but source_face is ok
logging.info(f"No faces detected in the current target frame for 'many_faces' mode.")
else: else:
target_face = get_one_face(temp_frame) target_face = get_one_face(temp_frame)
if target_face and source_face: if target_face and source_face:
temp_frame = swap_face(source_face, target_face, temp_frame) temp_frame = swap_face(source_face, target_face, temp_frame)
else: else:
if not source_face: logging.error("Face detection failed for target or source.")
logging.error("Source face is not available or no face detected in source image.")
elif not target_face:
logging.error(f"No face detected in the current target frame.")
else: # Should not happen if logic is right, but as a fallback
logging.error("Face detection failed for an unknown reason concerning target or source.")
return temp_frame return temp_frame
@ -553,13 +543,7 @@ def apply_mouth_area(
feathered_mask = cv2.GaussianBlur( feathered_mask = cv2.GaussianBlur(
polygon_mask.astype(float), (0, 0), feather_amount polygon_mask.astype(float), (0, 0), feather_amount
) )
feathered_mask = feathered_mask / feathered_mask.max()
mask_max_value = feathered_mask.max()
if mask_max_value < 1e-6: # Check if max is effectively zero
logging.warning("Mouth mask's feathered_mask is all zeros or near-zeros after blur. Resulting mask will be black.")
feathered_mask = np.zeros_like(polygon_mask, dtype=np.uint8)
else:
feathered_mask = (feathered_mask / mask_max_value * 255).astype(np.uint8)
face_mask_roi = face_mask[min_y:max_y, min_x:max_x] face_mask_roi = face_mask[min_y:max_y, min_x:max_x]
combined_mask = feathered_mask * (face_mask_roi / 255.0) combined_mask = feathered_mask * (face_mask_roi / 255.0)