safesight-edge/tests/test_face_track_alarm.cpp

88 lines
2.8 KiB
C++

#include <gtest/gtest.h>
#include <cstdint>
#include "node.h"
#undef REGISTER_NODE
#define REGISTER_NODE(NodeClass, NodeTypeStr)
#include "../plugins/alarm/alarm_node.cpp"
namespace rk3588 {
namespace {
FaceRecogItem MakeKnownFace(int track_id, int person_id, const std::string& name, float best_sim) {
FaceRecogItem item;
item.person_track_id = track_id;
item.best_person_id = person_id;
item.best_name = name;
item.candidate_person_id = person_id;
item.candidate_name = name;
item.best_sim = best_sim;
item.second_sim = 0.20f;
item.unknown = false;
return item;
}
FaceRecogItem MakeUnknownFace(int track_id, int candidate_person_id, const std::string& candidate_name, float best_sim) {
FaceRecogItem item;
item.person_track_id = track_id;
item.candidate_person_id = candidate_person_id;
item.candidate_name = candidate_name;
item.best_sim = best_sim;
item.second_sim = best_sim - 0.02f;
item.unknown = true;
return item;
}
TEST(FaceTrackAlarmTest, IgnoresLowQualityUntrackedFace) {
FaceTrackAggregationConfig cfg;
FaceTrackState state;
FaceRecogItem item = MakeUnknownFace(-1, -1, "", 0.40f);
const FaceTrackDecision decision = UpdateFaceTrackState(cfg, state, item, 1000);
EXPECT_FALSE(decision.trigger_known);
EXPECT_FALSE(decision.trigger_unknown);
}
TEST(FaceTrackAlarmTest, EmitsKnownAfterStableHitsOnSameTrack) {
FaceTrackAggregationConfig cfg;
cfg.known_min_hits = 3;
cfg.known_hit_window_ms = 3000;
FaceTrackState state;
const FaceRecogItem item = MakeKnownFace(5, 1, "reg_001", 0.62f);
EXPECT_FALSE(UpdateFaceTrackState(cfg, state, item, 1000).trigger_known);
EXPECT_FALSE(UpdateFaceTrackState(cfg, state, item, 1500).trigger_known);
const FaceTrackDecision decision = UpdateFaceTrackState(cfg, state, item, 2000);
EXPECT_TRUE(decision.trigger_known);
EXPECT_FALSE(decision.trigger_unknown);
}
TEST(FaceTrackAlarmTest, DoesNotEmitUnknownForKnownPersonScoreWobble) {
FaceTrackAggregationConfig cfg;
cfg.known_min_hits = 3;
cfg.known_hit_window_ms = 3000;
cfg.unknown_min_track_age_ms = 1000;
cfg.unknown_min_quality_hits = 1;
FaceTrackState state;
const FaceRecogItem known = MakeKnownFace(9, 1, "reg_001", 0.63f);
EXPECT_FALSE(UpdateFaceTrackState(cfg, state, known, 1000).trigger_known);
EXPECT_FALSE(UpdateFaceTrackState(cfg, state, known, 1500).trigger_known);
EXPECT_TRUE(UpdateFaceTrackState(cfg, state, known, 2000).trigger_known);
const FaceRecogItem wobble = MakeUnknownFace(9, 1, "reg_001", 0.42f);
const FaceTrackDecision decision = UpdateFaceTrackState(cfg, state, wobble, 2600);
EXPECT_FALSE(decision.trigger_known);
EXPECT_FALSE(decision.trigger_unknown);
}
} // namespace
} // namespace rk3588