55 lines
2.8 KiB
Python
55 lines
2.8 KiB
Python
import importlib.util
|
|
import pathlib
|
|
import sys
|
|
import textwrap
|
|
import unittest
|
|
|
|
|
|
REPO_ROOT = pathlib.Path(__file__).resolve().parents[1]
|
|
SCRIPT_PATH = REPO_ROOT / "tools" / "analyze_face_recog_log.py"
|
|
|
|
|
|
def load_module():
|
|
spec = importlib.util.spec_from_file_location("analyze_face_recog_log", SCRIPT_PATH)
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[spec.name] = module
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
class FaceRecogLogAnalysisTest(unittest.TestCase):
|
|
def test_summarizes_face_matches_tracks_and_uploads(self):
|
|
module = load_module()
|
|
sample = textwrap.dedent(
|
|
"""
|
|
RK3588 Media Server v0.1.0 (git abc1234)
|
|
[1000][I] [ai_face_recog] gallery loaded: n=15 dim=512
|
|
[1001][I] [ai_face_recog] start id=face_recog align=true thr_accept=0.450000 thr_margin=0.050000 infer_interval_ms=500 shared_target_key=graph:cam1:tracked_targets debug=true debug_log_matches=true debug_min_log_interval_ms=0
|
|
[1002][I] [ai_face_recog] track_assoc id=face_recog frame=10 source=shared_state person_class_id=0 face_bbox=(10,20,30,40) dets=1 person_dets=1 tracked_person_dets=1 containing_tracked_person_dets=1 best_track_id=7 best_overlap=900.0
|
|
[1003][I] [ai_face_recog] frame id=face_recog frame=10 faces_in=2 recog_items=2
|
|
[1004][I] [ai_face_recog] match id=face_recog frame=10 status=known person_track_id=7 candidate=reg_001 candidate_id=1 best_sim=0.58 second_sim=0.44 sim_margin=0.14 bbox=(10,20,30,40)
|
|
[1005][I] [ai_face_recog] match id=face_recog frame=10 status=uncertain person_track_id=-1 candidate=reg_002 candidate_id=2 best_sim=0.42 second_sim=0.39 sim_margin=0.03 bbox=(50,60,12,18)
|
|
[1006][I] [ALARM][info] 2026-04-17 10:00:00 node=alarm rule=known_person:reg_001 frame=10 detections=[]
|
|
[1007][I] [ExternalApiAction] token fetched successfully
|
|
[1008][I] [ExternalApiAction] send ok http=200 alarm_content=known_person:reg_001 pic_url=a video_url=b
|
|
"""
|
|
).strip().splitlines()
|
|
|
|
summary = module.analyze_lines(sample)
|
|
|
|
self.assertEqual(summary.version_git, "abc1234")
|
|
self.assertEqual(summary.gallery_count, 15)
|
|
self.assertEqual(summary.gallery_dim, 512)
|
|
self.assertEqual(summary.shared_target_key, "graph:cam1:tracked_targets")
|
|
self.assertEqual(summary.match_total, 2)
|
|
self.assertEqual(summary.status_counts["known"], 1)
|
|
self.assertEqual(summary.status_counts["uncertain"], 1)
|
|
self.assertEqual(summary.track_id_missing, 1)
|
|
self.assertEqual(summary.alarm_counts["known_person:reg_001"], 1)
|
|
self.assertEqual(summary.external_send_counts["ok"], 1)
|
|
self.assertEqual(summary.quantiles["known"]["best_sim"]["max"], 0.58)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|