88 lines
2.8 KiB
C++
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
|