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:
|
if use_embedding and curr_emb and prev_emb:
|
||||||
similarity = calculate_embedding_similarity(curr_emb, 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
|
score = 0.0
|
||||||
|
|
||||||
# Always reject if embedding similarity is too low (different person)
|
# Always reject if embedding similarity is too low (different person)
|
||||||
if use_embedding and curr_emb and prev_emb and similarity < 0.5:
|
if use_embedding and curr_emb and prev_emb and similarity < 0.5:
|
||||||
continue
|
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:
|
if iou > iou_threshold and similarity > similarity_threshold:
|
||||||
score = iou + similarity
|
score = iou + similarity
|
||||||
elif iou > 0.5 and similarity > 0.65:
|
elif iou > 0.5 and similarity > 0.65:
|
||||||
|
|||||||
Reference in New Issue
Block a user