rtsp_tensorrt/README.md

595 lines
15 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.

# 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.00表示不透明
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. 确保所有依赖库正确安装