win10下yolov7 tensorrt模型部署

yolov7 tensorrt cuda模型推理加速部署TensorRT-Alpha《Korea-Night》

一、YOLOv7简介

YOLOv7是一种基于深度学习的目标检测算法,由美国计算机科学家Joseph Redmon等人于2016年提出。YOLOv7的创新点在于其速度和准确性的平衡,以及在处理小目标时的优越性能。

YOLOv7的主要创新点包括:

  1. 多尺度预测:YOLOv7采用了多尺度预测的方法,可以同时检测不同大小的目标,提高了检测的准确性。

  2. 特征融合:YOLOv7使用了更深的卷积神经网络来提取特征,并将浅层和深层的特征进行融合,提高了检测的准确性。

  3. 锚框设计:YOLOv7采用了Darknet-53作为基础网络,并设计了新的锚框,使得模型能够更好地适应各种形状的目标。

  4. 损失函数优化:YOLOv7使用了新的损失函数,使得模型在训练过程中能够更好地学习到目标的位置信息。

YOLOv7的作者Joseph Redmon是YOLO系列算法的主要贡献者,他在计算机视觉领域有着广泛的影响力。他的研究成果被广泛应用于自动驾驶、安防监控等领域。

YOLOv7对业界的影响主要体现在以下几个方面:

  1. 提高了目标检测的速度和准确性:YOLOv7在保持较高准确性的同时,大大提高了检测速度,满足了实时性的需求。

  2. 推动了深度学习在目标检测领域的应用:YOLOv7的成功应用,推动了深度学习在目标检测领域的广泛应用。

  3. 促进了相关技术的发展:YOLOv7的出现,推动了目标检测技术、深度学习技术等相关技术的发展。

    本文提供深度学习CV领域模型加速部署案例,仓库实现的cuda c支持多batch图像预处理、推理、decode、NMS。大部分模型转换流程为:torch->onnx->tensorrt。下图左边是yolov7-python源码推理结果,右边是本文基于tensorrt实现yolov7模型部署的推理结果。

    yolov7-tiny : Offical( left ) vs Ours( right )

有源码!有源码!有源码! 不要慌,哈哈哈。

二、Win10 TensorRT环境配置

三步解决win环境配置

  • 1、安装vs2019、Nvidia驱动、cuda,cudnn、opencv、tensorrt;
  • 2、创建属性表;
  • 3、工程设置,运行;
  • :一定是先安装vs2019,再安装cuda,顺序不能颠倒,因为cuda会自动给vs2019安装插件。
    问题 :windows环境下,为什么使用vs2019属性表,而不用cmake?
    回答:因为属性表可以做到:一次创建,到处使用。

2.1 安装VS2019

需要Microsoft账号,如果您有别的途径下载安装也可以。

2.2 安装库

注:Nvidia相关网站需要注册账号。

2.2.1 安装Nvidia显卡驱动

bash 复制代码
nvidia-smi

看到如下信息表明驱动正常:

2.2.2 安装 cuda11.2

bash 复制代码
nvcc -V

CMD窗口打印如下信息表示cuda11.2安装正常

bash 复制代码
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Nov_30_19:15:10_Pacific_Standard_Time_2020
Cuda compilation tools, release 11.2, V11.2.67
Build cuda_11.2.r11.2/compiler.29373293_0

note:cuda11.2 不需要手动设置环境变量,如下图,环境变量都是自动设置的。

2.2.3 安装 cudnn8.2.1

  • 进入网站:https://developer.nvidia.com/rdp/cudnn-archive
  • 选择: Download cuDNN v8.2.1 (June 7th, 2021), for CUDA 11.x
  • 选择: cuDNN Library for Windows (x86)
  • 你将会下载这个压缩包: "cudnn-11.3-windows-x64-v8.2.1.32_2.zip"
  • 解压之后,cudnn的头文件、库文件都要拷贝到cuda安装目录。
  • 如下图,进入cudnn解压所在文件夹中include,拷贝所有头文件,粘贴到CUDA/v11.2/include中
  • lib、bin中的文件也拷贝到对应cuda目录中
  • 重启系统

