C++中用TensorRT与多线程进行模型推理

C++与TensorRT推理,在C,C++环境中进行,可在各种安装了这种环境的边缘设备上运行,要安装CUDA,CUDNN,支持GPU,设备要安装英伟达可编程显卡(GPU),同时还要安装TensorRT,TensorRT安装方法在我的另一篇文章中已有说明:推理引擎TensorRT安装与多线程推理(Python)(推理引擎TensorRT安装与多线程推理(Python)_tensorrt多个任务并行推理-优快云博客

C++多线程模型推理,可看另外一个作者的文章:TensorRT部署yolov8目标检测任务,地址:https://zhuanlan.zhihu.com/p/681591561?utm_id=0,代码地址:https://github.com/cyberyang123/Learning-TensorRT

我这里在Ubuntu系统上安装了Clion,在Clion中配置运行项目。

Clion中创建一个C++Executable项目,属于cmake类型项目。

配置CMake options

在下图中的CMake options中填下这行命令,让CMake能够找到nvcc编译器:

-DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc

如果系统已安装了Opecv并且需要用到,还要回上下面命令:

-DopenCV_DIR=/opt/software/build

两个命令之间用空格分开,如下图:

配置CMakeLists.txt

我这里CMakeLists.txt中代码如下所示:

cmake_minimum_required(VERSION 3.28)

project(Demo)

set(CMAKE_CXX_STANDARD 17)

set(CUDA_NVCC_FLAGS -g;-G) # c++: error: unrecognized command-line option '-G'

set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda)

dependent library, the next warning / error will give you more info.

/opt/venv/python39venv/lib/python3.9/site-packages/torch/share/cmake)

set(OPENCV_INCLUDE /opt/software/opencv-4.x/include)

set(OPENCV_LIB /opt/software/opencv-4.x/lib)

set(TENSORRT_INCLUDE /opt/software/TensorRT-10.2.0.19/include)

set(TENSORRT_LIB /opt/software/TensorRT-10.2.0.19/lib)

include_directories(${TENSORRT_INCLUDE} ${OPENCV_INCLUDE} ${CUDA_TOOLKIT_ROOT_DIR}/include )

# 收集所有库文件

file(GLOB OPENCV_LIBS ${OPENCV_LIB}/*.so)

# 收集 CUDA TensorRT 库文件

file(GLOB CUDA_LIBS ${CUDA_TOOLKIT_ROOT_DIR}/lib64/*.so)

file(GLOB TENSORRT_LIBS ${TENSORRT_LIB}/*.so)

add_executable(Demo main.cpp

detect.cpp

preprocessing.hpp

yolov8_utils.cpp

)

target_link_libraries(Demo ${OPENCV_LIBS} ${TENSORRT_LIBS} ${CUDA_LIBS})

其他代码类似上面的github中代码,然后在运行设置中添加一个CMake Application类型的设置,再点保存按钮。

如果项目没有编译错误,正常情况下,选这个配置可运行成功。

### YOLO 线程池检测实现方法 #### 使用线程池优化YOLOv5多视频流处理 为了提高YOLOv5在多视频流环境下的效率,可以采用Python中的`concurrent.futures.ThreadPoolExecutor`来创建线程池。这种方式允许并发执行多个视频流的检测任务,从而显著提升系统的吞吐量和响应速度。 ```python from concurrent.futures import ThreadPoolExecutor, as_completed import cv2 import torch def process_video_stream(stream_url): model = torch.hub.load('ultralytics/yolov5', 'yolov5s') cap = cv2.VideoCapture(stream_url) while True: ret, frame = cap.read() if not ret: break results = model(frame) # 处理结果... cap.release() stream_urls = ["rtsp://example.com/stream1", "rtsp://example.com/stream2"] with ThreadPoolExecutor(max_workers=4) as executor: futures = {executor.submit(process_video_stream, url): url for url in stream_urls} for future in as_completed(futures): try: future.result() except Exception as exc: print(f'Video processing generated an exception: {exc}') ``` 此代码片段展示了如何利用线程池管理多个视频流的同时处理[^2]。每个工作线程负责读取特定URL对应的视频帧,并调用YOLOv5模型进行目标检测。通过设置适当数量的工作线程(`max_workers`),可以根据硬件条件调整并发度以达到最佳性能。 #### TensorRT加速YOLOv5推理过程 对于更进一步的速度改进,还可以考虑使用NVIDIA TensorRT框架对YOLOv5模型进行量化和优化。TensorRT专为高性能AI推理设计,在GPU平台上提供了出色的延迟表现和能效比。结合上述提到的线程池技术,可以在保持高精度的前提下大幅缩短每张图片的平均推断时间。 ```bash # 安装必要的依赖库 pip install nvidia-pyindex pip install nvidia-tensorrt # 导入tensorrt模块并定义转换函数 import tensorrt as trt TRT_LOGGER = trt.Logger(trt.Logger.WARNING) def build_engine(onnx_file_path): with trt.Builder(TRT_LOGGER) as builder, \ builder.create_network() as network, \ trt.OnnxParser(network, TRT_LOGGER) as parser: builder.max_workspace_size = 1 << 30 builder.max_batch_size = 1 builder.fp16_mode = True with open(onnx_file_path, 'rb') as model: parser.parse(model.read()) return builder.build_cuda_engine(network) ``` 这段脚本说明了怎样基于ONNX格式导出的YOLOv5模型文件构建一个适用于CUDA设备上的TensorRT引擎实例。之后便可在实际应用中替换原有的PyTorch推理逻辑,转而使用更加高效快速的TensorRT版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值