在当今的智能视频分析领域,如何高效处理大规模视频流并实现实时目标检测一直是一个重要挑战。为了解决这个问题,GitHub用户1461521844lijin开发了一个名为trt_yolo_video_pipeline的开源项目,该项目提供了一个基于TensorRT和YOLO系列模型的高性能视频分析处理框架。本文将详细介绍这个项目的主要特性、使用方法以及技术实现。
trt_yolo_video_pipeline项目具有以下几个突出特点:
完整的视频处理流水线:支持从视频拉流、解码、TensorRT推理、渲染到编码推流的全流程处理。
支持YOLO系列模型:可以使用YOLOv3/v4/v5/v7/v8等多种YOLO模型进行目标检测。
多GPU并行推理:支持单模型在多张GPU上运行多个实例,实现负载均衡。
GPU加速:数据前处理和后处理均在GPU上进行,最大化利用GPU算力。
硬件编解码:利用NVIDIA GPU的硬件编解码能力,节省CPU资源。
多种输入输出格式:支持RTSP、RTMP、MP4等多种视频输入格式,可输出RTSP、RTMP流或本地MP4文件。
这些特性使得该项目能够高效处理多路视频流,适用于安防监控、智慧城市等需要大规模实时视频分析的场景。
要使用trt_yolo_video_pipeline,需要配置以下环境:
项目提供了一键式环境构建脚本,可以自动安装和编译FFmpeg 和OpenCV。对于TensorRT,需要用户自行安装CUDA和TensorRT SDK。
使用时,首先需要将YOLO模型转换为TensorRT引擎文件。项目提供了onnx2trtengine.sh脚本来完成这一步骤。转换完成后,只需编写少量代码即可实现一个完整的视频分析pipeline:
#include "infer/MultipleInferenceInstances.h" #include "trt/yolo/YoloDetectPipeline.h" #include "trt/yolo/YoloDetectionInfer.h" int main() { std::string input_stream_url = "输入流路径"; std::string output_stream_url = "输出流路径"; std::string model_path = "TRTengine模型文件路径"; std::string label_path = "检测分类类别文 件路径"; // 创建多卡多实例推理对象 auto trt_instance = std::make_shared<infer::MultipleInferenceInstances<infer::YoloDetectionInfer>>( "trt_instance", {0,0,1,1}, model_path, label_path, infer::YoloType::V8, 0.25, 0.5, 16); // 创建处理pipeline auto pipeline = std::make_shared<pipeline::YoloDetectPipeline>( "test_pipeline", input_stream_url, output_stream_url, trt_instance); // 启动流水线 pipeline->Start(); getchar(); }
这段代码创建了一个使用YOLOv8模型的视频分析pipeline,支持在两张GPU上各运行两个推理实例,实现了视频输入、目标检测和结果输出的完整流程。
trt_yolo_video_pipeline的核心是一个基于有向无环图(DAG)的流水线处理结构。整个处理流程被分解为多个独立的功能节点,包括:
FFmpegReadNode: 负责视频输入,支持多种格式和协议,实现了网络波动的容错机制。
InferNode: TensorRT推理的封装,支持多个pipeline共享同一推理实例。
ImageDrawNode: 将检测结果渲染到图像上。
FFmpegPusherNode: 视频编码和推流,支持硬件编码。
FFmpegRecordNode: 本地视频录制。
这种模块化设计使得整个系统具有很高的灵活性和可扩展性。用户可以根据需求自由组合这些节点,构建自定义的处理流程。
在性能优化方面,项目采用了多项技术来提升处理效率:
TensorRT优化: 利用TensorRT对YOLO模型进行优化,显著提升推理速度。
多GPU负载均衡: 支持在多张GPU上运行多个模型实例,充分利用硬件资源。
CUDA加速: 数据预处理和后处理均在GPU上进行,减少CPU-GPU数据传输开销。
硬件编解码: 利用NVIDIA GPU的NVENC/NVDEC能力进行视频编解码,降低CPU负载。
零拷贝Pipeline: 节点间数据传递采用指针传递,避免不必要的内存拷贝。
通过这些优化,trt_yolo_video_pipeline能够在保证检测精度的同时,实现高吞吐、低延迟的实时视频分析。
trt_yolo_video_pipeline项目为大规模视频分析提供了一个高效、灵活的解决方案。它可以应用于多个领域: