safesight-edge/include/face/face_recog_debug.h

58 lines
2.0 KiB
C++

#pragma once
#include <algorithm>
#include <cmath>
#include <cstdint>
#include <iomanip>
#include <sstream>
#include <string>
#include "face/face_result.h"
#include "utils/simple_json.h"
namespace rk3588 {
struct FaceRecogDebugConfig {
bool enabled = false;
bool log_matches = false;
int min_log_interval_ms = 2000;
};
inline FaceRecogDebugConfig ParseFaceRecogDebugConfig(
const SimpleJson& cfg, const FaceRecogDebugConfig& base = {}) {
FaceRecogDebugConfig out = base;
const SimpleJson* debug = cfg.Find("debug");
if (!debug || !debug->IsObject()) return out;
out.enabled = debug->ValueOr<bool>("enabled", out.enabled);
out.log_matches = debug->ValueOr<bool>("log_matches", out.log_matches);
out.min_log_interval_ms = std::max(0, debug->ValueOr<int>("min_log_interval_ms", out.min_log_interval_ms));
return out;
}
inline std::string BuildFaceRecogDebugSummaryLine(
const std::string& node_id, uint64_t frame_id, const FaceRecogItem& item) {
const float sim_margin = item.best_sim - item.second_sim;
const std::string candidate = item.candidate_name.empty() ? "n/a" : item.candidate_name;
const std::string status = item.unknown ? "unknown" : "known";
std::ostringstream oss;
oss << "[ai_face_recog] match"
<< " id=" << node_id
<< " frame=" << frame_id
<< " status=" << status
<< " candidate=" << candidate
<< " candidate_id=" << item.candidate_person_id
<< " best_sim=" << std::fixed << std::setprecision(2) << item.best_sim
<< " second_sim=" << std::fixed << std::setprecision(2) << item.second_sim
<< " sim_margin=" << std::fixed << std::setprecision(2) << sim_margin
<< " bbox=(" << static_cast<int>(std::lround(item.bbox.x))
<< "," << static_cast<int>(std::lround(item.bbox.y))
<< "," << static_cast<int>(std::lround(item.bbox.w))
<< "," << static_cast<int>(std::lround(item.bbox.h))
<< ")";
return oss.str();
}
} // namespace rk3588