fix: face tracker — reject cross-person match on bbox size + edge exit
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user