admin管理员组文章数量:1532725
目录
前言
前置环境
一,TensorRT下载安装
二,tensorrtx正常windows部署,图片推理
2.1 VS配置(这一步骤二和三通用)
2.2 导出wts模型
2.3 生成engine引擎
2.4 使用engine进行推理
三,tensorrtx魔改版部署,视频流推理
3.1 VS配置
3.2 部署自己的模型
3.3 opencv dnn和tensorrtx对比
四,总结
问题记录
①导出模型出错:AttributeError: Can't get attribute 'SPPF' on
②链接出错:yolov5.obj : error LNK2001: unresolved external symbol cudaMalloc
③报错:error : cannot define dllimport entity
④报错:yolov5.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl nvinfer1::YoloLayerPlugin::
⑤程序中止抛出异常:Unhandled exception at 0x00007FF872941208 (ucrtbase.dll)
前言
opencv dnn部署yolov5成功后,终究还是得对TensorRT下手。没办法,它的诱惑太大了,是英伟达为自家GPU出的推理引擎,论在英伟达产品上的推理速度,他说第一,应该没人说第二。不过我也没试过,之前用tensorrtx跑起来过一次,只是推理图片,没有视频来做比较。此次部署准备对比一下,顺便深入了解一下tensorrt(或者tensorrtx)。
前置环境
opencv安装(opencv_contrib版):博客地址
cuda,VS安装:博客地址前半部分
yolov5正常使用的环境:博客地址前半部分
前置环境很重要,若还没有配好,还希望配好再跟着走,下面的步骤都假设前置环境已经配好了情况下进行的。在windows上我采用的是VS配好环境后,直接用VS编译运行,而不是用cmake的方式编译项目。
一,TensorRT下载安装
官方下载地址:https://developer.nvidia/nvidia-tensorrt-download
在下载时会要求注册一下英伟达,随便注册一下就行。然后选择合适的版本下载,下载时注意对应自己的cuda版本,建议下载GA稳定版。博主下载的时候,没有cuda11.6的TensorRT的版本,所以只能下载TensorRT 8.4EA尝鲜版。
下载完之后,其实安装的部分已做了大半,剩下的就是将bin,include,lib目录添加进环境变量就行了,不过我建议和cudnn一样,将lib,bin,include等文件夹和cuda合并最好,就cuda的目录添加进环境变量就行。
后续再移动一下,将TensorRT的lib移动到cuda的lib\x64中,TensorRT就安装成功了,不放心可以搜一下,运行sample例子的教程,这里就不再赘述。
二,tensorrtx正常windows部署,图片推理
王鑫宇大佬的tensorrtx地址
tensorrtx-master版本——yolov5-6.0、6.1,tensorrtx-yolov5-5.0——yolov5-5.0,目前还没有出tensorrtx的yolov5-6.0的稳定版,但是,我试了一下,当前的master版本是可以用来部署yolov5-6.0版本的,此次我用来部署的版本是yolov5-6.1。
(更新)sorry,tensorrtx-master能成功导出yolov5-6.1模型的engine,但是推理不会出结果,也就是检测不到目标物,是我异想天开了,如果想用6.1版本还是等tensorrtx更新吧。暂时可以先用6.0的版本(6.0的版本训练推理可参考前置环境的6.1训练推理,操作一样),6.0的版本已经有了yolov5n模型(可能这也是tensorrtx迟迟没有更新6.1版本的yolov5原因吧)。
2.1 VS配置(这一步骤二和三通用)
①新建VS项目,选择空项目,点击next
②输入项目名称,并选择保存项目的文件夹路径,然后点击create创建VS项目
③将下载的tensorrttx中的yolov5文件夹中所有文件,复制到项目当中 ④添加.c文件和.h文件到VS项目中 ,鼠标右击source file选择添加已有项目。ctrl+鼠标右键可一次选择多个进行添加。
④-1,添加完后的目录结构
⑤修改属性,其实正常来说,添加了环境变量,项目对在环境变量中的库,应该不会报错,但有时不知道为什么链接不上。这时需要在VS项目中添加,引用库报错的库。运行tensorrtx主要需要的是cuda,cudnn,TensorRT,opencv的include,lib,bin文件目录。缺什么,就在属性中添加什么,bin文件好像是自动调用的,暂时还没遇到添加bin文件目录的问题。
⑤-1,我在环境变量中加的路径都失效了,需要将cuda,cudnn,TensorRT,opencv的全部加入进去,但我将cuda,cudnn,TensorRT融合到cuda当中。所以只导入了cuda和opencv的,我添加的路径如下,供大家参考寻找自己的路径。(我的opencv是和opencv_contrib一译过的,build是编译之后存放编译结果的文件夹,没编译过的话,没有install)
⑥添加lib到链接器,这个不是很懂,为什么导入了lib文件夹,但是运行的时候,调用不到lib,需要再连接一下。obj报错的往往都是没有链接到lib的问题,我将常报错的lib文件放在下面,(opencv后缀要写自己的版本,我的版本是4.5.5,所以是455)。
opencv_img_hash455.lib
opencv_img_hash455d.lib
opencv_world455.lib
opencv_world455d.lib
cudart.lib
cuda.lib
cublas.lib
cudnn.lib
nvinfer.lib
nvonnxparser.lib
nvparsers.libnvinfer_plugin.lib
这里我试了一下,我需要链接的就只有opencv的lib和nvinfer.lib就能正常运行
⑦添加预处理,但不添加的话,就运行不起来,是cmakelist的一个语句,运行到此处VS的配置就完成了
add_definitions(-DAPI_EXPORTS)
2.2 导出wts模型
①将tensorrttx的yolov5文件夹中的gen_wts.py复制到自己yolov5训练使用的环境中,。
②,终端进入环境,运行gen_wts.py文件,生成wts模型。注意记得导自己到出的是n/s/m/l/x/n6/s6/m6/l6/x6中的那一种,后面运行需要指定是哪一种模型。
#python gen_wts.py文件路径 -w pt权重文件路径
python gen_wts.py -w yolov5n.pt
③,将生成的wts模型,移入自己VS项目中
2.3 生成engine引擎
①修改yololayer.h,改变为自己的类数,80是初始权重的分类数,所以我没有改
②修改logging.h文件,这个localtime在windows上会被警告不安全,需要换一下。74行将原来的语句注释一下,添加修改为红框中的内容。
③屏蔽<dirent.h>文件,util.h文件中调用的<dirent.h>,windows没有这个库,需要进行添加,但我尝试过导入,但报了一大堆其他的错,由于我开始主要是想用它来进行视频流推理,所以我放弃了(后续有时间再更新解决)。util.h文件修改,将#include <dirent.h>,以及read_files_in_dir中内容注释掉。
④,添加命令参数,模拟终端输入参数运行程序,参考Ubuntu运行命令,根据自己的情况添加参数(如果是yolov5-5.0版的,没有n)。
sudo ./yolov5 -s [.wts] [.engine] [n/s/m/l/x/s6/m6/l6/x6 or c/c6 gd gw] // serialize model to plan file
sudo ./yolov5 -d [.engine] [image folder] // deserialize and run inference, the images in [image folder] will be processed.
⑤选择Release模型运行,生成engine文件
2.4 使用engine进行推理
②可以参考dirent.h windows安装_WAI_f的博客-CSDN博客_dirent.h windows,进行下载导入一下,如果可以,那就运行推理。后续有时间我打算替换一种windows能用API来读取目录。
三,tensorrtx魔改版部署,视频流推理
博主的github源码地址:https://github/GaoJieo/yolov5-tensorrtx-VideoCapture
其中有两个版本,5.0版对应yolov5-5.0,6.0对应yolov5-6.0。源码文件比较大,engine也放在了里面,方便下载的朋友测试环境是否配置完成。
3.1 VS配置
3.1的配置和2.1的配置一样,具体步骤参考2.1就行,在此就不再重复了。这里总结一下。其实经过反复建立工程测试,VS配置就只有三步:
①新建工程,导入源码中所有文件
②修改属性,添加include库,lib库,链接器,预处理
③修改cu文件的编译方式
下载博主的源码,配置好后就可以直接运行了,注意选择release模式(如果不能直接运行起来,就先配置一下环境,再部署自己的模型)。经过测试,配置好后,同一个环境两个版本的源码都能直接运行。下面这个截图是运行的6.0版,速度非常快,较s版提升了一倍的速度。
3.2 部署自己的模型
①首先还是得先训练自己的模型,训练时下载对应权重,博主的源码中下载了s版和n版的pt权重,可以用他作为初始权重下载,也可以去官网下载,注意下载对应初始权重就行
②训练完后,将自己的模型转为wts模型导出具体步骤参考2.2。
③将转化的wts文件复制到自己新建的VS项目文件夹中,修改yololayer.h第20行,为自己的分类数
③-1,再修改yolov5.cpp,选择生成engine,以及自己的模型路径,和模型版本,点击运行,这一步时间较长,需要耐心等待。
④推理,点击运行,体验极速快感~
3.3 opencv dnn和tensorrtx对比
opencv dnn和tensorrtx精度对比,tensorrtx速度肯定是要远远超越了opencv dnn的,但精度上来看tensorrtx还是有所不及。这个有可能是opencv dnn加载的onnx模型更加完备,也有可能是TensorTRT在提速的过程中,减少了识别的准确度。不过此次变量还没有统一,opencv dnn用的yolov5-6.1模型,tensorrtx用的是yolov5-5.0模型。左侧为opencv dnn,右侧为tensoortx。对opencv dnn感兴趣的朋友可以参考博客(左上角的帧率不用看,为了记录同一个时间点的画面,是通过按键进行暂停的,每次暂停再开启,帧率会下降,正常帧率tensorrtx在160~200帧之间,不过中间部分会稳定在83帧)
四,总结
之前一直以为yolov5的网络结构只和它的yolo.py有关,所以只有yolo.py有版本之分,初始权重.pt都是一样的。这次通过修改tensorrtx源码实现摄像头,视频流推理,意识到权重也有版本之分。后面使用yolov5的6.1版本推理不出结果,又意识到每一代版本都有区别,哪怕是这一代的优化版。
这也是首次在github上分享一些自己的东西——虽然是修改大佬的成果,希望能帮到一些,和我一样想用tensorrtx不只是做图片推理的朋友。
有问题欢迎留言讨论
个人感受记录,可忽略:泪崩,最开始用tensorrtx-yolov5-5.0的版使用,经过一番挫折最终改编,并且成功加载了以前训练过的yolov5-5.0的模型。想着做教程,当然得紧追潮流,用最新的yolov5-6.1和yolov5n进行部署。最新的tensorrtx-master是支持的yolov5-6.0的,同代版本差别应该不大,于是我就使用yolov5-6.1(主要还是因为已经用过了)。在调试过程中由于配置好后,在运行过程中抛出异常——std::endl还有异常,敢信?。所以我想着是不是模型之间也存在差异,训练过的权重和没训练权重导出的wts模型是不是有区别,由于没训练过,导致出了问题。然后我换回之前yolov5-5.0训练过的模型——此时我没有考虑yolo版本问题(其实用Netron看过,太粗心了一拉到底,下面都一样,但是yolov5-5.0是focous开头而不是conv,还有中间是SPP而不是SPPF)。结果很显然,肯定也不行,这就很折磨人了,抛出异常而不是报错。网上搜异常信息,出来的结果都很难解决遇到的问题。最终我又回到tensorrtx-yolov5-5.0,想着最新的教程做不了,做个旧的也行吧,yolov5n运行不了,运行yolov5s总可以吧,结果不行!!!!。难道经过训练的权重会尊贵点?非常郁闷。既然旧的也不行,还是弄的新的吧,毕竟都写了一大半教程,就差运行成功截图了。这卡了我几天,最后报着试试的想法,将localtime_s的方式再改一改,tm结构体不再是指针结构体,变为普通结构体,然后用引用传送给localtime_s(为什么要改x+++++++++++++--这个,因为之前它报过一次错,这个异常和时间有关,所以就试试了)。异常解决了,但新异常又出现了。所以我没有认为我解决了这个问题,反而在想新异常是不是我改了才冒出来的。因为yolov5之前没改,也运行成功了。之后又是一番搜索苦想,新异常和模型结构有关,突然意识到初始权重会不会也有版本。于是我换回yolov5n.pt,程序成功加载模型并生成enjine文件。。意味终于能行了,结果推理不出结果,之后发现6.1和6.0差0.1的版本差距也不行,只有老老实实的换回yolov5-6.0版本的权重进行推理,成功运行。。。。
问题记录
①导出模型出错:AttributeError: Can't get attribute 'SPPF' on <module 'modelsmon'
解决办法:添加SPFPF类到commonpy文件:具体解决办法链接
②链接出错:yolov5.obj : error LNK2001: unresolved external symbol cudaMalloc
·· 解决办法:添加lib到链接器,缺什么添什么,可以从报错中看出,缺的是cuda相关的lib,需要去对应文件夹中找,和尝试。此报错需要链接cudart.lib,其他类似的报错,可以参考文中添加的lib文件。
③报错:error : cannot define dllimport entity
解决办法:添加预处理API_EXPORTS,具体参考本文 2.1第⑦步
④报错:yolov5.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl nvinfer1::YoloLayerPlugin::
解决办法:修改cu文件的编译方式为cuda,参考本文2.1第⑧步或 博客
⑤程序中止抛出异常:Unhandled exception at 0x00007FF872941208 (ucrtbase.dll)
原因很多,多注意指针的使用,以及内存访问越界等问题
本文标签: 视频TensorRTWindowstensorrtx
版权声明:本文标题:windows上配置TensorRT yolov5 -6.0部署 tensorrtx视频流推理 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1725567498a1030116.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论