fix: face tracker — reject cross-person match on bbox size + edge exit

This commit is contained in:
Accusys
2026-05-14 00:05:57 +08:00
parent 70a796e16c
commit 690254a5b2

View File

@@ -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: