From 690254a5b2c27513e647b7dfe275846e7c68d91c Mon Sep 17 00:00:00 2001 From: Accusys Date: Thu, 14 May 2026 00:05:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20face=20tracker=20=E2=80=94=20reject=20cr?= =?UTF-8?q?oss-person=20match=20on=20bbox=20size=20+=20edge=20exit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/utils/face_tracker.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/scripts/utils/face_tracker.py b/scripts/utils/face_tracker.py index 7b2a565..13efe79 100755 --- a/scripts/utils/face_tracker.py +++ b/scripts/utils/face_tracker.py @@ -165,12 +165,36 @@ def match_faces( if use_embedding and curr_emb and prev_emb: similarity = calculate_embedding_similarity(curr_emb, prev_emb) + # Bbox size consistency check: sudden size change = different person + prev_area = prev_bbox["width"] * prev_bbox["height"] + curr_area = curr_bbox["width"] * curr_bbox["height"] + area_ratio = max(curr_area, prev_area) / max(1, min(curr_area, prev_area)) + score = 0.0 # Always reject if embedding similarity is too low (different person) if use_embedding and curr_emb and prev_emb and similarity < 0.5: continue + # Reject if bbox size changes by more than 5x (e.g., far shot → close-up) + if area_ratio > 5.0 and similarity < 0.8: + continue + + # Edge exit: if previous face was near frame edge and current face is not, + # the old face likely exited and a new face appeared + prev_at_edge = (prev_bbox["x"] < 50 or + prev_bbox["x"] + prev_bbox["width"] > 1870 or + prev_bbox["y"] < 50 or + prev_bbox["y"] + prev_bbox["height"] > 1030) + curr_at_edge = (curr_bbox["x"] < 50 or + curr_bbox["x"] + curr_bbox["width"] > 1870 or + curr_bbox["y"] < 50 or + curr_bbox["y"] + curr_bbox["height"] > 1030) + if prev_at_edge and not curr_at_edge and similarity < 0.8: + continue + + if iou > iou_threshold and similarity > similarity_threshold: + if iou > iou_threshold and similarity > similarity_threshold: score = iou + similarity elif iou > 0.5 and similarity > 0.65: