safesight-edge/docs/stress_test_5ch_face_recog.md
2026-02-28 16:27:34 +08:00

540 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RK3588 5路人脸识别全流程压力测试方案
本文档描述在单台 RK3588 设备上进行 5 路人脸识别全流程视频处理的压力测试方案。
**方案说明:** 本方案使用单一 RTSP 视频源 (`rtsp://10.0.0.49:8554/cam`)5 条流水线独立处理同一路输入,模拟 5 路摄像头并发场景。
---
## 1. 测试目标
### 1.1 核心指标
| 指标项 | 目标值 | 说明 |
|--------|--------|------|
| **并发路数** | 5 路 | 单设备同时处理 5 路视频 |
| **输入分辨率** | 1280×720 @ 30fps | 每路输入为 720p 实时视频 |
| **端到端延迟** | ≤ 500ms | 从采集到输出的完整延迟 |
| **NPU 利用率** | ≥ 70% | NPU 高效利用,但不超载 |
| **CPU 占用** | ≤ 60% | 预留系统余量 |
| **内存占用** | ≤ 3GB | 避免内存压力 |
| **运行稳定性** | 24 小时无崩溃 | 长稳测试 |
### 1.2 全流程覆盖
测试需覆盖所有节点类型:
```
[共享输入源]
┌────────────────┼────────────────┬────────────────┐
│ │ │ │
[Pipeline 1] [Pipeline 2] [Pipeline 3] [Pipeline 4] [Pipeline 5]
│ │ │ │ │
input_rtsp input_rtsp input_rtsp input_rtsp input_rtsp
│ │ │ │ │
preprocess preprocess preprocess preprocess preprocess
│ │ │ │ │
ai_yolo ──→ tracker ─┤ ai_yolo ──→ tracker (目标检测+跟踪)
│ │ │ │ │
face_det ──→ face_recog (人脸检测+识别)
│ │ │ │ │
└──────────→ osd ←─────────────────────────────────────────────┘
preprocess (后处理)
publish (RTSP/HLS 输出)
alarm (目标报警)
```
**节点类型统计(每路):**
- **Source (1)**`input_rtsp`
- **Filter (7)**`preprocess`×2, `ai_yolo`, `ai_face_det`, `ai_face_recog`, `tracker`, `osd`
- **Sink (2)**`alarm`, `publish`
**5路总计**
- 5 个 input_rtsp 节点(连接同一 RTSP 源)
- 35 个 Filter 节点
- 10 个 Sink 节点
---
## 2. 测试环境要求
### 2.1 硬件要求
| 项目 | 规格 | 说明 |
|------|------|------|
| **主控芯片** | RK3588 | 4×A76@2.4GHz + 4×A55@1.8GHz |
| **NPU** | 6 TOPS@INT8 | 用于 AI 推理 |
| **内存** | ≥ 8GB LPDDR4/LPDDR5 | 建议 8GB 或以上 |
| **存储** | ≥ 32GB eMMC/SSD | 用于 HLS 切片存储 |
| **网络** | 千兆以太网 | 单路 4-8Mbps 输入5路约 20-40Mbps |
| **散热** | 主动散热 | 长时间高负载运行 |
### 2.2 软件要求
| 项目 | 版本/配置 | 说明 |
|------|-----------|------|
| **操作系统** | Ubuntu 22.04 / Debian 11 | ARM64 架构 |
| **内核** | Linux 5.10+ | 需支持 RGA、MPP、DMA-BUF |
| **NPU 驱动** | rknpu driver 0.9.6+ | 建议最新版本 |
| **CMake** | ≥ 3.20 | 构建工具 |
| **GCC** | ≥ 10.0 | 编译器 |
### 2.3 依赖库检查
```bash
# 检查 NPU 驱动
ls /dev/rknpu
# 检查 RGA 驱动
ls /dev/rga
# 检查内存
free -h
# 检查存储空间
df -h
```
### 2.4 视频源要求
| 项目 | 要求 | 说明 |
|------|------|------|
| **视频源类型** | RTSP Server | 建议使用 ffmpeg 或 ZLMediaKit 推流 |
| **视频源数量** | 1 路共享流 | 5 条流水线共用同一输入 |
| **视频规格** | 1280×720 @ 30fps, H.264 | 模拟真实摄像头 |
| **码率** | 4-8 Mbps | 总输入带宽 4-8 Mbps |
| **内容要求** | 包含行人和人脸 | 用于验证检测和识别功能 |
**视频源准备命令(在 10.0.0.49 服务器执行):**
```bash
# 使用 ffmpeg 推送 1 路 720p 测试流
ffmpeg -re -stream_loop -1 -i test_video.mp4 \
-c:v libx264 -preset fast -b:v 4M -r 30 -s 1280x720 \
-f rtsp rtsp://0.0.0.0:8554/cam
# 或使用 ZLMediaKit 等 RTSP 服务器
```
**测试视频内容建议:**
- 包含行人移动(验证目标检测和跟踪)
- 包含正脸人像(验证人脸识别)
- 时长 5-10 分钟,循环播放
### 2.5 外部服务要求
| 服务 | 用途 | 配置 |
|------|------|------|
| **MinIO** | 报警截图/录像存储 | 地址: `10.0.0.49:9000`<br>Bucket: `myminio`<br>账号: `minioadmin/minioadmin` |
**MinIO 准备(在 10.0.0.49 上执行):**
```bash
# 创建 bucket
mc alias set myminio http://10.0.0.49:9000 minioadmin minioadmin
mc mb myminio/myminio
```
---
## 3. 测试配置文件
### 3.1 主配置文件
配置文件路径:`configs/stress_5ch_face_recog.json`
**配置特点:**
- 5 个独立 Graphcam1 ~ cam5
- 所有 Graph 的输入 RTSP URL 相同:`rtsp://10.0.0.49:8554/cam`
- 每路共用 RTSP 端口 8555通过路径区分/live/cam1 ~ /live/cam5
- 包含人脸识别全流程节点
**节点配置详情(每路):**
| 节点 | 类型 | 作用 | 关键参数 |
|------|------|------|----------|
| `input_rtsp` | source | 拉取 RTSP 流 | 1280×720@30fps, use_mpp=true |
| `preprocess` | filter | 图像预处理 | 720p → 768×768 RGB, resize_mode=letterbox, use_rga=true |
| `ai_yolo` | filter | 目标检测 | best-768.rknn, v8, conf=0.35, nms=0.45, infer_fps=10, num_classes=11, class_filter=[3,6] |
| `tracker` | filter | 目标跟踪 | bytetrack_lite, max_age_ms=1500, track_classes=[3,6] |
| `face_det` | filter | 人脸检测 | RetinaFace_mobile320.rknn, conf=0.7, max_faces=10 |
| `face_recog` | filter | 人脸识别 | mobilefacenet_arcface.rknn, align=true, max_faces=10, threshold.accept=0.45 |
| `osd` | filter | 屏幕显示 | draw_bbox=true, draw_text=true, draw_face_det=true, draw_face_bbox=true |
| `preprocess` | filter | 后处理 | 640×640 → 720p NV12, use_rga=true |
| `publish` | sink | 视频输出 | h264, 30fps, 2000kbps, RTSP+HLS |
| `alarm` | sink | 目标报警 | eval_fps=10, MinIO上传截图+录像 |
**输出端口分配:**
| Graph | RTSP 端口 | RTSP 路径 | HLS 路径 |
|-------|-----------|-----------|----------|
| cam1 | 8555 | `/live/cam1` | `./web/hls/cam1/index.m3u8` |
| cam2 | 8555 | `/live/cam2` | `./web/hls/cam2/index.m3u8` |
| cam3 | 8555 | `/live/cam3` | `./web/hls/cam3/index.m3u8` |
| cam4 | 8555 | `/live/cam4` | `./web/hls/cam4/index.m3u8` |
| cam5 | 8555 | `/live/cam5` | `./web/hls/cam5/index.m3u8` |
**模型文件清单:**
| 模型文件 | 路径 | 说明 |
|----------|------|------|
| best-768.rknn | `./models/best-768.rknn` | YOLOv8 PPE检测 (11 classes使用3,6) |
| RetinaFace_mobile320.rknn | `./models/RetinaFace_mobile320.rknn` | 人脸检测 |
| mobilefacenet_arcface.rknn | `./models/mobilefacenet_arcface.rknn` | 人脸识别 |
| face_gallery_cam1.db | `./models/face_gallery_cam1.db` | 人脸库 (cam1) |
| face_gallery_cam2.db | `./models/face_gallery_cam2.db` | 人脸库 (cam2) |
| face_gallery_cam3.db | `./models/face_gallery_cam3.db` | 人脸库 (cam3) |
| face_gallery_cam4.db | `./models/face_gallery_cam4.db` | 人脸库 (cam4) |
| face_gallery_cam5.db | `./models/face_gallery_cam5.db` | 人脸库 (cam5) |
---
## 4. 测试步骤
### 4.1 环境准备
```bash
# 1. 检查 NPU 驱动
ls /dev/rknpu
# 2. 检查内存
free -h
# 3. 检查存储空间
df -h
# 4. 准备模型文件
ls models/
# 应有best-640.rknn, RetinaFace_mobile320.rknn, mobilefacenet_arcface.rknn
# 以及人脸库face_gallery_cam1.db ~ face_gallery_cam5.db
# 5. 创建 HLS 输出目录
mkdir -p web/hls/cam{1,2,3,4,5}
# 6. 检查网络连接
ping 10.0.0.49
```
### 4.2 启动视频源
在服务器10.0.0.49)上执行:
```bash
# 推送单路 720p 测试流
ffmpeg -re -stream_loop -1 -i test_video.mp4 \
-c:v libx264 -preset fast -b:v 4M -r 30 -s 1280x720 \
-f rtsp rtsp://0.0.0.0:8554/cam
```
### 4.3 启动测试程序
```bash
cd /home/orangepi/apps/OrangePi3588Media
# 启动 media-server
./build/media-server --config configs/stress_5ch_face_recog.json
```
### 4.4 监控脚本
创建监控脚本 `monitor_5ch.sh`
```bash
#!/bin/bash
LOG_FILE="stress_test_5ch_$(date +%Y%m%d_%H%M%S).log"
echo "Time,CPU%,MemMB,NPU%,Temp°C" > $LOG_FILE
while true; do
TIME=$(date '+%H:%M:%S')
# CPU 使用率
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
# 内存使用 (MB)
MEM=$(free -m | awk 'NR==2{printf "%.0f", $3}')
# NPU 使用率
NPU=$(cat /sys/kernel/debug/rknpu/load 2>/dev/null || echo "0")
# CPU 温度
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null | awk '{print $1/1000}')
echo "$TIME,$CPU,$MEM,$NPU,$TEMP" >> $LOG_FILE
echo "[$TIME] CPU:${CPU}% Mem:${MEM}MB NPU:${NPU}% Temp:${TEMP}°C"
sleep 5
done
```
运行监控:
```bash
chmod +x monitor_5ch.sh
./monitor_5ch.sh
```
---
## 5. 测试结果验证方法
### 5.1 功能验证
| 验证项 | 方法 | 通过标准 |
|--------|------|----------|
| **输入连接** | 查看日志 | 5 路都显示 "connected" |
| **视频输出** | VLC 播放 | `rtsp://<rk3588_ip>:8555/live/cam1` ~ `/live/cam5` 都能正常播放 |
| **HLS 输出** | 浏览器/播放器 | 5 路 HLS 流可正常播放 |
| **目标检测** | 观察 OSD 输出 | 画面中出现检测框和目标标签 |
| **人脸检测** | 观察 OSD 输出 | 人脸被框选 |
| **人脸识别** | 观察 OSD 输出 | 人脸显示姓名或 "unknown" |
| **目标跟踪** | 观察 OSD 输出 | 同一目标的 ID 保持稳定 |
| **报警触发** | 查看日志 | alarm 节点输出报警信息 |
| **MinIO 上传** | 检查 MinIO | `myminio` bucket 中有截图/录像文件 |
| **5路并发** | 同时播放5路输出 | 5路输出画面都流畅无明显卡顿 |
### 5.2 性能验证
| 指标 | 测量方法 | 通过标准 |
|------|----------|----------|
| **帧率** | 日志中 node_output_fps | ≥ 25 fps每路 |
| **延迟** | 对比输入输出时间戳 | ≤ 500ms |
| **NPU 利用率** | `/sys/kernel/debug/rknpu/load` | 50-95% |
| **CPU 占用** | `top` 命令 | ≤ 60% |
| **内存占用** | `free` 命令 | ≤ 3GB |
| **队列积压** | 日志中 queue_length | 不持续增长 |
### 5.3 稳定性验证
| 测试项 | 时长 | 通过标准 |
|--------|------|----------|
| **短稳测试** | 1 小时 | 无崩溃,无内存泄漏 |
| **中稳测试** | 8 小时 | 性能指标稳定,无异常重启 |
| **长稳测试** | 24 小时 | 无崩溃,内存增长 < 100MB |
### 5.4 验证命令示例
```bash
# 1. 检查 5 路进程状态
ps aux | grep media-server
# 2. 查看 NPU 负载
watch -n 1 cat /sys/kernel/debug/rknpu/load
# 3. 查看资源使用
htop
# 4. 播放测试(另开终端)
ffplay rtsp://localhost:8555/live/cam1 &
ffplay rtsp://localhost:8555/live/cam2 &
ffplay rtsp://localhost:8555/live/cam3 &
ffplay rtsp://localhost:8555/live/cam4 &
ffplay rtsp://localhost:8555/live/cam5 &
# 5. 检查 HLS 文件生成
ls -la web/hls/cam*/
# 6. 查看日志中的报警
tail -f media-server.log | grep alarm
# 7. 检查 MinIO 上传(在 10.0.0.49 上)
mc ls myminio/myminio
```
---
## 6. 预期结果
### 6.1 正常情况
```
┌─────────────────────────────────────────────────────────┐
│ 5 路 720p 人脸识别全流程测试预期结果 │
├─────────────────────────────────────────────────────────┤
│ • 5 路视频正常解码、处理、输出 │
│ • 端到端延迟: 200-400ms │
│ • NPU 利用率: 80-95% (目标检测+人脸检测+人脸识别) │
│ • CPU 占用: 40-60% │
│ • 内存占用: 2-3GB │
│ • 无丢帧或轻微丢帧 (< 1%) │
│ • 报警功能正常触发MinIO上传成功 │
│ • 人脸识别功能正常,能识别已知人脸 │
│ • 5路输出画面质量一致 │
└─────────────────────────────────────────────────────────┘
```
### 6.2 性能数据记录表
| 指标 | 测试前 | 1小时 | 8小时 | 24小时 |
|------|--------|-------|-------|--------|
| CPU 平均占用 | - | | | |
| CPU 峰值占用 | - | | | |
| 内存占用 (MB) | - | | | |
| NPU 平均利用率 | - | | | |
| NPU 峰值利用率 | - | | | |
| 平均延迟 (ms) | - | | | |
| 帧率 cam1 (fps) | - | | | |
| 帧率 cam2 (fps) | - | | | |
| 帧率 cam3 (fps) | - | | | |
| 帧率 cam4 (fps) | - | | | |
| 帧率 cam5 (fps) | - | | | |
| 报警次数 (目标) | - | | | |
| 人脸识别次数 | - | | | |
| MinIO 文件数 | - | | | |
| 异常重启次数 | - | | | |
### 6.3 输出验证清单
- [ ] 5 RTSP 流均可正常播放
- [ ] 5 HLS 流均可正常播放
- [ ] 画面中有检测框OSD 正常工作
- [ ] 检测到人脸时显示姓名或 "unknown"
- [ ] 目标 ID 保持稳定跟踪正常工作
- [ ] 日志中有报警输出
- [ ] MinIO `myminio` bucket 中有文件上传
- [ ] Error/Warning 刷屏
---
## 7. 故障排查
### 7.1 常见问题
| 现象 | 可能原因 | 解决方法 |
|------|----------|----------|
| **启动失败** | NPU 驱动未加载 | `ls /dev/rknpu` 检查重新加载驱动 |
| **拉流失败** | 网络不通/视频源问题 | 检查网络`ping 10.0.0.49`验证 RTSP |
| **高 CPU 占用** | RGA 未启用 | 检查配置 `use_rga: true``use_mpp: true` |
| **高延迟** | 队列积压 | 检查 `queue.size`适当调小 |
| **NPU 利用率低** | 推理频率设置过低 | 调整 `infer_fps` |
| **人脸识别失败** | 人脸库未加载 | 检查 `face_gallery_path` 配置和人脸库文件 |
| **OSD 不显示** | 格式不支持 | 确保 OSD 输入为 RGB/BGR/NV12 格式 |
| **MinIO 上传失败** | 网络/认证问题 | 检查 MinIO 地址和账号密码 |
### 7.2 调试命令
```bash
# 查看 NPU 状态
cat /sys/kernel/debug/rknpu/version
cat /sys/kernel/debug/rknpu/load
# 查看 RGA 状态
cat /sys/kernel/debug/rga/info
# 查看进程资源使用
pidof media-server | xargs -I {} ps -p {} -o pid,ppid,cmd,%cpu,%mem
# 查看线程数
ps -eLf | grep media-server | wc -l
# 查看端口占用
netstat -tlnp | grep media-server
# 查看系统日志
sudo dmesg | tail -50
```
### 7.3 日志分析
```bash
# 检查错误
grep -i "error\|fail\|warn" media-server.log | head -20
# 检查各路口连接状态
grep "input_rtsp\|connected\|disconnected" media-server.log
# 检查帧率
grep "output_fps" media-server.log | tail -20
# 检查报警触发
grep "alarm" media-server.log | tail -20
# 检查人脸识别
grep "face_recog\|face_det" media-server.log | tail -20
# 检查 MinIO 上传
grep "minio\|snapshot\|clip" media-server.log | tail -20
```
---
## 8. 测试报告模板
### 8.1 基本信息
- **测试时间**:
- **测试人员**:
- **设备型号**:
- **固件版本**:
- **软件版本**:
- **视频源**: `rtsp://10.0.0.49:8554/cam` (1280×720@30fps)
- **MinIO**: `http://10.0.0.49:9000`, bucket: `myminio`
### 8.2 测试结论
- [ ] 5 路人脸识别全流程测试通过
- [ ] 性能指标达标
- [ ] 稳定性测试通过
- [ ] MinIO 上传功能正常
- [ ] 人脸识别功能正常
### 8.3 详细数据
填入第 6 章的表格数据
### 8.4 问题记录
| 序号 | 问题描述 | 严重程度 | 状态 |
|------|----------|----------|------|
| 1 | | | |
| 2 | | | |
### 8.5 优化建议
根据测试结果填写
---
## 9. 附录
### 9.1 快速开始
```bash
# 1. 准备环境
cd /home/orangepi/apps/OrangePi3588Media
mkdir -p web/hls/cam{1,2,3,4,5}
# 2. 确认模型存在
ls models/best-640.rknn models/RetinaFace_mobile320.rknn \
models/mobilefacenet_arcface.rknn
# 3. 确认人脸库存在
ls models/face_gallery_cam{1,2,3,4,5}.db
# 4. 启动测试
./build/media-server --config configs/stress_5ch_face_recog.json
# 5. 另开终端监控
./monitor_5ch.sh
# 6. 验证输出
ffplay rtsp://localhost:8555/live/cam1
```
### 9.2 相关文档
- [Readme.md](../Readme.md) - 项目总览
- [deployment.md](deployment.md) - 部署说明
- [dag_graph_node_edge.md](architecture/dag_graph_node_edge.md) - 架构说明
### 9.3 配置文件清单
| 文件 | 说明 |
|------|------|
| `configs/stress_5ch_face_recog.json` | 5路人脸识别全流程测试配置共享源 |
| `monitor_5ch.sh` | 资源监控脚本 |