# yolov5-inference 本项目用于在 RK1808/aarch64 设备上运行 YOLOv5 RKNN 推理程序。程序从 RTSP 视频流或 `.h264` 文件读取 H264 数据,通过 FFmpeg 拉流、MPP 解码、RGA 转换为 `640x640 RGB`,再交给 RKNN 执行 YOLOv5 推理,最后将识别结果通过本地 HTTP 接口发给管理程序。 当前说明对应分支: ```text time_period_P_r30_linaro ``` ## 当前版本重点 本分支是在 `main` 分支基础上面向现场 RK1808 设备做的稳定性版本,重点解决: - 目标设备运行库较旧,需要使用 Linaro GCC 7.4.1 交叉编译,避免引入高版本 `glibc/libstdc++` 依赖。 - 支持按时间段控制是否执行推理。 - 支持 workspace 区域过滤,默认只上传区域内目标,也可通过 `-R` 反向为只上传区域外目标。 - 优化识别结果上报逻辑,降低多进程运行时漏帧/低置信波动造成的漏报。 - 增加低置信度、过滤原因、上传决策等日志,便于现场复盘。 ## 与 main 分支的区别 当前分支相对 `main` 的主要修改点: - 交叉编译路线固定为 WSL + Linaro GCC 7.4.1。 - `CMakeLists.txt` 中直接指定 aarch64 Linaro 工具链。 - 新增 `--time-period` / `-P` 参数,用于配置推理生效时间段。 - `--threshold` / `-r` 阈值限制为 `30` 到 `90`,即 `0.30` 到 `0.90`。 - 新增低置信度检测日志和可选截图脚本 `low_conf_snapshot.sh`。 - 替换旧的连续帧去抖逻辑: - 旧逻辑要求同一数量连续稳定多帧才上传,资源紧张或漏帧时可能上传 `number=0`。 - 当前逻辑检测到目标就上传正例 `number > 0`。 - 未检测到目标时只记录日志,不主动上传 `number=0`。 - 同一最终业务编码 `class_idx` 每 `500ms` 最多上传一次正例。 - `0.30 <= prop < threshold` 的弱命中也参与正例上传,用于降低漏报。 - 修复 h264 分段文件轮转时 `fpSave` 局部变量遮蔽风险,并在退出时关闭文件句柄。 ## 模型文件 模型文件放在程序运行目录下,假设模型名为 `abc`,需要准备: ```text ./abc/abc.rknn ./abc/abc.txt ./abc/abc_code.txt ``` 说明: - `abc.rknn`:RKNN 模型文件。 - `abc.txt`:类别名称文件,一行一个类别。 - `abc_code.txt`:类别对应的业务编码,一行一个整数。 如果多个类别在 `abc_code.txt` 中配置成同一个编码,程序上传前会按同一个 `class_idx` 合并数量。 ## 编译 详细交叉编译说明见: ```text docs/cross_compile_wsl_linaro.md ``` 推荐在 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 file /home/smos/yolov5-linaro-build/yolov5 /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' /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 ``` 预期: - `file` 显示 `ELF 64-bit LSB executable, ARM aarch64`。 - 高版本 `GLIBC_2.33`、`GLIBC_2.34`、`GLIBCXX_3.4.29` 检查没有输出。 - RKNN 链接显示 `librknn_api.so`。 ## 运行 常用参数: ```text -s, --server RTSP 地址或 h264 文件路径 -m, --model 模型名,默认 yolov5s -c, --camera-id 摄像头 ID,必填 -t, --type-id 管理程序事件类型 -p, --upload-port 管理程序本地 HTTP 端口 -w, --workspace 检测区域,多边形点坐标,逗号分隔 -r, --threshold 置信度阈值,整数 30 到 90 -P, --time-period 推理生效时间段 -R, --reverse-workspace 反向 workspace 过滤,上传 -w 区域外目标 ``` 示例: ```bash ./yolov5 \ -s rtsp://127.0.0.1/live \ -m abc \ -c camera001 \ -t 19 \ -p 8080 \ -r 60 ``` workspace 示例: ```bash ./yolov5 -s input.h264 -m abc -c camera001 -t 19 -p 8080 -w 100,100,500,100,500,500,100,500 ``` 反向 workspace 示例: ```bash ./yolov5 -s input.h264 -m abc -c camera001 -t 19 -p 8080 -w 100,100,500,100,500,500,100,500 -R ``` 开启 `-R` 后,`-w` 画出的区域会作为排除区域:区域内目标不上报,只上报区域外目标。`-R` 必须配合 `-w` 使用。 如果不传 `-w`,默认全画面有效。 time-period 示例: ```bash ./yolov5 -s input.h264 -m abc -c camera001 -t 19 -p 8080 -P 08:00:00-18:00:00 ``` 排除某些时间段: ```bash ./yolov5 -s input.h264 -m abc -c camera001 -t 19 -p 8080 -P '!00:00:00-06:00:00,22:00:00-23:59:59' ``` ## 输出与日志 程序会创建摄像头目录: ```text /usr/data/camera// /usr/data/camera//picsave/ /usr/data/camera//frames/ ``` h264 分段文件会写到: ```text /usr/data/camera//