2.2.4 下载 tensorrt8.4.2.4

  • 进入网站: https://developer.nvidia.cn/nvidia-tensorrt-8x-download
  • 把这个打勾: I Agree To the Terms of the NVIDIA TensorRT License Agreement
  • 选择: TensorRT 8.4 GA Update 1
  • 选择: TensorRT 8.4 GA Update 1 for Windows 10 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 ZIP Package
  • 你将会下载这个压缩包: "TensorRT-8.4.2.4.Windows10.x86_64.cuda-11.6.cudnn8.4.zip"
  • 解压到F:\ThirdParty,并重命名为:TensorRT-8.4.2.4
  • 并将路径"F:\ThirdParty\TensorRT-8.4.2.4\lib"添加到环境变量,如下图:
  • 重启系统

2.2.5 OpenCV4.5.5安装

  • 进入:https://opencv.org/releases/
  • 选择:[OpenCV -- 4.5.5] -> [Windows]
  • 下载完成之后,是一个exe的自解压格式,解压到:D:\ThirdParty
  • 并将路径:"D:\ThirdParty\opencv4.5.5\build\bin" 和 "D:\ThirdParty\opencv4.5.5\build\x64\vc15\bin"添加到环境变量,如下图:
  • 重启系统
    note:我的opencv在D盘,tensorrt在E盘,根据实际情况修改就行了。

2.3 创建属性表

一般地,Visual Studio 2019,一个库对应两个属性表文件,分别对应:vs2019的debug模式和release模式,例如:本文中OpenCV创建了这两种。而TensorRT和CUDA只需要创建一种属性表(适用以上两种模式)。

2.3.1 创建OpenCV属性表

创建opencv库debug属性表:

  • step1:基于VS2019随便新建一个C++项目,如下图,项目设置为Debug、X64模式

  • step2:如下图,选择:[属性窗口] -> [右击Debug|x64] -> [添加新项目属性表]

  • step3:文件命名为:OpenCV4.5.5_DebugX64.props -> [添加]

  • 编辑属性表:[如下图:双击属性表]

  • step4:如下图,选择:[通用属性] -> [VC++目录] -> [包含目录] -> [编辑]

  • step5:如下图,将两个OpenCV两个头文件目录拷贝进去 -> [确认]

  • step6:选择:[通用属性] -> [VC++目录] -> [库目录] -> [编辑] -> 将路径:"D:\ThirdParty\opencv4.5.5\build\x64\vc15\lib"拷贝进去 -> [确认]

  • step7:选择:[通用属性] -> [链接器] -> [输入] -> [附加依赖项] -> 将文件名"opencv_world455d.lib "拷贝进去->[确认]
    小结

    到这里,opencv库debug属性表制作完成,release属性表和上述流程一样,唯一区别在于,如下图,项目切换到Release x64模式,新建OpenCV4.5.5_ReleaseX64属性表,然后在step7中,将文件名修改为:"opencv_world455.lib "

    请记住,制作属性表就3个步骤:

  • 拷贝include路径

  • 拷贝lib路径,外加设置dll到系统环境变量

  • 拷贝lib文件名称

2.3.2 创建TensorRT属性表

右击Debug|x64 or 右击Release|x64新建属性表,重命名为:TensorRT8.4.2.4_X64,

bash 复制代码
# include路径
F:\ThirdParty\TensorRT-8.4.2.4\include
F:\ThirdParty\TensorRT-8.4.2.4\samples\common
# F:\ThirdParty\TensorRT-8.4.2.4\samples\common\windows # 这个路径文件不需要包含
# lib路径
F:\ThirdParty\TensorRT-8.4.2.4\lib
# lib文件名称(for release& debug)
nvinfer.lib
nvinfer_plugin.lib
nvonnxparser.lib
nvparsers.lib

依照上一节3个步骤:

  • step1:选择:[通用属性] -> [VC++目录] -> [包含目录] -> [编辑] -> 把上述3个include路径拷贝进去
  • step2:选择:[通用属性] -> [VC++目录] -> [库目录] -> [编辑] -> 把上述lib路径拷贝进去
  • step3:选择:[通用属性] -> [链接器] -> [输入] -> [附加依赖项] -> [编辑] -> 将上述lib文件名称拷贝进去->[确认]
    最后,修改tensorrt属性表:[通用属性] -> [C/C++] -> [预处理器] -> [预处理器定义] -> 添加指令:_CRT_SECURE_NO_WARNINGS -> [确认]

