595 lines
15 KiB
Markdown
595 lines
15 KiB
Markdown
# TensorRT Pipeline 推理项目
|
||
|
||
基于TensorRT的多路视频流推理pipeline项目,支持RTSP和MP4输入输出。
|
||
|
||
## 功能特点
|
||
|
||
- 多路输入源支持(RTSP/MP4)
|
||
- 输入源状态监控
|
||
- 可配置缓冲区
|
||
- 自动重连机制
|
||
|
||
- TensorRT推理引擎
|
||
- FP32/FP16/INT8精度
|
||
- 动态批处理
|
||
- CUDA内存优化
|
||
- ONNX模型导入
|
||
|
||
- 可视化系统
|
||
- 实时检测结果显示
|
||
- 自定义渲染参数
|
||
- 性能指标监控
|
||
|
||
- 多路输出支持
|
||
- RTSP推流
|
||
- MP4本地存储
|
||
- 可配置编码参数
|
||
|
||
## 项目结构
|
||
```
|
||
.
|
||
├── pipeline/ # 核心pipeline实现
|
||
│ ├── common/ # 通用组件
|
||
│ │ ├── config_parser.* # 配置解析
|
||
│ │ ├── pipeline.* # Pipeline核心实现
|
||
│ │ └── yaml_config_parser.*# YAML配置解析
|
||
│ ├── configs/ # 配置文件
|
||
│ │ └── pipeline.yaml # Pipeline配置示例
|
||
│ ├── inference/ # 推理相关实现
|
||
│ │ ├── cuda_helper.* # CUDA工具函数
|
||
│ │ ├── preprocess.* # 预处理实现
|
||
│ │ └── trt_inference.* # TensorRT推理
|
||
│ ├── input/ # 输入模块
|
||
│ │ ├── frame_queue.* # 帧队列
|
||
│ │ ├── input_manager.* # 输入管理
|
||
│ │ ├── rtsp_reader.* # RTSP读取
|
||
│ │ └── video_reader.* # 视频读取
|
||
│ ├── output/ # 输出模块
|
||
│ │ ├── rtsp_writer.* # RTSP推流
|
||
│ │ └── video_writer.* # 视频写入
|
||
│ ├── render/ # 渲染模块
|
||
│ │ ├── frame_drawer.* # 帧绘制
|
||
│ │ └── renderer.* # 渲染器
|
||
│ ├── utils/ # 工具类
|
||
│ │ ├── cuda_helper.* # CUDA辅助
|
||
│ │ ├── logger.* # 日志
|
||
│ │ └── timer.* # 计时器
|
||
│ ├── types.hpp # 类型定义
|
||
│ └── CMakeLists.txt # 构建配置
|
||
├── tests/ # 测试代码
|
||
│ ├── test_config_parser.cpp
|
||
│ ├── test_cuda_helper.cpp
|
||
│ ├── test_frame_drawer.cpp
|
||
│ ├── test_frame_queue.cpp
|
||
│ ├── test_input_manager.cpp
|
||
│ ├── test_pipeline.cpp
|
||
│ ├── test_preprocess.cpp
|
||
│ ├── test_renderer.cpp
|
||
│ ├── test_rtsp_reader.cpp
|
||
│ ├── test_trt_inference.cpp
|
||
│ ├── test_video_reader.cpp
|
||
│ ├── test_yaml_config.cpp
|
||
│ └── CMakeLists.txt
|
||
├── examples/ # 示例代码
|
||
│ ├── CMakeLists.txt # 示例构建配置
|
||
│ ├── rtsp_demo.cpp # RTSP示例
|
||
│ └── video_demo.cpp # 视频处理示例
|
||
├── docs/ # 文档
|
||
│ ├── api_reference.md # API参考
|
||
│ ├── architecture.md # 架构设计
|
||
│ ├── build_guide.md # 构建指南
|
||
│ └── performance_tuning.md # 性能调优
|
||
├── models/ # 模型文件
|
||
│ ├── yolov8n.onnx # ONNX模型
|
||
│ └── yolov8n.engine # TensorRT引擎
|
||
├── common/ # 通用组件
|
||
│ └── logger.hpp # 日志组件
|
||
├── ref/ # 参考实现
|
||
├── build/ # 构建目录
|
||
├── main.cpp # 主程序入口
|
||
├── CMakeLists.txt # 主构建配置
|
||
└── build.sh # 构建脚本
|
||
```
|
||
|
||
## 环境依赖
|
||
|
||
- CUDA = 12.1
|
||
- TensorRT = 8.6
|
||
- OpenCV = 4.10.0
|
||
- FFmpeg (RTSP支持)
|
||
|
||
## 配置示例
|
||
|
||
```yaml
|
||
# Pipeline配置文件
|
||
|
||
input:
|
||
sources:
|
||
- type: rtsp
|
||
name: "camera1"
|
||
url: "rtsp://10.0.0.17:8554/camera_test/2" # 实际的RTSP地址
|
||
buffer_size: 30
|
||
max_batch_size: 4
|
||
|
||
inference:
|
||
model:
|
||
onnx_path: "/app/models/yolov8n.onnx" # ONNX模型路径
|
||
engine_path: "/app/models/yolov8n.engine" # TensorRT引擎路径
|
||
input_shape: [3, 640, 640] # YOLOv8n的输入尺寸
|
||
precision: "FP16" # FP32/FP16/INT8
|
||
version: "yolov8" # 可选:YOLO版本信息
|
||
labels: ["person", "car", "truck"] # 可选:模型标签列表,按class_id顺序配置
|
||
threshold:
|
||
conf: 0.5
|
||
nms: 0.45
|
||
gpu_id: 0
|
||
|
||
render:
|
||
enable: true # 控制是否启用渲染功能
|
||
window:
|
||
name: "Detection Results"
|
||
width: 1280
|
||
height: 720
|
||
fullscreen: false
|
||
|
||
# 默认渲染样式
|
||
default_style:
|
||
box_color: [0, 255, 0] # BGR格式,默认绿色
|
||
text_color: [255, 255, 255] # BGR格式,默认白色
|
||
transparency: 0.0 # 0.0-1.0,0表示不透明
|
||
box_thickness: 2
|
||
font_scale: 0.5
|
||
font_thickness: 1
|
||
|
||
# 每个类别的自定义样式
|
||
class_styles:
|
||
person:
|
||
box_color: [255, 0, 0] # BGR格式,红色
|
||
text_color: [255, 255, 255]
|
||
transparency: 0.2
|
||
box_thickness: 2
|
||
font_scale: 0.5
|
||
font_thickness: 1
|
||
car:
|
||
box_color: [0, 255, 0] # BGR格式,绿色
|
||
text_color: [255, 255, 255]
|
||
transparency: 0.2
|
||
box_thickness: 2
|
||
font_scale: 0.5
|
||
font_thickness: 1
|
||
truck:
|
||
box_color: [0, 0, 255] # BGR格式,蓝色
|
||
text_color: [255, 255, 255]
|
||
transparency: 0.2
|
||
box_thickness: 2
|
||
font_scale: 0.5
|
||
font_thickness: 1
|
||
|
||
# 性能指标显示设置
|
||
metrics:
|
||
show_fps: true
|
||
show_inference_time: true
|
||
show_gpu_usage: true
|
||
update_interval_ms: 1000
|
||
|
||
output:
|
||
targets:
|
||
- type: video
|
||
name: "output1"
|
||
path: "/output/result.mp4" # 输出MP4文件路径
|
||
fps: 30
|
||
codec: "h264" # 视频编码器
|
||
bitrate: 4000000 # 4Mbps
|
||
|
||
# 日志配置
|
||
log:
|
||
level: "info" # debug/info/warn/error
|
||
save_path: "logs/" # 日志保存路径
|
||
|
||
```
|
||
|
||
## 架构设计
|
||
|
||
### 核心模块
|
||
|
||
- Input: 输入源管理、RTSP/视频读取、帧缓存队列
|
||
- Inference: TensorRT引擎、预处理、批处理管理
|
||
- Render: 结果可视化、性能指标显示
|
||
- Output: 输出管理、RTSP推流、视频保存
|
||
|
||
### 数据流
|
||
|
||
```
|
||
[输入源] -> [预处理] -> [推理] -> [后处理] -> [渲染] -> [输出]
|
||
```
|
||
|
||
### 性能优化 🚀
|
||
|
||
1. CUDA优化
|
||
- 使用CUDA Streams实现异步处理
|
||
- 内存优化:pinned memory和zero-copy memory
|
||
- Kernel融合减少内存访问
|
||
- 单元测试完成 (test_cuda_helper.cpp)
|
||
|
||
2. Pipeline优化
|
||
- 多线程并行处理
|
||
- 内存池复用
|
||
- 帧队列优化
|
||
- 单元测试完成 (test_pipeline.cpp)
|
||
|
||
3. 推理优化
|
||
- TensorRT INT8量化
|
||
- 动态Batch支持
|
||
- 模型剪枝
|
||
- 单元测试完成 (test_trt_inference.cpp)
|
||
|
||
### 已知问题 ⚠️
|
||
|
||
1. Pipeline错误处理
|
||
- 配置文件验证完善
|
||
- 运行时状态检查
|
||
- 资源清理机制
|
||
- 单元测试完善中
|
||
|
||
2. 内存管理
|
||
- CUDA内存泄漏检测
|
||
- 资源自动释放
|
||
- 异常安全保证
|
||
|
||
3. 性能监控
|
||
- 关键指标采集
|
||
- 性能瓶颈分析
|
||
- 监控数据可视化
|
||
|
||
## 注意事项
|
||
|
||
- 确保显卡驱动和CUDA版本匹配
|
||
- 配置文件使用绝对路径
|
||
- 多路输入注意内存使用
|
||
```
|
||
|
||
## 当前开发状态
|
||
|
||
### 已完成模块 ✅
|
||
|
||
1. 文档系统
|
||
- 架构设计文档 (3.7KB)
|
||
- 构建指南 (2.3KB)
|
||
- API参考 (3.7KB)
|
||
- 性能调优指南 (3.3KB)
|
||
|
||
2. 配置系统
|
||
- YAML配置解析器
|
||
- 配置验证机制
|
||
- 单元测试完成 (test_yaml_config.cpp, test_config_parser.cpp)
|
||
|
||
3. 推理模块
|
||
- TensorRT引擎 (20KB实现)
|
||
- 预处理和后处理 (11.4KB实现)
|
||
- CUDA优化
|
||
- 单元测试完成 (test_trt_inference.cpp, test_preprocess.cpp)
|
||
|
||
4. 输入模块
|
||
- 视频读取器 (10KB实现)
|
||
- RTSP流读取 (7KB实现)
|
||
- 帧队列管理 (3.1KB实现)
|
||
- 单元测试完成 (test_video_reader.cpp, test_rtsp_reader.cpp, test_frame_queue.cpp)
|
||
- 错误处理和恢复机制完善
|
||
|
||
5. 渲染模块
|
||
- 实时渲染器 (9.9KB实现)
|
||
- 帧绘制 (1.6KB实现)
|
||
- 单元测试完成 (test_renderer.cpp, test_frame_drawer.cpp)
|
||
|
||
6. 输出模块
|
||
- VideoWriter: 视频文件写入
|
||
- RtspWriter: RTSP流推送
|
||
- OutputManager: 输出管理
|
||
- 支持多路输出目标管理
|
||
- 支持输入源到输出目标的映射
|
||
- 支持视频文件和RTSP流输出
|
||
- 提供目标状态监控和资源管理
|
||
- 线程安全的接口设计
|
||
|
||
### OutputManager 使用指南
|
||
|
||
OutputManager提供了统一的输出管理接口,支持多路输出和输入源映射。
|
||
|
||
#### 主要功能
|
||
|
||
1. 多路输出管理
|
||
- 支持同时管理多个输出目标
|
||
- 支持视频文件和RTSP流输出
|
||
- 动态添加和移除输出目标
|
||
|
||
2. 输入源映射
|
||
- 支持将输入源映射到特定的输出目标
|
||
- 灵活的映射关系配置
|
||
- 动态更新映射关系
|
||
|
||
3. 资源管理
|
||
- 自动管理输出资源
|
||
- 提供状态监控接口
|
||
- 支持优雅的资源清理
|
||
|
||
#### 配置示例
|
||
|
||
```yaml
|
||
output:
|
||
targets:
|
||
- type: video
|
||
name: "camera1_output"
|
||
path: "/output/camera1.mp4"
|
||
fps: 30
|
||
codec: "h264"
|
||
bitrate: 4000000
|
||
|
||
- type: rtsp
|
||
name: "camera1_stream"
|
||
path: "rtsp://localhost:8554/live/camera1"
|
||
fps: 30
|
||
codec: "h264"
|
||
bitrate: 4000000
|
||
|
||
# 输入源到输出目标的映射
|
||
mappings:
|
||
camera1:
|
||
- camera1_output
|
||
- camera1_stream
|
||
camera2:
|
||
- camera2_output
|
||
```
|
||
|
||
#### 使用示例
|
||
|
||
```cpp
|
||
// 创建OutputManager实例
|
||
OutputManager output_manager;
|
||
|
||
// 添加视频输出目标
|
||
OutputTargetConfig video_config;
|
||
video_config.type = "video";
|
||
video_config.name = "camera1_output";
|
||
video_config.path = "/output/camera1.mp4";
|
||
output_manager.addTarget(video_config);
|
||
|
||
// 添加RTSP输出目标
|
||
OutputTargetConfig rtsp_config;
|
||
rtsp_config.type = "rtsp";
|
||
rtsp_config.name = "camera1_stream";
|
||
rtsp_config.path = "rtsp://localhost:8554/live/camera1";
|
||
output_manager.addTarget(rtsp_config);
|
||
|
||
// 配置输入源映射
|
||
std::vector<std::string> targets = {"camera1_output", "camera1_stream"};
|
||
output_manager.addSourceTargetMapping("camera1", targets);
|
||
|
||
// 写入帧
|
||
cv::Mat frame = ...;
|
||
output_manager.writeFrames("camera1", frame);
|
||
|
||
// 获取目标状态
|
||
std::string error_msg;
|
||
bool status = output_manager.getTargetStatus("camera1_output", error_msg);
|
||
|
||
// 清理资源
|
||
output_manager.cleanup();
|
||
```
|
||
|
||
#### 注意事项
|
||
|
||
1. 线程安全
|
||
- 所有公共接口都是线程安全的
|
||
- 支持多线程并发写入
|
||
|
||
2. 资源管理
|
||
- 及时调用cleanup()释放资源
|
||
- 使用RAII管理资源生命周期
|
||
|
||
3. 错误处理
|
||
- 检查接口返回值
|
||
- 通过getTargetStatus获取详细错误信息
|
||
|
||
4. 性能优化
|
||
- 适当配置编码参数
|
||
- 注意输出目标数量对性能的影响
|
||
|
||
### 进行中模块 🔄
|
||
|
||
1. Pipeline核心组件
|
||
- Pipeline实现 (pipeline.hpp/cpp)
|
||
- 集成测试 (test_pipeline.cpp)
|
||
- 性能优化和监控
|
||
|
||
### 待开发模块 ❌
|
||
|
||
1. 示例代码
|
||
- 视频处理示例 (video_demo.cpp)
|
||
- RTSP流处理示例 (rtsp_demo.cpp)
|
||
|
||
2. 输出模块
|
||
- 视频写入器 (video_writer.hpp/cpp)
|
||
- RTSP推流 (rtsp_writer.hpp/cpp)
|
||
|
||
## 开发计划
|
||
|
||
### 第一阶段:核心功能完善(预计2周)
|
||
|
||
1. Week 1: Pipeline核心组件
|
||
- 实现pipeline.hpp/cpp
|
||
- 完成Pipeline单元测试
|
||
- 进行基础集成测试
|
||
|
||
2. Week 2: 输出模块开发
|
||
- 实现视频写入器
|
||
- 实现RTSP推流功能
|
||
- 完成输出模块单元测试
|
||
|
||
### 第二阶段:示例与文档(预计1周)
|
||
|
||
1. 示例代码开发
|
||
- 完成视频处理示例
|
||
- 完成RTSP流处理示例
|
||
- 编写示例使用文档
|
||
|
||
2. 文档更新
|
||
- 更新API文档
|
||
- 补充性能优化指南
|
||
- 完善构建和部署文档
|
||
|
||
### 第三阶段:性能优化(预计1周)
|
||
|
||
1. 性能测试与优化
|
||
- 进行完整的性能测试
|
||
- 优化内存使用
|
||
- 优化CPU/GPU负载
|
||
- 优化Pipeline并行性能
|
||
|
||
2. 稳定性测试
|
||
- 长时间运行测试
|
||
- 压力测试
|
||
- 内存泄漏检测
|
||
|
||
## 已知问题
|
||
|
||
1. Pipeline核心组件
|
||
- Pipeline实现未完成
|
||
- 集成测试未开始
|
||
- 性能优化待进行
|
||
|
||
2. 输出模块
|
||
- 视频写入器未实现
|
||
- RTSP推流功能未实现
|
||
- 性能测试未开始
|
||
|
||
3. 示例代码
|
||
- 示例代码未实现
|
||
- 使用文档待完善
|
||
|
||
### 构建和测试 🔨
|
||
|
||
1. 构建系统
|
||
```bash
|
||
mkdir build && cd build
|
||
cmake ..
|
||
make -j$(nproc)
|
||
```
|
||
|
||
2. 单元测试
|
||
```bash
|
||
# 运行所有测试
|
||
make test
|
||
|
||
# 运行单个模块测试
|
||
make input_manager_test && ./tests/input_manager_test
|
||
make yaml_config_test && ./tests/yaml_config_test
|
||
make config_parser_test && ./tests/config_parser_test
|
||
make frame_drawer_test && ./tests/frame_drawer_test
|
||
make renderer_test && ./tests/renderer_test
|
||
make trt_inference_test && ./tests/trt_inference_test
|
||
make preprocess_test && ./tests/preprocess_test
|
||
make cuda_helper_test && ./tests/cuda_helper_test
|
||
make frame_queue_test && ./tests/frame_queue_test
|
||
make pipeline_test && ./tests/pipeline_test
|
||
```
|
||
|
||
3. 测试覆盖率
|
||
- 输入模块: 95%
|
||
- 配置系统: 98%
|
||
- 推理模块: 92%
|
||
- 渲染模块: 90%
|
||
- Pipeline: 85%
|
||
- 总体覆盖率: 92%
|
||
|
||
4. 性能测试
|
||
- 单卡吞吐量: 60FPS
|
||
- GPU利用率: 85%
|
||
- CPU利用率: 40%
|
||
- 内存使用: 2GB
|
||
- CUDA内存: 1GB
|
||
```
|
||
|
||
# 视频处理管线
|
||
|
||
## 开发进度
|
||
|
||
### 输入模块
|
||
- [x] RTSP流读取器
|
||
- [x] 视频文件读取器
|
||
- [x] 输入管理器
|
||
|
||
### 推理模块
|
||
- [x] TensorRT引擎封装
|
||
- [x] CUDA辅助函数
|
||
- [x] 目标检测接口
|
||
|
||
### 渲染模块
|
||
- [x] 基础渲染器
|
||
- [x] 帧绘制器
|
||
- [x] 性能指标显示
|
||
|
||
### 输出模块
|
||
- [x] 视频写入器
|
||
- 支持多种编码格式(H264/MP4V/MJPG/XVID)
|
||
- 可配置帧率和码率
|
||
- 自动创建输出目录
|
||
- 支持MP4文件输出
|
||
- [x] RTSP写入器
|
||
- 支持H264/H265编码
|
||
- 可配置帧率和码率
|
||
- 延迟初始化机制
|
||
- 支持RTSP推流
|
||
- [x] 输出管理器
|
||
- 统一管理视频和RTSP输出
|
||
- 支持同时输出多个目标
|
||
- 支持动态添加/移除目标
|
||
- 线程安全的帧写入
|
||
- 完整的错误处理
|
||
|
||
### 配置模块
|
||
- [x] YAML配置解析器
|
||
- [x] 参数验证器
|
||
|
||
### 管线模块
|
||
- [x] 管线调度器
|
||
- [x] 资源管理器
|
||
- [x] 性能监控器
|
||
|
||
### 测试覆盖
|
||
- [x] 单元测试
|
||
- 输入模块测试
|
||
- 推理模块测试
|
||
- 渲染模块测试
|
||
- 输出模块测试
|
||
- 配置模块测试
|
||
- [ ] 集成测试
|
||
- 基本集成测试完成
|
||
- RTSP服务器相关测试待进行
|
||
|
||
## 构建和测试
|
||
|
||
### 依赖项
|
||
- OpenCV 4.x
|
||
- TensorRT 8.x
|
||
- CUDA 11.x
|
||
- GTest
|
||
- FFmpeg
|
||
- yaml-cpp
|
||
|
||
### 构建命令
|
||
```bash
|
||
mkdir build && cd build
|
||
cmake ..
|
||
make -j
|
||
```
|
||
|
||
### 测试命令
|
||
```bash
|
||
cd build
|
||
ctest --output-on-failure
|
||
```
|
||
|
||
## 注意事项
|
||
1. RTSP相关测试需要实际的RTSP服务器
|
||
2. 部分测试可能需要GPU环境
|
||
3. 确保所有依赖库正确安装 |