Windows+ONNX+TensorRT+YOLOV8+C++环境搭建

需求

跑通了Python环境下的Yolov8,但是考虑到性能,想试试C++环境下的优化效果。

环境

Windows11

TensorRT8.6.1.6

CUDA 12.0

cudnn 8.9.7

opencv4.5.5

VS2019

参考目录

本次搭建主要参考以下博客和视频。第一个博客以下简称“博客1”,第二个视频简称“视频1”,第三个视频简称“视频2”。

win10下 yolov8 tensorrt模型部署_tensorrt-8.4.2.4-优快云博客

【实战】win10下yolov8 tensorrt 部署_哔哩哔哩_bilibili

yolov8 tensorrt 部署自己训练的模型_哔哩哔哩_bilibili

步骤

之前已经安装了VS2019、CUDA12.0、cudnn 8.9.7,所以这几个模块安装略过。可参考博客1。

安装TensorRT

因为我本地安装的CUDA版本是12.0,所以我找了匹配的TensorRT的版本,装之前因为和上面博客中的版本不匹配,还担心后面是否能顺利跑起来,哈哈

解压,然后配置环境变量,根据自己实际路径,详细参考博客1,这里不再赘述。

安装OpenCV 

下载地址:Releases - OpenCV

我选择的是与博客1中相同的版本。其他解压,配置环境变量参考博客1。

创建属性表

创建一个空工程,我这里起名testYoloV8。这里遇到一个小坑,其实怪自己英语水平差。我的VS2019是英文的,这个属性管理器窗口,我一顿找,先是按照View->Other Windows->Properties Window,打开发现和博客1的界面不一样。后来才发现,应该是View->Property Manager这个窗口。

按照博客1中配置好各个属性表,然后添加到工程中,最后长下面这样:

这里在创建TensorRT的属性表的时候,我把lib下面所有的lib都加进去了,怕新版本和之前的不一样。

下载YOLOV8 onnx,并转成trt

我先下载了博客1中提供的Yolov8的onnx文件,然后用trtexec.exe转成了对应的trt文件,具体命令参考博客1。

配置C++工程

在上面的testYoloV8工程中进行配置,参考视频1。配置完成后,build出现1个链接错误,

查看对应的函数splitToStringVec定义在TensorRT-8.6.1.6/samples/common中的sampleUtils.h sampleUtils.cpp中,然后就把这两个文件也加到资源文件中。在build,成功了!撒花~~~

测试

在工程中设置编译命令,成功!

--model=C:/YOLOV8/ThirdParty/yolov8n.trt --size=640 --batch_size=1 --img=E:/Work/YOLO/data/bus.jpg --show --savePath E:/

使用自己的训练模型

1 首先,把自己的pt模型文件转为onnx,遇到错误,

ImportError: DLL load failed while importing onnx_cpp2py_export: 动态链接库(DLL)初始化例程失败。

解决:参考文章

ImportError: DLL load failed while importing onnx_cpp2py_export: 动态链接库(DLL)初始化例程失败。_dll load failed while importing onnx cpp2py export-优快云博客

2 把上一步转的onnx转成trt,又遇到错误,

Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.

然后,按照网上说的安装onnx-simplifier,安装失败,

然后查看了下本地的onnx是1.16.2,卸载了这个版本,安装了1.16.1版本.

pip uninstall onnx
pip install onnx=1.16.1

安装成功后,重新把pt导出onnx格式。

再把onnx转成trt格式,参考博客1。

3 C++工程中使用自己的trt运行。

需要先按照视频2修改一些配置,主要是类别和颜色。重新build,然后添加debugging命令,运行就OK了。

结论

batch_size=1的时候,C++ TensorRT的环境下比Python环境下,GPU利用率降低5%左右,如果batch_size=8,GPU能降低50%。

感谢各位大佬,尤其感谢此次搭建环境主要参考的文章和视频的作者 韩师兄!

