• 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 )

      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账号,如果您有别的途径下载安装也可以。

    • 进入:https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
    • 选择:[2019] -> [下载]
    • 在新页面选择: Visual Studio Community 2019 (version 16.11)
    • 下载完成之后安装过程选择如下图:
      请添加图片描述
    • 重启系统

    2.2 安装库

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

    2.2.1 安装Nvidia显卡驱动

    • 进入: https://www.nvidia.cn/Download/index.aspx?lang=cn#
    • 依据实际情况选择,如下图是我的选择(for RTX3070):
      请添加图片描述
    • 选择:[搜索]->[下载] ->[双击默认安装] -> [重启系统] -> [进入cmd],输入如下指令:
    nvidia-smi
    
    • 1

    看到如下信息表明驱动正常:
    请添加图片描述

    2.2.2 安装 cuda11.2

    • 进入: https://developer.nvidia.com/cuda-toolkit-archive
    • 选择:CUDA Toolkit 11.2.0 (December 2020)
    • 选择:[Windows] -> [x86_64] -> [10] -> [exe(local)] -> [Download(2.9GB)]
    • 双击安装,重启在cmd窗口输入如下指令:
    nvcc -V
    
    • 1

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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.com/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,

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    依照上一节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源码:

    git clone https://github.com/WongKinYiu/yolov7
    git checkout  072f76c72c641c7a1ee482e39f604f6f8ef7ee92
    
    • 1
    • 2

    安装 yolov7环境

    pip install -r requirements.txt
    
    • 1

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

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、利用tensorrt编译onnx模型

    将上一个章节中导出onnx模型放到任意路径。进入到tensorrt根目录下bin文件里,里面有个tensorrt官方提供的模型编译工具,即:trtexec.exe 如下图:
    在这里插入图片描述
    然后使用,以下指令编译onnx模型,需要注意:参数 --onnx 和 --saveEngine 可以设置为自定义路径,例如:

     --onnx=d:/Data/xxx.onnx  --saveEngine=d:/Data/xxx.trt 
    
    • 1
    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:如果报错(Error Code 1: Cuda Runtime (an illegal memory access was encountered “bool context = m_context->executeV2((void**)bindings)” returns false)
    可能是爆显存了,降低batch-size就行了

    五、编译执行yolov7-tensorrt工程

    下载源码并编译

    git clone https://github.com/FeiYull/tensorrt-alpha
    
    • 1

    仿造 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
    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==========
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    ## 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    .\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:/
    
    • 1

    效果如下图:
    请添加图片描述
    下面是推理视频效果,可以自己玩一玩:

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

    六、结束语

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

  • 相关阅读:
    如何对比github中不同commits的区别
    举个栗子~Tableau 技巧(244):用和弦图(Chord diagram)呈现数据关系
    windows 可以禁用的服务盘点
    新版首途影视视频网站源码/22套带后台版全开源+无加密源码(全新二开完整版)
    【gitlab】本地项目上传gitlab
    事务_基本演示和事务_默认自动提交&手动提交
    如何选择合适的域名注册商?需要考虑哪些方面因素?
    基于STM32单片机电子相册设计全套资料
    GZ038 物联网应用开发赛题第9套
    C++基础——auto关键字和范围for遍历
  • 原文地址:https://blog.csdn.net/m0_72734364/article/details/133920590