Windows10+tensorrt+python部署yolov5

news/2024/7/10 23:59:42 标签: python, YOLO, 深度学习

一、安装cuda

打开NVIDIA控制面板 —>帮助—>系统信息—>组件,找到驱动版本新,我这边是11.2,
在这里插入图片描述
然后去CUDA Toolkit Archive | NVIDIA Developer下载对应版本的CUDA,根据查看的CUDA型号确定对应的cuda Toolhit版本,我这边下载的是11.2.2
在这里插入图片描述建议下载network版本,
在这里插入图片描述在后续安装步骤建议选择自定义安装。
验证是否安装成功,打开cmd输入nvcc --version,显示如下信息,即成功安装。
在这里插入图片描述

二、安装cudnn

CUDNN下载并配置 https://developer.nvidia.cn/rdp/cudnn-archive
下载压缩包,然后解压。 在这里插入图片描述将解压后的三个文件夹复制到cuda的安装目录下。默认安装路径如下,可以去系统变量path中找
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2
在这里插入图片描述
往系统环境变量中的 path 添加如下路径(根据自己的路径进行修改)

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\libnvvp

在这里插入图片描述

三、安装pytorch

建议直接到到pytorch官网下载对应的cuda版本的GPU的torch。直接离线安装更稳妥。torchvision也是。
在这里插入图片描述

四、安装tensorrt

下载网址https://developer.nvidia.com/nvidia-tensorrt-8x-download,Windows只能下载zip。下载之后解压到自己想放的目录。按照官方文档一步步走就行
在这里插入图片描述其实8.6版本的不复制文件也可以,我就是没复制文件,直接在系统环境变量中加入路径
在这里插入图片描述在这里插入图片描述

验证是否安装成功

利用vscode打开C:\Program Files\TensorRT-8.6.1.6\samples\sampleOnnxMNIST下的sample_onnx_mnist.sln,然后重新生成。
在这里插入图片描述
接下来在C:\Program Files\TensorRT-8.6.1.6\bin中可以看见sample_onnx_mnist.exe,我们打开cmd进入到该目录下,运行sample_onnx_mnist.exe
在这里插入图片描述
出现下面结果,即成功安装。
在这里插入图片描述

pythontensorrt_40">五、在python环境中安装tensorrt

激活虚拟环境,进入tensorrt安装目录下的python,根据自己的python版本安装对应的tensort。
在这里插入图片描述
在这里插入图片描述
验证tensorrt是否安装成功
在这里插入图片描述

六、部署yolov5

1. yolov5s.pt转onnx在转engine

.pt文件转onnx直接利用yolov5自带的export.py输出即可,onnx转engine利用C:\Program Files\TensorRT-8.6.1.6\bin下的trtexec.exe文件

trtexec.exe --onnx=C:\PycharmProject\yolov5-7.0(myself)\yolov5s.onnx --saveEngine=C:\PycharmProject\yolov5-7.0(myself)\yolov5s.engine

接下来就可以用python+tensorrt对yolov5进行部署。

python">import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
import cv2
import time
import ctypes
from dector_trt import Detector
import pycuda.autoinit

import numpy as np

import pycuda.driver as cuda
def detect(engine_file_path):
    detector = Detector(engine_file_path)
    capture = cv2.VideoCapture(0)
    # capture = cv2.VideoCapture(0)
    fps = 0.0
    while True:
        ret, img = capture.read()
        if img is None:
            print('No image input!')
            break

        t1 = time.time()
        img = img.astype(np.float32)
        result_img = detector.detect(img)



        fps = (fps + (1. / (time.time() - t1))) / 2
        cv2.putText(result_img, 'FPS: {:.2f}'.format(fps), (50, 30), 0, 1, (0, 255, 0), 2)
        cv2.putText(result_img, 'Time: {:.3f}'.format(time.time() - t1), (50, 60), 0, 1, (0, 255, 0), 2)
        if ret == True:
            cv2.imshow('frame', result_img)
            if cv2.waitKey(5) & 0xFF == ord('q'):
                break
        else:
            break

    capture.release()
    cv2.destroyAllWindows()
    detector.destroy()


