Add inference snapshot notify client
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
# Codex 快速上下文:Windows + WSL + Linaro 交叉编译
|
||||
|
||||
这份文档主要给 Codex 在新聊天里快速恢复上下文用。用户希望中文回复,并希望每次回复末尾带一个简短的“上下文快照”。
|
||||
|
||||
## 必须记住
|
||||
|
||||
- 项目 Windows 路径:`C:\Users\Smos.DESKTOP-6MT98U8\Desktop\yolov5-inference`
|
||||
- WSL 对应路径:`/mnt/c/Users/Smos.DESKTOP-6MT98U8/Desktop/yolov5-inference`
|
||||
- 目标平台:aarch64 Linux
|
||||
- 目标设备运行库较旧,约为 `GLIBC 2.28`
|
||||
- 不要使用过新的 Ubuntu/Debian 交叉工具链,避免产物依赖 `GLIBC_2.33`、`GLIBC_2.34`、`GLIBCXX_3.4.29`
|
||||
- 当前使用 Linaro GCC 7.4.1:
|
||||
`/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu`
|
||||
- 工具链必须放在 WSL Linux 文件系统中,不要放在 `/mnt/c/...`,否则符号链接可能损坏并触发 `liblto_plugin.so: file too short`
|
||||
- C++ 标准保持 `C++14`
|
||||
- RKNN 链接库使用 `rknn_api`,不要改成 `rknnrt`
|
||||
|
||||
## 当前 CMake 路线
|
||||
|
||||
当前 `CMakeLists.txt` 已直接设置交叉编译器:
|
||||
|
||||
```cmake
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
||||
set(TOOLCHAIN_PATH "/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu" CACHE PATH "Linaro GCC 7.4.1 aarch64 toolchain path")
|
||||
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/aarch64-linux-gnu-gcc)
|
||||
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/aarch64-linux-gnu-g++)
|
||||
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PATH}/aarch64-linux-gnu/libc)
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||
```
|
||||
|
||||
因此常规构建时可以直接 `cmake <source>`,不一定需要额外传 `-DCMAKE_TOOLCHAIN_FILE`。仓库里还有 `toolchain-aarch64.cmake`,但当前主路线以 `CMakeLists.txt` 里的 Linaro 配置为准。
|
||||
|
||||
## 推荐编译命令
|
||||
|
||||
在 Windows PowerShell 中调用 WSL:
|
||||
|
||||
```powershell
|
||||
wsl -d Ubuntu bash -lc "rm -rf /home/smos/yolov5-linaro-build && mkdir -p /home/smos/yolov5-linaro-build && cd /home/smos/yolov5-linaro-build && cmake /mnt/c/Users/Smos.DESKTOP-6MT98U8/Desktop/yolov5-inference && make -j16 && file yolov5"
|
||||
```
|
||||
|
||||
产物位置:
|
||||
|
||||
```text
|
||||
/home/smos/yolov5-linaro-build/yolov5
|
||||
```
|
||||
|
||||
## 验证命令
|
||||
|
||||
检查工具链版本:
|
||||
|
||||
```bash
|
||||
/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --version
|
||||
/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --version
|
||||
```
|
||||
|
||||
预期包含:
|
||||
|
||||
```text
|
||||
Linaro GCC 7.4-2019.02
|
||||
```
|
||||
|
||||
检查产物架构:
|
||||
|
||||
```bash
|
||||
file /home/smos/yolov5-linaro-build/yolov5
|
||||
```
|
||||
|
||||
预期包含:
|
||||
|
||||
```text
|
||||
ELF 64-bit LSB executable, ARM aarch64
|
||||
```
|
||||
|
||||
检查是否误依赖高版本 glibc/libstdc++:
|
||||
|
||||
```bash
|
||||
/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-readelf --version-info /home/smos/yolov5-linaro-build/yolov5 | grep -E 'GLIBC_2\.33|GLIBC_2\.34|GLIBCXX_3\.4\.29'
|
||||
```
|
||||
|
||||
没有输出才是好结果。
|
||||
|
||||
检查 RKNN 链接:
|
||||
|
||||
```bash
|
||||
/home/smos/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-readelf -d /home/smos/yolov5-linaro-build/yolov5 | grep rknn
|
||||
```
|
||||
|
||||
预期包含:
|
||||
|
||||
```text
|
||||
librknn_api.so
|
||||
```
|
||||
|
||||
## 常见错误
|
||||
|
||||
- `liblto_plugin.so: file too short`:工具链放在 Windows 文件系统导致符号链接损坏。把工具链重新 clone 到 `/home/smos/...`
|
||||
- `GLIBC_2.33` / `GLIBC_2.34 not found`:用了过新的工具链或 sysroot。改回 Linaro GCC 7.4.1
|
||||
- `GLIBCXX_3.4.29 not found`:用了过新的 g++ 或 C++ runtime。保持 Linaro GCC 7.4.1、C++14、`rknn_api`
|
||||
|
||||
## 每次回复规则
|
||||
|
||||
用户希望每次回复末尾附带“上下文快照”,方便开新聊天避免上下文压缩丢信息。
|
||||
|
||||
Codex 看不到精确的上下文剩余额度或百分比,所以不要编造数字。可以在快照中写:
|
||||
|
||||
```text
|
||||
上下文额度:无法读取精确数值;当前仅能提供风险状态和关键信息摘要。
|
||||
```
|
||||
|
||||
当对话变长、文件内容很多、输出很大或任务跨多轮时,提醒用户可以开启新聊天,并把上下文快照复制过去。
|
||||
@@ -0,0 +1,84 @@
|
||||
# 推理程序去抖与漏报优化记录
|
||||
|
||||
本文记录 `time_period_P_r30_linaro` 分支上的去抖和正例上报优化,方便复查代码改动。
|
||||
|
||||
## 现场问题
|
||||
|
||||
1808 设备上同时运行 6 到 7 个推理程序时,资源紧张会造成推理结果波动。旧逻辑要求同一类别数量连续稳定 3 次才上传,短暂漏检或低置信过滤可能让结果稳定成 `number=0`,随后又上传 `number=1`。
|
||||
|
||||
管理程序只处理 `number > 0` 的识别消息,并根据持续时间判断是否触发后续视频合并和上报;目标消失不需要推理程序主动通知。因此推理程序侧不应主动上传 `number=0`。
|
||||
|
||||
## 新逻辑
|
||||
|
||||
- 当前推理帧只要在 workspace 内检测到可上传目标,就进入正例候选。
|
||||
- `prop >= conf_threshold` 记为 `strong_present`。
|
||||
- `0.30 <= prop < conf_threshold` 记为 `weak_present`,第一版也参与正例上传,用于降低漏报。
|
||||
- `prop < 0.30` 记为 `filtered_low_conf`,不参与上传。
|
||||
- workspace 外目标记为 `filtered_workspace`,始终不参与上传。
|
||||
- 当前帧无可上传目标时,只记录 `no_target`,不上传 `number=0`。
|
||||
|
||||
## 上传节流
|
||||
|
||||
同一最终上传编码 `class_idx` 每 `500ms` 最多上传一次正例:
|
||||
|
||||
```text
|
||||
首次检测到某 class_idx:立即上传
|
||||
持续检测到同一 class_idx:每 500ms 最多上传一次
|
||||
未检测到:不上报,只记日志
|
||||
```
|
||||
|
||||
上传 JSON 结构保持不变:
|
||||
|
||||
```text
|
||||
serial
|
||||
type
|
||||
at
|
||||
params[].class_idx
|
||||
params[].name
|
||||
params[].number
|
||||
```
|
||||
|
||||
多个模型 label 如果映射到同一个 `class_idx`,继续合并数量后上传。`codes[i] == 0` 的类别仍不上传。
|
||||
|
||||
## 日志字段
|
||||
|
||||
本次增加/规范以下日志事件,写入可执行文件目录下 `.log/YYYY-MM-DD-yolov5.log`:
|
||||
|
||||
- `frame_seen`:本次推理帧序号和原始检测数量。
|
||||
- `strong_present`:超过阈值且在 workspace 内。
|
||||
- `weak_present`:高于 0.30、低于阈值且在 workspace 内。
|
||||
- `filtered_low_conf`:低于 0.30。
|
||||
- `filtered_workspace`:不在 workspace 内。
|
||||
- `upload_positive`:本帧触发正例上传。
|
||||
- `upload_skip_throttle`:本帧有目标,但 500ms 节流跳过。
|
||||
- `upload_skip_code0`:类别编码为 0,按旧规则不上传。
|
||||
- `upload_skip_busy`:已有上传线程正在执行,跳过本次上传。
|
||||
- `no_target`:本帧没有可上传目标。
|
||||
- `upload_positive_payload`:实际组装进 JSON 的正例载荷。
|
||||
|
||||
日志清理策略:
|
||||
|
||||
- 程序启动后第一次写日志会清理旧日志。
|
||||
- 程序长期运行跨天后,第一次打开新日期日志时也会清理旧日志。
|
||||
- 只清理 `.log` 目录下命名匹配 `YYYY-MM-DD-yolov5.log` 的文件。
|
||||
- 默认保留最近约 7 天日志。
|
||||
|
||||
## 额外风险修复
|
||||
|
||||
`main.cpp` 中 h264 分段轮转原来在内部重新声明了 `FILE *fpSave`,会遮蔽外层文件句柄。现在改为更新外层 `fpSave`,并在退出主循环后关闭当前句柄。
|
||||
|
||||
## 验收场景
|
||||
|
||||
- `1,0,1`:上传正例;中间 `0` 只记 `no_target`,不上传 `number=0`。
|
||||
- `1,弱命中,1`:弱命中参与正例链路,持续上传或被节流跳过,不归零。
|
||||
- `0,0,0`:只记录 `no_target`,不上传。
|
||||
- workspace 外目标:只记录 `filtered_workspace`,不上传。
|
||||
- 多 label 同 `class_idx`:合并成同一个业务编码上传。
|
||||
|
||||
## 编译验证
|
||||
|
||||
按 `docs/cross_compile_wsl_linaro.md` 的 WSL + Linaro 路线编译,并检查:
|
||||
|
||||
- 产物为 aarch64 ELF。
|
||||
- 不依赖 `GLIBC_2.33`、`GLIBC_2.34`、`GLIBCXX_3.4.29`。
|
||||
- 仍链接 `librknn_api.so`。
|
||||
@@ -0,0 +1,101 @@
|
||||
# 上传链路修复与项目结构说明
|
||||
|
||||
## 本次修改
|
||||
|
||||
本次修改目标是让推理程序只负责当前帧识别结果上报,不在推理侧处理抖动、持续时间或漏报补偿。
|
||||
|
||||
- 只有 `prop >= conf_threshold` 且目标在 workspace 内,才进入 upload 候选。
|
||||
- `0.30 <= prop < conf_threshold` 只记录为 `weak_present`,不上传。
|
||||
- `prop < 0.30` 只记录为 `filtered_low_conf`,不上传。
|
||||
- 低置信截图功能已停用:`maybe_trigger_low_conf_snapshot` 仍保留在代码中,但当前没有调用点。
|
||||
- 取消推理侧三帧稳定门槛,抖动和持续时间判断交给管理程序。
|
||||
- 取消 500ms upload 节流逻辑,当前帧满足上传条件就尝试上报;如果已有上传线程正在运行,则记录 `upload_skip_busy`。
|
||||
- 保留同一 `class_idx` 的多 label 合并上传逻辑。
|
||||
- upload 日志保留复查字段:`label`、`number`、`prop`、`box`、`edge_touch`、`left_edge`、`boxes`、`rga`。
|
||||
- upload busy 状态改为创建线程前预约、线程结束后释放,避免连续帧在上传线程尚未置位前重复创建多个上传线程。
|
||||
|
||||
## 命令行与日志
|
||||
|
||||
命令行输出恢复为主分支风格,不再受日志采样影响:
|
||||
|
||||
- 低于阈值:`skip prop = ... for class ...`
|
||||
- workspace 内且超过阈值:`in result ...`
|
||||
- workspace 外:`not in result ...`
|
||||
|
||||
日志系统与命令行输出分离:
|
||||
|
||||
- `.log` 里的详细检测事件如 `frame_seen`、`strong_present`、`weak_present`、`filtered_workspace`、`filtered_low_conf` 仍按采样策略记录。
|
||||
- `upload_positive` 和 `upload_positive_payload` 每次真实上传都会记录。
|
||||
- `edge_touch=1` 表示目标框贴到 640x640 模型输入边界,`left_edge=1` 表示贴左边界;这两个字段只用于复查,不影响上传判断。
|
||||
- `rga=` 记录最近一次 RGA 输入输出信息,如源宽高、stride、640x640 目标区域和上下填充位置,便于对照 RTSP 现场流和回放视频。
|
||||
- `frame=` 是推理回调序号,不等同于主循环中的 `handling [N]th frame`。
|
||||
|
||||
## 心跳包
|
||||
|
||||
管理程序源码已拉到本地 `rk1808-tool/` 用于对照。
|
||||
|
||||
当前管理程序的 `/video/post` 入口在 `rk1808-tool/controllers/report.go`,接收 JSON 结构为:
|
||||
|
||||
```text
|
||||
serial
|
||||
at
|
||||
type
|
||||
params[].name
|
||||
params[].class_idx
|
||||
params[].number
|
||||
```
|
||||
|
||||
推理程序保留 60 秒本地心跳日志,但不再通过 `/video/post` 上传心跳:
|
||||
|
||||
- `HEARTBEAT_SECS = 60`
|
||||
- 如果 60 秒内没有正例 upload,只记录 `heartbeat_log_only ... upload=0`。
|
||||
- 心跳不会生成 `heartbeat_payload`,也不会进入 `/video/post`。
|
||||
- 推理程序禁止主动上传 `number=0`;`upload_info` 也会防御性跳过 `total_number <= 0`。
|
||||
- 原因:当前 `rk1808-tool` 的 `InsertEvent` 用 `class_idx` 作为全局缓存 key,不区分摄像头;任意摄像头的 `number=0` 都可能取消同一 `class_idx` 的真实事件。
|
||||
|
||||
当前这份 `rk1808-tool` 代码里,重启推理程序主要依赖子进程退出后的 `RunAsDaemon` finalizer 触发 `CheckNeedRestart`;未看到独立的“收不到心跳就重启”逻辑。
|
||||
|
||||
## 当前项目结构
|
||||
|
||||
主要源码:
|
||||
|
||||
- `main.cpp`:参数解析、RTSP 读取、视频分段保存、解码主循环。
|
||||
- `rknn.cpp` / `rknn.h`:推理回调、检测结果过滤、日志、upload 和心跳逻辑。
|
||||
- `yolov5.cc` / `yolov5.h`:RKNN 模型初始化与推理调用。
|
||||
- `postprocess.cc` / `postprocess.h`:后处理、label/code 加载。
|
||||
- `vertix.cpp` / `vertix.h`:workspace 多边形过滤。
|
||||
- `utils.cpp` / `utils.h`:HTTP JSON 上传、时间工具等。
|
||||
|
||||
依赖目录:
|
||||
|
||||
- `rknn/`:RKNN 头文件和库。
|
||||
- `mpp/`:Rockchip MPP 头文件和库。
|
||||
- `rga/`:RGA 头文件和库。
|
||||
- `ffmpeg/`:FFmpeg 头文件和库。
|
||||
- `cjson/`:JSON 处理库。
|
||||
|
||||
文档与辅助:
|
||||
|
||||
- `docs/cross_compile_wsl_linaro.md`:WSL + Linaro 交叉编译说明。
|
||||
- `docs/debounce_positive_upload_plan.md`:早期去抖和日志方案记录,仅作历史参考。
|
||||
- `rk1808-tool/`:本地拉取的管理程序源码,用于对照 `/video/post` 和重启逻辑。
|
||||
|
||||
## 构建产物
|
||||
|
||||
按 Linaro 路线构建:
|
||||
|
||||
```powershell
|
||||
wsl -d Ubuntu bash -lc "mkdir -p /home/smos/yolov5-linaro-build && cd /home/smos/yolov5-linaro-build && cmake /mnt/c/Users/Smos.DESKTOP-6MT98U8/Desktop/yolov5-inference && make -j16 && file yolov5"
|
||||
```
|
||||
|
||||
当前产物位置:
|
||||
|
||||
```text
|
||||
/home/smos/yolov5-linaro-build/yolov5
|
||||
```
|
||||
|
||||
验证要点:
|
||||
|
||||
- 产物是 `ARM aarch64` ELF。
|
||||
- 链接 `librknn_api.so`。
|
||||
- 不应出现 `GLIBC_2.33`、`GLIBC_2.34`、`GLIBCXX_3.4.29` 依赖。
|
||||
Reference in New Issue
Block a user