第三课:多路视频检测(multistream_detect)
课程目标
-
掌握
download.sh模型下载流程 -
部署并运行multistream_detect的demo
-
知道 NPU 卡资源互斥等部署注意事项
一、准备环境
1.1 硬件与网络
| 设备 | 要求 |
|---|---|
| 开发板 | RK3588 类主板 + RK1828 NPU 加速卡,已装 rknn3-rk182x-m2 运行时 |
| PC | Ubuntu,已装 adb,与板子同网段 |
| 磁盘 | PC 下载缓存约 2GB;板端 /userdata 需约 2GB |
1.2 SDK 对应目录
applications/multistream_detect/
├── download.sh # 从发布网盘按 Runtime 版本拉取资源(DEB/模型/测试视频)
├── deploy.sh # PC 端一键部署(推荐 --prebuilt 预编译模式)
├── install.sh # 板端安装/资源检查脚本(deploy.sh 会自动调用)
└── README_CN.md # 完整文档
二、任务介绍
4 路测试视频 ──> GStreamer 解码 ──> YOLOv5n 检测(行人/车辆) ──> IoU 跟踪(目标ID)
│
├─> 车牌识别
├─> VLM(Qwen3-VL-2B)画面研判 → "疑似事故"等事件
▼
C++ 数据后端 :18081 (/api/objects 等)
│
FastAPI 门户 :18080 ──> PC 浏览器看实时画面+告警列表
两个 systemd 服务:
| 服务 | 职责 |
|---|---|
multistream-detect.service |
C++ 解码、推理、跟踪、OSD 叠框,监听 18081 |
multistream-detect-traffic-web.service |
FastAPI 交通监管门户,监听 18080(网页入口) |
三、操作步骤
步骤 1:连接板子
adb connect <板子IP>:5555
adb devices # 确认 device 状态
步骤 2:一键部署(预编译模式,推荐)
cd applications/multistream_detect
./deploy.sh --prebuilt "<adb序列号>" # 只连了一台设备可省略参数
--prebuilt 会自动:读取板端 rknn-smi -v 的 RKNN3 API 版本 → 从发布网盘下载匹配的
ARM64 DEB、CNN 模型、四核 VLM 和测试视频(约 2GB)→ 推送到板端 → 安装并启动服务。
网盘账号密码已内置在
download.sh里,无需手工输入。
版本探测失败的兜底(本次实测遇到):板端 rknn-smi -v 输出 rknn3 API version: NA,
自动探测失败。确认 Runtime 实际是 1.1.0 后手动指定:
MSD_RUNTIME_VERSION=1.1.0 ./deploy.sh --prebuilt "<adb序列号>"
只下载不部署(网络差的环境可分两步):
./download.sh 1.1.0 # 资源缓存在 downloads/1.1.0/
./deploy.sh --prebuilt "<adb序列号>"
步骤 3:(可选)源码构建模式
预编译包不可用时,去掉 --prebuilt 即为源码模式——把源码推到板端现场编译安装:
./deploy.sh "<adb序列号>"
步骤 4:确认服务状态
adb shell
systemctl status multistream-detect.service multistream-detect-traffic-web.service
两个服务都应 active (running)。板端资源落位:
/userdata/multistream_detect/{models/{cv,Qwen3-VL-2B-Instruct}, test_videos, prebuilt}
/usr/bin/multistream_detect /usr/bin/run_traffic_demo.sh
/usr/share/multistream-detect/app/traffic/configs/ # 配置
四、结果验证
4.1 健康检查
adb shell curl -s http://127.0.0.1:18081/api/health # → {"status":"ok"}
adb shell curl -s http://127.0.0.1:18080/api/health # 门户(依赖 18081,刚起时可能是 degraded,稍等变 ok)
4.2 看到真实检测结果
adb shell curl -s http://127.0.0.1:18081/api/objects | head -c 500
返回形如(file0-car-131:第 0 路视频、car 类、跟踪 ID 131、置信度 0.31、归一化框坐标):
{"file0-car-131":{"class":"car","score":0.31,"bbox":[0.41,0.55,0.72,0.87],"seen_count":12,...}}
4.3 浏览器看画面(最终效果)
PC 打开 http://<板子IP>:18080/ —— 4 路视频实时画面 + 检测框 + 目标列表/告警事件。
4.4 确认 VLM 在干活
adb shell "journalctl -u multistream-detect -n 100 | grep -i image"
# 可见 VLM 多模态推理日志: '<image>描述车型和颜色' 384x384, n_image_tokens=144
五、常见问题(FAQ)
Q1:deploy.sh 提示无法读取 RKNN3 Runtime 版本?
板端跑 rknn-smi -v 看有无 rknn3 API version;若是 NA(本次实测),用
MSD_RUNTIME_VERSION=1.1.0 覆盖。另注意 rknn-smi 需要 root(adb shell 即 root);
/tmp/rknnsmi.lock 属主异常时先 rm -f /tmp/rknnsmi.lock。
Q2:deploy.sh 打印"完成",但服务起不来/日志报缺少测试视频?
deploy.sh 不检查板端 install.sh 的退出码——不要用软链接把下载目录链进
downloads/1.1.0/ 缓存(adb 只会推 333 字节的链接文件,板端校验失败)。必须用真实文件
(cp -rL)。补救:把资源手工 push 到 /userdata/multistream_detect/ 后,在板端重跑
sudo bash install.sh。
Q3:服务反复重启,日志 MODEL_SETUP ACK_FAIL?
NPU 卡被别的 AI 应用占用了(比如 rkllm3-server)。一张卡同一时刻只能跑一个 AI 应用:
pkill -f rkllm3-server 后 systemctl restart multistream-detect multistream-detect-traffic-web。
Q4:网页 18080 打得开但一直 degraded?
18081 后端还没就绪(模型加载要一会儿),curl 18081/api/health 变 ok 后刷新即可。
Q5:想开机自启?
sudo systemctl enable multistream-detect.service multistream-detect-traffic-web.service
本课小结
-
预编译一键流:download.sh(可选)→ deploy.sh --prebuilt → 浏览器 18080
-
验证要下到接口层:
/api/health看状态,/api/objects看到 class/score/bbox 才算真推理 -
NPU 卡是独占资源,多 AI 应用切换时先停旧再起新