# Benchmark 工具说明

## 目标

本工具用于在 `RK3576` 板端快速生成一份可落盘的 benchmark 数据报告，覆盖：

- `MPP YUV420 -> MJPG/H264/H265` 编码帧率
- `MPP MJPG -> YUV420` 解码帧率
- `YOLOv8 640x640` 推理速率

默认测试项：

- 视频分辨率：`720p`、`1080p`、`2k`、`4k`、`8k`
- 模型：`yolov8n`、`yolov8s`、`yolov8m`

## 设计说明

为了避免依赖外部测试样片，benchmark 工具默认采用“内部生成测试数据”的方式：

1. 编码测试
   - 自动生成各分辨率的 `YUV420SP(NV12)` 测试帧
   - 调用项目内 `MppEncoder` 分别进行 `MJPG / H264 / H265` 编码
2. 解码测试
   - 直接复用编码阶段产出的 `MJPG elementary stream`
   - 调用项目内 `MppDecoder` 进行 `MJPG -> YUV420` 解码
3. 推理测试
   - 自动生成 `640x640 NV12` 测试帧
   - 调用项目内 `Yolov8Engine::Infer`
   - 统计整次 `Infer` 调用耗时，同时单独汇总预处理与 NPU 耗时

这意味着输出结果更偏向“项目内核能力 benchmark”，适合做板端能力对比、版本回归和模型横向对比。

## 构建

```bash
cd /home/parker/Projects/rk3576_mpp_test
chmod +x scripts/build-linux.sh
./scripts/build-linux.sh
```

生成产物：

- `install/bin/rk3576_yolov8tortsp_demo`
- `install/bin/rk3576_benchmark`

## 运行

建议在板端 `install/` 目录下运行：

```bash
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"
./bin/rk3576_benchmark
```

### 常用参数

```bash
./bin/rk3576_benchmark \
  --output-dir ./benchmark_results \
  --resolutions 720p,1080p,2k,4k,8k \
  --models yolov8n,yolov8s,yolov8m \
  --codec-warmup 20 \
  --codec-frames 120 \
  --infer-warmup 20 \
  --infer-frames 200
```

### 只测试部分项目

```bash
./bin/rk3576_benchmark \
  --resolutions 1080p,4k \
  --models yolov8n,yolov8m
```

### 自定义模型目录

```bash
./bin/rk3576_benchmark --model-dir /data/models
```

## 输出文件

默认输出到 `./benchmark_results/`：

- `benchmark_summary.md`
- `video_codec_benchmark.csv`
- `yolov8_inference_benchmark.csv`

其中：

- `benchmark_summary.md`：适合直接阅读和汇报
- `video_codec_benchmark.csv`：适合导入 Excel / LibreOffice 进一步做图
- `yolov8_inference_benchmark.csv`：适合做模型性能横向比对

## 报表字段

### 编码表

- `Encode FPS`：编码吞吐率
- `Encode Avg/P95`：编码单帧平均耗时与 P95
- `Encoded Size(MB)`：测量窗口内输出码流总大小

### 解码表

- `Decode FPS`：MJPG 硬解核心吞吐率，按测量窗口内每帧 `decode_total_us` 累计计算
- `Decode Avg/P95`：解码单帧平均耗时与 P95
- `Decode Frames`：实际统计到的解码帧数 / 目标统计帧数

### 推理表

- `Infer FPS`：整次 `Infer` 调用吞吐率
- `Infer Avg/P95`：整次推理平均耗时与 P95
- `Preprocess Avg`：预处理平均耗时
- `NPU Avg`：NPU 平均耗时

## 注意事项

1. 当前视频编码 benchmark 固定测试 `MJPG / H264 / H265`
2. 当前视频解码 benchmark 固定测试 `MJPG -> YUV420`
3. 8K 测试会占用较多内存和时间，若硬件环境不足，报表中会保留失败信息
4. 推理 benchmark 使用的是合成测试帧，不代表特定真实视频内容下的检测精度，仅用于性能统计