if __name__ == '__main__':
    # 在程序的退出点添加这行代码,手动清理 CUDA 上下文
    cctx  = cuda.Device(0).make_context()
    # PLUGIN_LIBRARY = "weights/libmyplugins.so"
    # ctypes.CDLL(PLUGIN_LIBRARY)
    engine_file_path = 'C:\PycharmProject\yolov5-7.0(myself)\weight\yolov5s.engine'
    detect(engine_file_path)

    # 在程序的退出点添加这行代码,手动清理 CUDA 上下文
    ctx.pop()

但我部署的时候出现点问题,写该篇博客的时候还未解决。

ValueError: could not broadcast input array from shape (371712,) into shape (1228800,)
-------------------------------------------------------------------
PyCUDA ERROR: The context stack was not empty upon module cleanup.
-------------------------------------------------------------------
A context was still active when the context stack was being
cleaned up. At this point in our execution, CUDA may already
have been deinitialized, so there is no way we can finish
cleanly. The program will be aborted now.
Use Context.pop() to avoid this problem.

有遇到该问题并解决的还请留个言,告诉我解决办法,谢谢。


http://www.niftyadmin.cn/n/5432808.html

相关文章

mybatis源码阅读系列(二)

前言 上一篇文章mybatis源码阅读系列(一)介绍了mybatis和原生jdbc的区别,并通过代码展示了两者的运行过程和结果,下面让我们继续详细了解下mybatis的执行过程; package com.wyl.mybatis.service;import com.wyl.mybat…

【深度学习与神经网络】MNIST手写数字识别1

简单的全连接层 导入相应库 import torch import numpy as np from torch import nn,optim from torch.autograd import Variable import matplotlib.pyplot as plt from torchvision import datasets, transforms from torch.utils.data import DataLoader读入数据并转为ten…

矩阵消元-MIT

文章目录 1. 行变换消元法 1. 行变换消元法 假设我们有一个方程组表示如下: x 2 y z 2 ; 3 x 8 y z 12 ; 4 y z 2 (1) x2yz2;\quad 3x8yz12;\quad4yz2\tag{1} x2yz2;3x8yz12;4yz2(1)矩阵表示如下: [ 1 2 1 3 8 1 0 4 1 ] → [ 1 2 1 0 2 − 2…

【RS422】基于未来科技FT4232HL芯片的多波特率串口通信收发实现

功能简介 串行通信接口常常用于在计算机和低速外部设备之间传输数据。串口通信存在多种标准,以RS422为例,它将数据分成多个位,采用异步通信方式进行传输。   本文基于Xilinx VCU128 FPGA开发板,对RS422串口通信进行学习。   根…

MySQL数据导入的方式介绍

MySQL数据库中的数据导入是一个常见操作,它涉及将数据从外部源转移到MySQL数据库表中。在本教程中,我们将探讨几种常见的数据导入方式,包括它们的特点、使用场景以及简单的示例。 1. 命令行导入 使用MySQL命令行工具mysql是导入数据的…

【MySQL】5. 数据类型

数据类型 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 数值越界测试: mysql> use tt; Database changed mysql> create table t1(-> num tinyint-> ); Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(-128); Query OK, 1 r…

Opencascade基础教程(11):设置显示模式

1、设置显示模式 1.1 增加按钮添加消息响应函数 //线框 void COCCDemoDoc::OnButtonWireframemode() {//关闭边界框const Handle(Prs3d_Drawer)& aDrawer m_AISContext->DefaultDrawer();aDrawer->SetFaceBoundaryDraw(false);//线框m_AISContext->SetDisplayMo…

Spring同时集成JPA与Mybatis

Spring同时集成JPA与Mybatis 目录 Spring同时集成JPA与Mybatis ORM Spring ORM Spring ORM 同时集成JPA与Mybatis 一、创建一个SpringBoot项目 二、建立用户信息登记表 三、Web应用项目集成mysql 四、添加Spring Data JPA和Mybatis依赖 五、添加数据表映射实体类 六…