safesight/edge/include/face/face_recog_debug.h
tian 29d9ef5d0d refactor: 项目结构梳理 - 设备端/管理端对称布局
仓库结构:
  edge/     设备端(原根目录设备端代码整体移入)
  control/  管理端(清理后)
  docs/     文档(PRD 移入 design/)
  README.md 根导航(新增)

清理:
- control/.brainstorm 临时草稿删除
- control 根级重复文档(API表/PRD_04)并入 docs/design/
- control/plan.md -> docs/implementation/control-plan.md
- control/safesightd-linux-arm64 二进制取消版本控制(.gitignore)
- edge/transform 模型转换产物归入 models/,onnx/pt 大源文件取消跟踪(.gitignore)
- Readme.md(PRD) -> docs/design/PRD_Product_v1.2.md(避开 README 大小写冲突)

更新:
- 根 README.md 导航、docs/README.md 文档索引
- deployment.md/检查表路径加 edge/ 前缀
- .gitignore 重写(edge/control 分区规则)
2026-08-02 11:39:54 +08:00

70 lines
2.4 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 = FaceRecogStateName(item.state);
std::ostringstream oss;
oss << "[ai_face_recog] match"
<< " id=" << node_id
<< " frame=" << frame_id
<< " status=" << status
<< " person_track_id=" << item.person_track_id
<< " 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();
}
inline std::string BuildFaceRecogDebugFrameLine(
const std::string& node_id, uint64_t frame_id, size_t faces_in, size_t recog_items) {
std::ostringstream oss;
oss << "[ai_face_recog] frame"
<< " id=" << node_id
<< " frame=" << frame_id
<< " faces_in=" << faces_in
<< " recog_items=" << recog_items;
return oss.str();
}
} // namespace rk3588