ubuntu下yolov7 tensorrt模型部署

本文详细指导如何在Ubuntu18.04环境下配置TensorRT环境,包括安装工具链、Nvidia库、CUDA及cudnn,以及从Yolov7源码导出ONNX模型并利用TensorRT编译和执行。涉及的关键技术如YOLOV7的目标检测算法和TensorRT的模型加速部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ubuntu下yolov7 tensorrt模型部署

  • Yolov7是一款由英国萨里大学人工智能中心(AIMS)和Visual Geometry Group(VGG)联合开发的深度学习算法,旨在实现准确、高效和可靠的目标检测。以下是关于Yolov7的多方面介绍。
  • 首先,来介绍一下Yolov7的作者。Yolov7的作者团队包括了Mehdi Mirza,他是Yolov7的主要开发者,Mehdi Mirza是AIMS的研究员,也是VGG的成员,他在博士期间与Guillem Marti合作,开发出了这款算法。Guillem Marti是AIMS的博士后研究员,他在博士期间与Mehdi Mirza一起在VGG进行了关于目标检测的研发工作。Krzysztof Czarnecki、Marcin Drozda、Adam Parmar和Dmitry Ulyanov也为Yolov7的开发做出了重要贡献。
  • 与YOLOV1的关系: Yolov1的作者是Alexey Bochkovnikovs和Cheng-Zhi Anna Huang。Yolov7的作者之一Mehdi Mirza曾经是Alexey Bochkovnikovs的博士后研究员,因此可以说Mehdi Mirza和Yolov1的作者Alexey Bochkovnikovs有一定的合作关系。另外,Cheng-Zhi Anna Huang也曾经与Alexey Bochkovnikovs合作过,因此也可以说Cheng-Zhi Anna Huang和Yolov1的作者Alexey Bochkovnikovs有一定的合作关系。YOLO(You Only Look Once)是一种目标检测算法,它可以在一次前向传递中检测图像中的目标。YOLO的提出改变了目标检测领域的研究范式,具有高效性、准确性和实时性的优点。
  • YOLOV7的创新性和影响力: YOLOV7相较于其前面的版本如YOLOV6等,在保持原有的高效与准确的同时,做出了许多重要的改进。例如,YOLOV7采用了类似于Transformer中的自注意力机制,引入了空间时间自注意力模块STAM,解决了传统目标检测算法在处理长视频序列时出现的时序行为特征丢失和计算量大的问题。此外,YOLOV7还改进了锚定机制,提出了新颖的动态锚定机制DAM,有效解决了小目标、背景目标和多尺度目标等检测难题。
  • 在学术界,YOLOV7的影响力不可忽视。其创新性的方法和优秀的性能吸引了大量研究者的关注和研究。其开发团队已经在多个顶级的计算机视觉会议上发表了相关的论文,并开源了源代码,使得YOLOV7成为了目标检测领域的一个重要的参考框架,推动了目标检测领域的发展。

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

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

一、Ubuntu18.04环境配置

如果您对tensorrt不是很熟悉,请务必保持下面库版本一致。
请注意: Linux系统安装以下库,务必去进入系统bios下,关闭安全启动(设置 secure boot 为 disable)

1.1 安装工具链和opencv

sudo apt-get update 
sudo apt-get install build-essential 
sudo apt-get install git
sudo apt-get install gdb
sudo apt-get install cmake
sudo apt-get install libopencv-dev  
# pkg-config --modversion opencv

1.2 安装Nvidia相关库

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

1.2.1 安装Nvidia显卡驱动

ubuntu-drivers devices
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470-server # for ubuntu18.04
nvidia-smi

1.2.2 安装 cuda11.3

  • 进入链接: https://developer.nvidia.com/cuda-toolkit-archive
  • 选择:CUDA Toolkit 11.3.0(April 2021)
  • 选择:[Linux] -> [x86_64] -> [Ubuntu] -> [18.04] -> [runfile(local)]

    在网页你能看到下面安装命令,我这里已经拷贝下来:
wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
sudo sh cuda_11.3.0_465.19.01_linux.run

cuda的安装过程中,需要你在bash窗口手动作一些选择,这里选择如下:

  • select:[continue] -> [accept] -> 接着按下回车键取消Driver和465.19.01这个选项,如下图(it is important!) -> [Install]

    在这里插入图片描述
    bash窗口提示如下表示安装完成
#===========
#= Summary =
#===========

#Driver:   Not Selected
#Toolkit:  Installed in /usr/local/cuda-11.3/
#......

把cuda添加到环境变量:

vim ~/.bashrc

把下面拷贝到 .bashrc里面

# cuda v11.3
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-11.3

刷新环境变量和验证

source ~/.bashrc
nvcc -V

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

