diff --git a/config/default.yaml b/config/default.yaml index b6a0cf2..7b9c298 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -76,6 +76,7 @@ face: roi_expand_ratio: 0.20 roi_square: true roi_upscale_target: 384 + roi_truncated_width_ratio: 0.45 min_roi_width: 40 min_roi_height: 40 static_image_mode: false diff --git a/src/config_loader.py b/src/config_loader.py index 3e10be0..4d663d7 100644 --- a/src/config_loader.py +++ b/src/config_loader.py @@ -183,6 +183,7 @@ class FaceSettings: roi_expand_ratio: float roi_square: bool roi_upscale_target: int + roi_truncated_width_ratio: float min_roi_width: int min_roi_height: int static_image_mode: bool @@ -578,6 +579,8 @@ def _validate(config: AppConfig) -> None: raise ConfigurationError("face minimum ROI dimensions must be positive") if face.roi_upscale_target < 0 or not isinstance(face.roi_square, bool): raise ConfigurationError("face roi_square/roi_upscale_target is invalid") + if face.roi_truncated_width_ratio <= 0: + raise ConfigurationError("face roi_truncated_width_ratio must be positive") if not 0.0 <= face.min_detection_confidence <= 1.0 or not 0.0 <= face.min_tracking_confidence <= 1.0: raise ConfigurationError("face confidence thresholds must be in [0, 1]") pose = config.head_pose diff --git a/src/face_geometry.py b/src/face_geometry.py index 8c3186c..d2f501b 100644 --- a/src/face_geometry.py +++ b/src/face_geometry.py @@ -3,8 +3,6 @@ from .config_loader import FaceSettings from .models import FaceROI, TrackedPerson -TRUNCATED_WIDTH_RATIO = 0.45 - def create_face_roi(person: TrackedPerson, frame_width: int, frame_height: int, config: FaceSettings) -> FaceROI | None: """Create a clipped upper-body ROI or return None when the track is ineligible.""" if config.require_confirmed_track and not person.is_confirmed: @@ -14,7 +12,7 @@ def create_face_roi(person: TrackedPerson, frame_width: int, frame_height: int, bbox = person.bbox candidate_height = bbox.height * config.roi_height_ratio if bbox.y2 >= frame_height - 2: - candidate_height = max(candidate_height, bbox.width * TRUNCATED_WIDTH_RATIO) + candidate_height = max(candidate_height, bbox.width * config.roi_truncated_width_ratio) expand_x = bbox.width * config.roi_expand_ratio expand_y = candidate_height * config.roi_expand_ratio y1 = max(0, round(bbox.y1 - expand_y))