2.3.3 创建CUDA属性表

CUDA属性表直接白嫖官方,在路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\extras\visual_studio_integration\MSBuildExtensions\CUDA 11.2.props

最后,我们应该有了如下属性表文件:

其中,cuda 和tensorrt的属性表同时兼容release x64 和debug x64,你再新建TensorRT-Alpha中yolov8 yolov7 yolov6 等项目后,只需要把上述提前做好的属性表引入到工程就行了,当然项目还需要进行简单设置(设置NVCC,避免tensorrt的坑),在后文提到。属性表做到了一次新建,到处使用。

2.3.4 新建工程与设置

这一节演示如何新建vs工程,如何设置工程,是通用方法。适用于仓库所有模型源码。

2.3.4.1 新建vs工程

如下图,打开vs2019,点击:文件 -> 新建-> 项目。

选择:空项目 -> 下一步。

选择创建。

如下图,现在将工程设置为:Release X64。

2.3.4.2 vs2019工程设置

如下图,选择:属性管理器 -> Release | x64 -> 添加现有属性表,把上一节生成的三个RleaseX64属性表添加进来。

添加进来后样子如下图:

TensorRT项目包含c++和cuda c代码,通俗讲,c++代码文件格式为:

  • .h头文件
  • .cpp文件
  • 由c++编译器编译
    而cuda代码头文件格式为:
  • .h头文件
  • .cu文件
  • 由NVCC编译器编译
    例如:我们添加如下图5个文件,在工程中。

    添加CUDA依赖:右击项目 -> 生成依赖项 -> 生成自定义

    将如下图CUDA11.2打钩 -> 确认

    右击项目 -> 属性,将会打开如下界面,将字符集设置为未设置,点击确认。

    最后,在项目中,同时选中所有.cu文件和对应的.h文件,注意是所有。我这里就是a.h 和 a.cu文件了。然后右击 -> 点属性。
    【注】:在tensorrt-alpha开源项目中,例如yolov8,会添加多个.cu .cpp .h格式文件,其中.cu和对应的.h文件都是这样设置,目的就是让NVCC编译器来编译cuda代码。

    得到如下界面,我们把项类型设置为CUDA C/C++,点击确认。

    然后编译一下:

    编译成功如下图:

三、从yolov7源码中导出onnx文件

可以直接从网盘下载onnx文件[weiyun]:weiyun or google driver ,你也可以自己下载仓库,然后按照下面指令手动导出onnx文件,下载yolov7源码:

bash 复制代码
git clone https://github.com/WongKinYiu/yolov7
git checkout  072f76c72c641c7a1ee482e39f604f6f8ef7ee92

安装 yolov7环境

bash 复制代码
pip install -r requirements.txt

命令行进入yolov7源码根目录,用以下指令导出onnx模型文件

bash 复制代码
# 640
python export.py --weights yolov7-tiny.pt  --dynamic  --grid
python export.py --weights yolov7.pt  --dynamic  --grid
python export.py --weights yolov7x.pt  --dynamic  --grid
# 1280
python export.py --weights yolov7-w6.pt  --dynamic  --grid --img-size 1280

四、利用tensorrt编译onnx模型

将上一个章节中导出onnx模型放到任意路径。进入到tensorrt根目录下bin文件里,里面有个tensorrt官方提供的模型编译工具,即:trtexec.exe 如下图:

然后使用,以下指令编译onnx模型,需要注意:参数 --onnx 和 --saveEngine 可以设置为自定义路径,例如:

bash 复制代码
 --onnx=d:/Data/xxx.onnx  --saveEngine=d:/Data/xxx.trt 
bash 复制代码
# 640
.\trtexec.exe    --onnx=yolov7-tiny.onnx  --saveEngine=yolov7-tiny.trt  --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
.\trtexec.exe    --onnx=yolov7.onnx   	--saveEngine=yolov7.trt       --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
.\trtexec.exe    --onnx=yolov7x.onnx   	--saveEngine=yolov7x.trt      --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
# 1280
.\trtexec.exe    --onnx=yolov7-w6.onnx    --saveEngine=yolov7-w6.trt    --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280