nvcc: NVIDIA (R) Cuda compiler driver<br>
Copyright (c) 2005-2021 NVIDIA Corporation<br>
Built on Sun_Mar_21_19:15:46_PDT_2021<br>
Cuda compilation tools, release 11.3, V11.3.58<br>
Build cuda_11.3.r11.3/compiler.29745058_0<br>

1.2.3 安装 cudnn8.2

  • 进入网站:https://developer.nvidia.com/rdp/cudnn-archive
  • 选择: Download cuDNN v8.2.0 (April 23rd, 2021), for CUDA 11.x
  • 选择: cuDNN Library for Linux (x86_64)
  • 你将会下载这个压缩包: “cudnn-11.3-linux-x64-v8.2.0.53.tgz”
# 解压
tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz

将cudnn的头文件和lib拷贝到cuda11.3的安装目录下:

sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

1.2.4 下载 tensorrt8.4.2.4

本教程中,tensorrt只需要下载\、解压即可,不需要安装。

  • 进入网站: 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 Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 TAR Package
  • 你将会下载这个压缩包: “TensorRT-8.4.2.4.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz”
# 解压
tar -zxvf TensorRT-8.4.2.4.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
# 快速验证一下tensorrt+cuda+cudnn是否安装正常
cd TensorRT-8.4.2.4/samples/sampleMNIST
make
cd ../../bin/

导出tensorrt环境变量(it is important!),注:将LD_LIBRARY_PATH:后面的路径换成你自己的!后续编译onnx模型的时候也需要执行下面第一行命令

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/temp/TensorRT-8.4.2.4/lib
./sample_mnist

bash窗口打印类似如下图的手写数字识别表明cuda+cudnn+tensorrt安装正常
在这里插入图片描述

1.2.5 下载仓库TensorRT-Alpha并设置

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

设置您自己TensorRT根目录:

git clone https://github.com/FeiYull/tensorrt-alpha
cd tensorrt-alpha/cmake
vim common.cmake
# 在文件common.cmake中的第20行中,设置成你自己的目录,别和我设置一样的路径eg:
# set(TensorRT_ROOT /root/TensorRT-8.4.2.4)

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

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

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

安装 yolov7环境

pip install -r requirements.txt

用以下指令导出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

三、利用tensorrt编译onnx模型

将你的onnx模型放到这个路径:tensorrt-alpha/data/yolov7

cd tensorrt-alpha/data/yolov7
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/TensorRT-8.4.2.4/lib

编译onnx模型,会得到例如xxxx.trt格式的文件,下文推理要用到。

# 640
../../../../TensorRT-8.4.2.4/bin/trtexec    --onnx=yolov7-tiny.onnx  --saveEngine=yolov7-tiny.trt  --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec    --onnx=yolov7.onnx   	--saveEngine=yolov7.trt       --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec    --onnx=yolov7x.onnx   	--saveEngine=yolov7x.trt      --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
# 1280
../../../../TensorRT-8.4.2.4/bin/trtexec    --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工程

下载源码并编译

git clone https://github.com/FeiYull/tensorrt-alpha
cd tensorrt-alpha/yolov7
mkdir build
cd build
cmake ..
make -j10
# note: the dstImage will be saved in tensorrt-alpha/yolov7/build by default

执行推理任务,支持图片、视频、摄像头

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

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

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

在这里插入图片描述

五、结束语

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

在这里插入图片描述
在这里插入图片描述

