Files
Test_AI/MULTI_CAMERA_README.md
2026-01-20 11:14:10 +08:00

271 lines
8.6 KiB
Markdown
Raw Permalink 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.

# 多摄像头 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或联系开发者。