### Jeston Orin Nano 部署 YOLOv8 TensorRT 的方法 #### 1. 环境准备 为了成功在 Jetson Orin Nano 上部署 YOLOv8 并利用 TensorRT 进行加速,首先需要完成环境搭建。这包括安装必要的依赖库以及配置开发工具链。 - **操作系统**: 建议使用 NVIDIA 提供的官方 Linux 发行版 (L4T),版本需支持 TensorRTCUDA[^2]。 - **CUDA 工具包**: 安装最新版本的 CUDA Toolkit,确保其兼容性与 Jetson 设备硬件架构相符[^3]。 - **cuDNN 库**: 下载并安装适配当前 CUDA 版本的 cuDNN 库文件[^1]。 - **TensorRT SDK**: 获取 NVIDIA TensorRT 软件开发套件,并按照文档说明完成初始化设置[^4]。 #### 2. 模型导出 YOLOv8 默认训练得到的是 PyTorch 格式的权重文件 (.pt),而 TensorRT 支持 ONNX 或者自定义引擎格式作为输入源。因此,在实际应用前还需要经历模型转换过程: ```bash pip install ultralytics # 如果尚未安装 Ultralytics 库,则先执行此命令 python export.py --model yolov8n.pt --include onnx --opset 12 ``` 上述脚本会基于指定参数生成对应的 `.onnx` 文件用于后续处理。 #### 3. 使用 `trtexec` 构建推理引擎 通过 NVIDIA 提供的命令行工具可以快速实现从 ONNX 到 TRT Engine 的转变操作: ```bash trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n.engine --workspace=4096 --fp16 ``` 这里设置了工作空间大小为 4GB (`--workspace`) 同时启用了半精度浮点运算模式(`--fp16`) 来提升性能表现。 #### 4. 编写加载逻辑代码样例 最后一步就是编写 Python/C++ 等编程语言编写的程序来调用已经创建好的 engine 文件来进行目标检测任务了。下面给出一段简单的 python 实现片段展示基本流程: ```python import tensorrt as trt from PIL import Image import numpy as np import pycuda.driver as cuda import pycuda.autoinit def load_engine(engine_file_path): with open(engine_file_path, 'rb') as f, trt.Runtime(trt.Logger()) as runtime: return runtime.deserialize_cuda_engine(f.read()) class HostDeviceMem(object): def __init__(self, host_mem, device_mem): self.host = host_mem self.device = device_mem def __str__(self): return "Host:\n" + str(self.host) + "\nDevice:\n" + str(self.device) def __repr__(self): return self.__str__() def allocate_buffers(engine): inputs = [] outputs = [] bindings = [] stream = cuda.Stream() for binding in engine: size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size dtype = trt.nptype(engine.get_binding_dtype(binding)) # Allocate host and device buffers host_mem = cuda.pagelocked_empty(size, dtype) device_mem = cuda.mem_alloc(host_mem.nbytes) # Append the device buffer to device bindings. bindings.append(int(device_mem)) # Append to input/output lists if engine.binding_is_input(binding): inputs.append(HostDeviceMem(host_mem, device_mem)) else: outputs.append(HostDeviceMem(host_mem, device_mem)) return inputs, outputs, bindings, stream if __name__ == '__main__': ENGINE_PATH = './yolov8n.engine' IMAGE_PATH = './test.jpg' image = Image.open(IMAGE_PATH).convert('RGB') img_array = np.array(image.resize((640, 640)), dtype=np.float32)/255. engine = load_engine(ENGINE_PATH) context = engine.create_execution_context() inputs, outputs, bindings, stream = allocate_buffers(engine) # Transfer data from CPU to GPU memory cuda.memcpy_htod_async(inputs[0].device, img_array.ravel(), stream) # Run inference context.execute_async_v2(bindings=bindings, stream_handle=stream.handle) # Transfer predictions back from GPU to CPU [cuda.memcpy_dtoh_async(out.host, out.device, stream) for out in outputs] # Synchronize threads after execution is done stream.synchronize() print([o.host.reshape(-1)[:10] for o in outputs]) # Print first ten elements of each output layer ``` 以上展示了如何加载预构建的 TensorRT 引擎实例化上下文对象并通过分配缓冲区传递数据给 GPU 执行推断计算最终获取结果的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值