注:如果报错(Error Code 1: Cuda Runtime (an illegal memory access was encountered "bool context = m_context->executeV2((void**)bindings)" returns false)

可能是爆显存了,降低batch-size就行了

五、编译执行yolov7-tensorrt工程

下载源码并编译

bash 复制代码
git clone https://github.com/FeiYull/tensorrt-alpha

仿造 2.3.4 新建工程与设置 中新建、设置vs2019工程;其中,yolov7需要将如下图多个文件添加到工程中:

  • 红色框内文件来自TensorRT-Alpha/utils/
  • 蓝色框内文件来自TensorRT-Alpha/yolov7/
  • 绿色框内文件来自TensorrRT安装路径下:TensorRT-8.4.2.4.Windows10.x86_64.cuda-11.6.cudnn8.4\TensorRT-8.4.2.4\samples\common\logger.cpp

    如下图,yolov7项目编译成功,从下面编译信息可以看到,exe文件所在路径为:
  • D:\my_code_trt\TensorRT-Alpha-VS2019\TensorRT-Alpha\x64\Release\yolov7.exe
bash 复制代码
1>------ 已启动生成: 项目: yolov7, 配置: Release x64 ------
1>正在生成代码
1>0 of 1033 functions ( 0.0%) were compiled, the rest were copied from previous compilation.
1>  0 functions were new in current compilation
1>  0 functions had inline decision re-evaluated but remain unchanged
1>已完成代码的生成
1>yolov7.vcxproj -> D:\my_code_trt\TensorRT-Alpha-VS2019\TensorRT-Alpha\x64\Release\yolov7.exe
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

以下是命令行执行指令,需要说明的是执行推理任务,支持图片、视频、摄像头

bash 复制代码
## 640
# infer image
./app_yolov7.exe  --model=../../data/yolov7/yolov7-tiny.trt --size=640  --batch_size=1  --img=../../data/6406401.jpg  --show --savePath
./app_yolov7.exe  --model=../../data/yolov7/yolov7-w6.trt   --size=1280 --batch_size=1  --img=../../data/6406401.jpg  --show --savePath=../

# infer video
./app_yolov7.exe  --model=../../data/yolov7/yolov7-tiny.trt     --size=640 --batch_size=2  --video=../../data/people.mp4  --show 

# infer camera
./app_yolov7.exe  --model=../../data/yolov7/yolov7-tiny.trt     --size=640 --batch_size=2  --cam_id=0  --show

这里给个示范,例如我要在命令行使用yolov7推理一张图:

bash 复制代码
.\yolov7.exe --model=D:/ThirdParty/TensorRT-8.4.2.4/bin/yolov7-tiny.trt --size=640  --batch_size=1  --img=d:/Data/1.jpg  --show --savePath=d:/

效果如下图:

下面是推理视频效果,可以自己玩一玩:

yolov7 tensorrt cuda模型推理加速部署TensorRT-Alpha《Korea-Night》

六、结束语

都看到这里了,觉得可以请点赞收藏,有条件的去仓库点个star,仓库:https://github.com/FeiYull/tensorrt-alpha

相关推荐
Dm_dotnet几秒前
使用这个工具,基于代码仓库直接生成教程文档,感觉比我自己写的还好
人工智能
机器之心14 分钟前
业内首次! 全面复现DeepSeek-R1-Zero数学代码能力,训练步数仅需其1/10
人工智能
新智元14 分钟前
大学文凭成废纸?AI 暴击美国 00 后!他哥大退学成千万富翁,我却还要还学贷
人工智能·openai
财经汇报15 分钟前
媒体关注:联易融聚焦AI+业务,重塑供应链金融生态
人工智能·金融·媒体
姚家湾17 分钟前
闲聊人工智能对媒体的影响
人工智能·媒体
PythonicCC22 分钟前
基于Python Socket的多线程聊天程序案例分析
python
程序员安仔23 分钟前
Trae 新版发布!除了支持联网搜索、 MCP 外,还能创建智能体!
人工智能·trae
新智元29 分钟前
Transformer 原作打脸 DeepSeek 观点?一句 Wait 就能引发反思,RL 都不用
人工智能·openai
Dxy123931021640 分钟前
NLTK 语料库与词典资源
python
timer_01743 分钟前
百度 Al 智能体心响 App 上线
人工智能