<think>好的,用户想在Windows 10上部署或优化YOLOv8与TensorRT模型。首先,我需要回顾一下相关的步骤和可能遇到的问题。根据之前的知识,TensorRT部署通常涉及模型转换、优化和推理加速。用户可能已经熟悉YOLOv8的基本使用,但需要指导如何在Windows环境下集成TensorRT。 首先,确保用户安装了必要的软件,比如CUDA和cuDNN,这是TensorRT运行的基础。Windows上的安装步骤可能与Ubuntu不同,需要特别注意版本兼容性。接下来是TensorRT本身的安装,用户可能需要从NVIDIA官网下载Windows版本的TensorRT,并正确配置环境变量。 然后,模型转换是关键一步。YOLOv8的模型需要导出为ONNX格式,这是常见的中间表示。用户可能需要使用Ultralytics提供的导出功能,或者使用额外的脚本调整ONNX的结构以适应TensorRT的要求。在转换过程中,可能会遇到不支持的层或操作,这时候需要调整模型结构或使用插件。 接下来是使用TensorRT的API或工具(如trtexec)将ONNX模型转换为TensorRT引擎。这一步需要选择合适的精度(FP32、FP16或INT8),并进行性能优化。对于INT8量化,用户可能需要校准数据集,这在Windows环境下可能需要特定的配置。 推理部分需要编写Python代码加载TensorRT引擎,并进行前向推理。这里需要注意数据预处理和后处理的兼容性,确保输入输出的张量尺寸正确。此外,内存管理和线程优化也是提升性能的关键点。 用户还可能关心性能优化的具体方法,比如层融合、内存优化和批处理处理。需要提供实际的优化策略,例如如何通过调整工作空间大小或使用动态形状来提高推理速度。同时,错误排查也是重要的一环,比如处理模型转换中的错误或运行时的问题。 最后,生成相关问题时,需要考虑用户可能进一步的需求,比如性能分析工具的使用、与其他部署框架的对比,或者量化训练的具体步骤。这些相关问题能够帮助用户深入理解整个部署流程,并解决实际应用中可能遇到的挑战。</think>### Windows 10下YOLOv8与TensorRT部署及优化指南 #### 1. 环境准备 - **安装CUDA和cuDNN** TensorRT依赖CUDA和cuDNN,需安装与TensorRT兼容的版本。例如: - CUDA 11.8 + cuDNN 8.6.0(参考NVIDIA官方文档) - 验证安装:命令行执行`nvcc --version`确认CUDA版本[^1]。 - **安装TensorRT** 1. 从[NVIDIA官网](https://developer.nvidia.com/tensorrt)下载Windows版TensorRT(需注册账号)。 2. 解压后添加`lib`目录到系统环境变量`PATH`。 3. 安装Python绑定的Wheel文件:进入`python`目录,执行`pip install tensorrt-*.whl`。 #### 2. YOLOv8模型导出为ONNX ```python from ultralytics import YOLO model = YOLO("yolov8n.pt") # 加载预训练模型 model.export(format="onnx", dynamic=True) # 导出为动态形状ONNX ``` - 若需优化ONNX结构,可使用`onnx-simplifier`: ```bash pip install onnx-simplifier python -m onnxsim yolov8n.onnx yolov8n_sim.onnx ``` #### 3. ONNX转TensorRT引擎 - **使用`trtexec`工具**(需提前安装TensorRT): ```bash trtexec --onnx=yolov8n_sim.onnx --saveEngine=yolov8n_fp16.engine --fp16 ``` - 参数说明: - `--fp16`:启用FP16精度加速 - `--workspace=4096`:分配显存工作空间(单位MB) - `--minShapes=images:1x3x640x640`:设置动态输入最小尺寸[^2] #### 4. Python推理代码示例 ```python import tensorrt as trt import pycuda.driver as cuda # 加载TensorRT引擎 with open("yolov8n_fp16.engine", "rb") as f: runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING)) engine = runtime.deserialize_cuda_engine(f.read()) # 创建上下文并分配内存 context = engine.create_execution_context() inputs, outputs, bindings = [], [], [] stream = cuda.Stream() for binding in engine: size = trt.volume(engine.get_binding_shape(binding)) dtype = trt.nptype(engine.get_binding_dtype(binding)) host_mem = cuda.pagelocked_empty(size, dtype) device_mem = cuda.mem_alloc(host_mem.nbytes) bindings.append(int(device_mem)) if engine.binding_is_input(binding): inputs.append({'host': host_mem, 'device': device_mem}) else: outputs.append({'host': host_mem, 'device': device_mem}) # 数据预处理与推理 import cv2 import numpy as np img = cv2.imread("test.jpg") img = cv2.resize(img, (640, 640)) img = img.transpose(2,0,1).astype(np.float32) / 255.0 # HWC→CHW归一化 np.copyto(inputs[0]['host'], img.ravel()) cuda.memcpy_htod_async(inputs[0]['device'], inputs[0]['host'], stream) context.execute_async_v2(bindings=bindings, stream_handle=stream.handle) cuda.memcpy_dtoh_async(outputs[0]['host'], outputs[0]['device'], stream) stream.synchronize() # 后处理(需根据输出结构实现) output_data = outputs[0]['host'].reshape(1, 84, 8400) # 示例输出形状 ``` #### 5. 关键优化方法 1. **精度选择**: - FP16加速:性能提升约2倍,精度损失可忽略[^1] - INT8量化:需校准数据集,使用`trtexec --int8`(需额外步骤生成校准表) 2. **动态形状支持**: ```python profile = builder.create_optimization_profile() profile.set_shape("images", (1,3,640,640), (1,3,640,640), (1,3,640,640)) config.add_optimization_profile(profile) ``` 3. **层融合优化**: - 启用`builder_config.max_workspace_size = 1 << 30`(1GB工作空间) - 使用`config.set_flag(trt.BuilderFlag.FP16)`开启FP16模式 4. **内存复用**: ```python context.set_optimization_profile_async(0, stream.handle) ``` #### 6. 常见问题排查 - **ONNX转换失败**:检查YOLOv8版本(需≥8.0.50),更新Ultralytics包 - **TensorRT推理报错**:验证输入尺寸与模型匹配,使用`polygraphy`工具分析模型 - **性能不达标**:尝试禁用Windows Defender实时监控,或使用`trtexec --profilingVerbosity=detailed`分析耗时
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄家驹beyond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值