[AI]从零开始的TensorRT加速推理YOLO11教程
一、前言
最近看到一种专门针对NVIDIA显卡加速推理模型项目——TensorRT,主要利用了N卡的CUDA核心对深度学习模型进行加速,既然是对深度学习模型加速,那么,只要是深度学习模型都可以加速,我们常用的YOLO模型也不例外。但是,要加速像YOLO这样的模型,需要借助一些开源项目来调用TensorRT,本次教程中用到的开源项目是“spacewalk01/yolov11-tensorrt”,那么本次教程就来教大家如何编译这个开源项目从而借助TensorRT来加速推理YOLO模型吧!
二、开始前的准备
“spacewalk01/yolov11-tensorrt”项目在编译时需要用到CUDA版的opencv,所以在编译之前我们需要先编译CUDA版的opencv,这个在下面的教程中已经说得很详细了:
CUDA版opencv编译:[AI]从零开始的Open CV CUDA编译教程_open cv 结合 ai-CSDN博客
编译好opencv后,在build目录下的install目录下存放了我们编译的内容,如图所示:
这里大家需要注意的是,我们一定要编译CUDA版的opencv,直接编译出来的opencv是不行的,编译“spacewalk01/yolov11-tensorrt”项目是肯定会报错的。
需要运行“spacewalk01/yolov11-tensorrt”项目,我们必须安装好TensorRT8.6,注意,这里必须是8.6,别的版本的TensorRT会因为找不到特定的函数而编译报错。安装TensorRT8.6又需要我们安装CUDA和CUDNN,如果你已经成功编译了opencv那么这两样东西肯定已经成功安装了。下面我们来梳理一下直到opencv编译结束安装了哪些组件:
VS:2022
Cmake:4.0.1
CUDA:12.5
CUDNN:8.9.7
OpenCV:4.11
OpenCV_contrib:4.11
如上面所示,这就是我们已经安装的模块的版本,如果你在未来的某天编译失败了,请把上方所有模块的版本固定到和我一致。
综上所述,我们已经安装了TensorRT运行必须的CUDA与CUDNN,并且已经成功编译了opencv。在开始下面的步骤前,请先保证你完成了上面模块的安装或编译。
三、TensorRT8.6的安装
因为编译“spacewalk01/yolov11-tensorrt”项目需要用到TensorRT8.6,那么现在的第一步就是安装一个TensorRT,我们可以直接在浏览器中搜索“TensorRT”,往下滑就能找到TensorRT的官网了:
进入以后,可以看到以下界面:
这里我们直接点击“Download Now”:
点击了以后,就可以看到以下界面了,我们直接点击“TensorRT8”即可:
随后就来到了关于TensorRT8所有版本的下载页面:
当然,这里可以点击下方的链接来到这个界面:
TensorRT8下载:NVIDIA TensorRT 8.x Download | NVIDIA Developer
在TensorRT8的下载界面中,我们需要勾选同意相关协议:
然后就可以看到所有的关于TensorRT8的版本的下载了:
这里我们直接展开“TensorRT 8.6 GA”即可:
往下看,就能看到windows相关的下载链接了:
同样的,我们现在来讲解一下TensorRT的命名,这里为了方便,我直接把名字复制出来了:
TensorRT 8.6 GA for Windows 10 and CUDA 12.0 and 12.1 ZIP Package
首先“TensorRT 8.6 GA”就表示了TensorRT的版本号,就不多说了,然后“Windows 10”表示这个版本的TensorRT可以运行在windows10及以上的版本上,注意,这里windows版本是10或者11以上都可以,我第一次跑的时候认为只有win10可以还特意把电脑装成win10,最后发现根本没必要。“CUDA 12.0 and 12.1”表示这个包可以运行在CUDA12.1或者以上的版本上,不用把CUDA版本固定到12.0或者12.1,一开始我也以为要固定,实则不用。比如你在编译CUDA版本的opencv时使用的CUDA版本是12.5,那么在这儿就维持12.5即可。但是需要注意一点,假如你的opencv是使用12.5编译的那么这个CUDA版本就不要动了,后面在编译“spacewalk01/yolov11-tensorrt”时如果使用了别的CUDA版本会链接不到opencv。
简单的讲解了TensorRT的名字以后,我们继续来下载,这里我们直接点击下载链接即可:
过一会儿浏览器就会弹出下载了:
大家将其下载到自己能找到的地方即可:
解压后,得到以下文件夹:
进入这个文件夹中,就可以看到以下内容了:
在这里同样有我们熟悉的“bin”,“include”,“lib”目录:
为了TensorRT能够正常运行,我们需要将这三个目录添加到环境变量中,关于环境变量的添加方法在之前opencv的编译教程中已经讲得很详细了,这里就不多说了,添加完成以后如图所示:
这里环境变量大家一定要确定没有问题。在确定没有问题以后,我们直接新开一个终端,在终端输入下面的命令观察TensorRT是否配置好:
trtexec.exe
如果配置没有问题,应该可以看到一堆的输出:
如果你被提示命令找不到或者说是外部命令之类的,都是环境变量添加有问题或者环境变量没有正确加载,可以检查环境变量路径或者是重启电脑确保环境变量正确加载。
如果你输入了命令,什么都没提示,极有可能是你的CUDA和CUNDD没有配置好,可以考虑卸载掉原本的CUDA和CUNDD,然后跟着上面的opencv编译教程中的CUDA和CUDNN安装教程仔细操作一遍。这里一定要仔细,是肯定可以配出来的。
至此我们TensorRT8.6就安装完成了。
四、模型格式转换
要使用TensorRT推理我们的YOLO11模型首先就要对模型进行格式转换,这里个格式转换我们会从最开始的“.pt”格式转换到“.onnx”格式,最后转换为TensorRT能够推理的“.trt”格式。现在让我们开始吧!下面的内容可能会涉及到python的知识,当然,既然大家都跑过YOLO11,那这些肯定难不倒大家。
这里大家首先保证原本训练YOLO的python环境不动,我们需要额外安装下面的库:
onnx>=1.12.0
onnxruntime
onnxsim
这里建议大家将其复制到一个“requirement.txt”文件中,然后使用下面的命令来安装这些库:
pip install -r ./requirement.txt
当然也可以直接使用一条命令来安装:
pip install onnx>=1.12.0 onnxruntime onnxsim
在我们安装好环境后,就可以继续下面的操作了。
我们新建一个名为“conversion.py”的“.py”文件,然后将下面的脚本写入到这个py文件中:
from ultralytics import YOLO
model = YOLO("./yolo11n.pt")
export_path = model.export(format="onnx")
这里的YOLO("./yolo11n.pt")方法中的“./yolo11n.pt”是我们模型的名字,大家自行修改即可,修改后,将“conversion.py”脚本和模型放在同一个目录下:
然后使用下面的命令执行“conversion.py”脚本:
python conversion.py
执行以后,可以看到模型转换的日志:
可以看到我们的模型已经成功转换了,就放在了当前目录下,我们可以去看看:
可以看到我们转换出来的模型是“.onnx”格式的。当然这种格式的模型还不能拿给TensorRT推理,我们还需要将其转换为“.trt”模型,因为TensorRT的可执行文件已经被我们添加到环境变量了所以我们直接在模型所在目录执行下面的命令即可:
trtexec --onnx=yolo11n.onnx --saveEngine=yolo11n.trt --fp16
在上面的命令中“--onnx=yolo11n.onnx” 表示输入的“.onnx”的路径和名字,“--saveEngine=yolo11n.trt”表示输出文件的路径和名字,“--fp16”表示量化等级。
执行命令后就可以看到转换日志了:
如果你在运行过程报错,先看看是什么错误,如果提示文件找不到就检查以下输入的文件名字和路径对不对,如果发现是环境错误,比如缺少DLL文件之类的,那就看看是不是CUDA和CUDNN少安装了,以及有没有将CUDA的关键目录添加到环境变量,虽然发生这种事的概率很小,但是还是建议去看看。
这里转换可能需要3-4分钟,大家耐心等待即可,转换完成以后,就可以看到模型的输出路径了:
后面我们就会使用这个后缀为“.trt”的模型来推理。
至此,我们模型格式转换就完成了。
五、spacewalk01/yolov11-tensorrt项目拉取
现在我们来拉取spacewalk01/yolov11-tensorrt开源项目,后续我们会通过该项目来调用TensorRT来运行YOLO,这里直接使用下面的命令拉取即可:
git clone https://github.com/spacewalk01/yolov11-tensorrt.git
如果你拉取失败了,使用下面的命令配置一下git的代理:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
这些都是编译opencv时的基础操作了,这里就不多说了。拉取完成后,得到以下文件夹:
进入这个文件夹,可以看到以下文件和文件夹:
六、spacewalk01/yolov11-tensorrt的编译及测试
当我们成功编译完opencv,配置完TensorRT,转换完模型格式,拉取完源码以后就可以来编译“spacewalk01/yolov11-tensorrt”项目了,这里我们首先需要修改一下项目目录下的“CMakeLists.txt”文件:
这个文件描述了编译步骤以及链接步骤。打开后可以看到以下内容:
这里我们需要在这个文件中添加两个路径,分别是opencv的路径和TensorRT的路径:
这里我们一个一个来看,首先带大家找一下opencv的路径,我们来到编译opencv编译时创建的build目录,可以看到下面的内容:
如果opencv被正确编译并且安装,就可以看到一个名为“install”的目录:
我们进入这个“install”目录下的“x64\vc17\lib”目录:
这就是我们opencv的库路径,我们直接将其复制到“CMakeLists.txt”文件的opencv路径的填写处:
这里大家需要注意,我们需要将所有的单“\”改成双反斜杠,就像我的图中那样,避免转义问题。
这样我们opencv的路径就添加好了,然后就是TensorRT的路径,这里同样带大家找路径,还记得TensorRT的压缩包解压得到的那个文件夹吗?如图所示:
进入这个文件夹可以看到以下内容:
我们直接将这个文件夹的路径复制到“CMakeLists.txt”文件的TensorRT路径的填写处:
这里同样别忘记双反斜杠,修改完以后,我们直接保存退出即可。
下面我们还需要将编译后opencv的关键目录添加到环境变量,为了后续程序执行能够找到相关库。这里我们首先添加opencv安装目录下的“include”目录:
这里要注意是安装目录,“install”叫安装目录。
然后还有“install”目录下的 “x64\vc17”目录中的“bin”和“lib”目录:
添加完成以后,如图所示:
然后我们可以在“spacewalk01/yolov11-tensorrt”的项目目录中新建一个build目录:
下面我们就可以准备编译了,这里我们再次梳理环境,首先就是我们部署了以下版本的模块:
VS:2022
Cmake:4.0.1
CUDA:12.5
CUDNN:8.9.7
OpenCV:4.11
OpenCV_contrib:4.11
TensorRT8.6
然后我们添加了“CUDA”关键目录的环境变量,“TensorRT8.6”关键目录的环境变量,“opencv”关键目录的环境变量,这些环境变量需要反复检查,确保没有问题,不然编译出来的程序是无法运行的:
确保所有环境没有问题以后,我们进入刚才创建“build”目录,在build目录中执行下面的命令:
cmake ..
执行后,会生成编译相关的makefile文件,如果前面写入“CMakeLists.txt”文件中的opencv和TensorRT路径没错的话,这一步一般不会出错,当然,如果你的opencv不是CUDA版的或者编译opencv时使用的CUDA和你现在的CUDA版本不一样肯定是会报错的:
然后我们再使用下面的命令进行编译:
cmake --build . --config Release
这里编译会输出许多日志,等待编译完成即可:
编译完成以后,就可以看到build目录下多了许多文件:
我们进入“Release”目录中就可以看到我们编译得到的可执行文件了:
这里我们将测试图片和一开始转换好的“.trt”格式的模型拷贝到这个目录中:
然后我们在当前目录,使用下面的命令使用可执行文件调用TensorRT来推理我们的图片:
./yolov11-tensorrt.exe yolo11n.trt "test.png"
推理完成以后,就可以看到推理结果了,这个窗口会自动弹出:
这里大家需要注意一点,我们在输入模型名字和图片名字一点都不能错,这个程序有点坑,它没找到文件不会报错,而是什么都不显示。如果你发现你执行了命令但是什么都没输出,首先检查模型和图片名字输入是否正确,哪怕一个“.”都要仔细看,如果发现还是没有输出就检查环境变量,或者直接双击这个“.exe”文件,看看是不是提示缺少什么DLL文件。如果你严格按照上面的操作进行了,应该就不会出现错误。
七、将spacewalk01/yolov11-tensorrt集成到项目
大家现在可能有一个问题,我们应该怎么将“spacewalk01/yolov11-tensorrt”集成到自己的项目中呢?其实很简单,我们还是来到编译时的build目录下:
这里我们可以看到一个“.sln”的文件:
这不就是VS的项目文件吗,我们直接使用VS2022打开这个文件,打开以后如图所示:
先不着急点运行,现在直接运行是会直接报错的,我们需要修改一些东西,首先将上方的“Debug”改为“Release”:
然后我们再右键右边的“yolov11-tensorrt”:
然后点击“设为启动项目”:
完成上面的步骤以后,我们需要修改一下代码,在原本的代码中,我们是通过外部传参的方式将模型以及图片的路径传入程序中,既然是在VS中运行我们就不用传参了,直接写路径即可,我们往下滑找到主函数,在大约47行的位置:
可以看到,这里定义了两个字符串来接收我们传入的参数:
我们直接将这两个字符串写成我们模型和图片的路径,这里的“engine_file_path”存放的是模型路径,“path”存放的是图片路径,修改完成以后,如下图所示:
配置完成以后我们直接点击VS的运行,就可以看到推理结果了:
大家后续可以将下方的推理代码封装成单独的函数,这里就不进行多的演示了。大家自行将其集成到项目中即可。
八、结语
在本次教程中,教了大家如何正确的安装TensorRT以及如何正确的编译“spacewalk01/yolov11-tensorrt”并且将其集成到自己的项目中。总的来说,这些步骤并不简单,并且伴随着许多坑,但是,如果你按照我的步骤一步一步配,应该是没有问题的,如果你编译失败了就先检查模块版本是否和我一样,以及环境变量是否正常添加。那么最后,感谢大家的观看!