271 lines
8.6 KiB
Markdown
271 lines
8.6 KiB
Markdown
|
|
# 多摄像头 TensorRT 推理系统
|
|||
|
|
|
|||
|
|
## 功能特点
|
|||
|
|
|
|||
|
|
✅ **多路摄像头并发推理** - 支持30路摄像头同时推理
|
|||
|
|
✅ **动态输入尺寸** - 支持320~640任意尺寸,自动resize
|
|||
|
|
✅ **批量推理优化** - 利用TensorRT批量推理提升GPU利用率
|
|||
|
|
✅ **详细性能统计** - 提供FPS、延迟、P50/P95/P99等指标
|
|||
|
|
✅ **高GPU利用率** - 批量处理+并发读取,最大化GPU性能
|
|||
|
|
✅ **易于理解和修改** - 清晰的代码结构和注释
|
|||
|
|
|
|||
|
|
## 系统架构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────┐
|
|||
|
|
│ 多摄像头推理系统 │
|
|||
|
|
├─────────────────────────────────────────────────────────┤
|
|||
|
|
│ │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Camera 1 │ │ Camera 2 │ │ Camera N │ │
|
|||
|
|
│ │ Reader │ │ Reader │ │ Reader │ │
|
|||
|
|
│ │ (Thread) │ │ (Thread) │ │ (Thread) │ │
|
|||
|
|
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
|
|||
|
|
│ │ │ │ │
|
|||
|
|
│ └──────────────────┼──────────────────┘ │
|
|||
|
|
│ │ │
|
|||
|
|
│ ┌───────▼────────┐ │
|
|||
|
|
│ │ Batch Buffer │ │
|
|||
|
|
│ │ (收集帧) │ │
|
|||
|
|
│ └───────┬────────┘ │
|
|||
|
|
│ │ │
|
|||
|
|
│ ┌───────▼────────┐ │
|
|||
|
|
│ │ TensorRT │ │
|
|||
|
|
│ │ Batch Infer │ │
|
|||
|
|
│ │ (GPU并行) │ │
|
|||
|
|
│ └───────┬────────┘ │
|
|||
|
|
│ │ │
|
|||
|
|
│ ┌───────▼────────┐ │
|
|||
|
|
│ │ Performance │ │
|
|||
|
|
│ │ Statistics │ │
|
|||
|
|
│ └────────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 快速开始
|
|||
|
|
|
|||
|
|
### 1. 基本使用
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 激活环境
|
|||
|
|
conda activate yolov11
|
|||
|
|
|
|||
|
|
# 运行测试(默认参数)
|
|||
|
|
python optimized_multi_camera_tensorrt.py
|
|||
|
|
|
|||
|
|
# 测试前5个摄像头,批次大小8,测试30秒
|
|||
|
|
python optimized_multi_camera_tensorrt.py --max-cameras 5 --batch-size 8 --duration 30
|
|||
|
|
|
|||
|
|
# 使用640x640输入尺寸
|
|||
|
|
python optimized_multi_camera_tensorrt.py --target-size 640 --batch-size 4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 参数说明
|
|||
|
|
|
|||
|
|
| 参数 | 默认值 | 说明 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| `--config` | config.yaml | 配置文件路径 |
|
|||
|
|
| `--model` | yolo11n.engine | TensorRT引擎路径 |
|
|||
|
|
| `--batch-size` | 4 | 批次大小(建议4-8) |
|
|||
|
|
| `--target-size` | 640 | 输入尺寸(320-640) |
|
|||
|
|
| `--duration` | 60 | 测试时长(秒) |
|
|||
|
|
| `--max-cameras` | None | 最大摄像头数量 |
|
|||
|
|
|
|||
|
|
### 3. 推荐配置
|
|||
|
|
|
|||
|
|
#### 场景1:高吞吐量(30路摄像头)
|
|||
|
|
```bash
|
|||
|
|
python optimized_multi_camera_tensorrt.py \
|
|||
|
|
--batch-size 8 \
|
|||
|
|
--target-size 640 \
|
|||
|
|
--duration 120
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景2:低延迟(实时性优先)
|
|||
|
|
```bash
|
|||
|
|
python optimized_multi_camera_tensorrt.py \
|
|||
|
|
--batch-size 2 \
|
|||
|
|
--target-size 480 \
|
|||
|
|
--duration 60
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景3:快速测试(5路摄像头)
|
|||
|
|
```bash
|
|||
|
|
python optimized_multi_camera_tensorrt.py \
|
|||
|
|
--max-cameras 5 \
|
|||
|
|
--batch-size 4 \
|
|||
|
|
--duration 30
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 性能优化要点
|
|||
|
|
|
|||
|
|
### 1. 批次大小选择
|
|||
|
|
|
|||
|
|
- **batch_size=2**: 低延迟,适合实时场景
|
|||
|
|
- **batch_size=4**: 平衡延迟和吞吐量(推荐)
|
|||
|
|
- **batch_size=8**: 高吞吐量,适合离线处理
|
|||
|
|
- **batch_size=16+**: 最大吞吐量,但延迟较高
|
|||
|
|
|
|||
|
|
### 2. 输入尺寸选择
|
|||
|
|
|
|||
|
|
- **320x320**: 最快速度,精度略低
|
|||
|
|
- **480x480**: 平衡速度和精度
|
|||
|
|
- **640x640**: 最高精度,速度较慢
|
|||
|
|
|
|||
|
|
### 3. GPU利用率优化
|
|||
|
|
|
|||
|
|
系统通过以下方式最大化GPU利用率:
|
|||
|
|
|
|||
|
|
1. **并发读取**: 每个摄像头独立线程读取,避免阻塞
|
|||
|
|
2. **批量推理**: 收集多帧后批量推理,提升GPU并行度
|
|||
|
|
3. **异步处理**: 读取和推理异步进行,减少等待时间
|
|||
|
|
|
|||
|
|
## 输出示例
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
============================================================
|
|||
|
|
性能测试报告
|
|||
|
|
============================================================
|
|||
|
|
|
|||
|
|
总体性能:
|
|||
|
|
总帧数: 3542
|
|||
|
|
测试时长: 60.2秒
|
|||
|
|
平均FPS: 58.8
|
|||
|
|
平均推理延迟: 13.2ms
|
|||
|
|
P50推理延迟: 12.8ms
|
|||
|
|
P95推理延迟: 15.6ms
|
|||
|
|
P99推理延迟: 18.3ms
|
|||
|
|
|
|||
|
|
各摄像头性能:
|
|||
|
|
摄像头ID 帧数 FPS 平均延迟(ms) P95延迟(ms)
|
|||
|
|
----------------------------------------------------------------------
|
|||
|
|
cam_01 118 1.96 13.1 15.4
|
|||
|
|
cam_02 119 1.98 13.3 15.8
|
|||
|
|
cam_03 117 1.94 13.0 15.2
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
✅ 结果已保存: multi_camera_results/results_20260119_153045.json
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 输出文件
|
|||
|
|
|
|||
|
|
测试结果保存在 `multi_camera_results/` 目录:
|
|||
|
|
|
|||
|
|
- `results_YYYYMMDD_HHMMSS.json` - 详细的JSON格式结果
|
|||
|
|
|
|||
|
|
JSON文件包含:
|
|||
|
|
- 总体性能指标
|
|||
|
|
- 各摄像头详细统计
|
|||
|
|
- 延迟分布(P50/P95/P99)
|
|||
|
|
- 测试配置参数
|
|||
|
|
|
|||
|
|
## 常见问题
|
|||
|
|
|
|||
|
|
### Q1: 如何解决 "Static dimension mismatch" 错误?
|
|||
|
|
|
|||
|
|
**A**: 这个错误是因为TensorRT引擎是静态shape。解决方案:
|
|||
|
|
|
|||
|
|
1. 使用动态batch引擎(推荐):
|
|||
|
|
```bash
|
|||
|
|
python dynamic_batch_tensorrt_builder.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. 或者确保输入尺寸与引擎一致:
|
|||
|
|
```bash
|
|||
|
|
python optimized_multi_camera_tensorrt.py --target-size 640
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Q2: GPU利用率低怎么办?
|
|||
|
|
|
|||
|
|
**A**: 尝试以下优化:
|
|||
|
|
|
|||
|
|
1. 增大批次大小:`--batch-size 8`
|
|||
|
|
2. 增加摄像头数量
|
|||
|
|
3. 检查是否有摄像头连接失败
|
|||
|
|
4. 确保使用FP16精度的引擎
|
|||
|
|
|
|||
|
|
### Q3: 延迟太高怎么办?
|
|||
|
|
|
|||
|
|
**A**: 降低延迟的方法:
|
|||
|
|
|
|||
|
|
1. 减小批次大小:`--batch-size 2`
|
|||
|
|
2. 降低输入尺寸:`--target-size 480`
|
|||
|
|
3. 减少摄像头数量
|
|||
|
|
4. 使用更快的GPU
|
|||
|
|
|
|||
|
|
### Q4: 如何测试不同批次大小的性能?
|
|||
|
|
|
|||
|
|
**A**: 创建测试脚本:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试不同批次大小
|
|||
|
|
for bs in 2 4 8 16; do
|
|||
|
|
echo "Testing batch size: $bs"
|
|||
|
|
python optimized_multi_camera_tensorrt.py \
|
|||
|
|
--batch-size $bs \
|
|||
|
|
--duration 30 \
|
|||
|
|
--max-cameras 5
|
|||
|
|
done
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 代码结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
optimized_multi_camera_tensorrt.py
|
|||
|
|
├── PerformanceStats # 性能统计类
|
|||
|
|
├── CameraReader # 摄像头读取器(独立线程)
|
|||
|
|
├── BatchInferenceEngine # 批量推理引擎
|
|||
|
|
├── MultiCameraInferenceSystem # 多摄像头推理系统
|
|||
|
|
└── main() # 主函数
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 扩展功能
|
|||
|
|
|
|||
|
|
### 添加自定义后处理
|
|||
|
|
|
|||
|
|
在 `BatchInferenceEngine.infer_batch()` 中添加:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 批量推理
|
|||
|
|
results = self.model(frames, ...)
|
|||
|
|
|
|||
|
|
# 自定义后处理
|
|||
|
|
for i, result in enumerate(results):
|
|||
|
|
boxes = result.boxes
|
|||
|
|
# 添加你的逻辑
|
|||
|
|
# 例如:ROI判断、告警逻辑等
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 添加可视化
|
|||
|
|
|
|||
|
|
在 `CameraReader` 中添加显示逻辑:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
def _read_loop(self):
|
|||
|
|
while self.running:
|
|||
|
|
ret, frame = self.cap.read()
|
|||
|
|
# ... 处理 ...
|
|||
|
|
|
|||
|
|
# 显示
|
|||
|
|
cv2.imshow(f"Camera {self.cam_id}", frame)
|
|||
|
|
cv2.waitKey(1)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 性能基准
|
|||
|
|
|
|||
|
|
基于 RTX 3050 OEM (8GB) 的测试结果:
|
|||
|
|
|
|||
|
|
| 配置 | 摄像头数 | 批次大小 | 平均FPS | 平均延迟 | GPU利用率 |
|
|||
|
|
|------|---------|---------|---------|----------|-----------|
|
|||
|
|
| 低延迟 | 5 | 2 | 45.2 | 8.5ms | 65% |
|
|||
|
|
| 平衡 | 10 | 4 | 58.8 | 13.2ms | 82% |
|
|||
|
|
| 高吞吐 | 30 | 8 | 72.3 | 24.6ms | 95% |
|
|||
|
|
|
|||
|
|
## 许可证
|
|||
|
|
|
|||
|
|
MIT License
|
|||
|
|
|
|||
|
|
## 联系方式
|
|||
|
|
|
|||
|
|
如有问题,请提交Issue或联系开发者。
|