使用TensorRT对yolov7进行加速

版本:

TensorRT:8.2.5.1

1.安装TensorRT,上一篇博客有教程https://blog.csdn.net/Power392413/article/details/126320255

2.下载yolov7和YOLOv7_Tensorrt包:

git clone https://github.com/WongKinYiu/yolov7
git clone https://github.com/Monday-Leo/YOLOv7_Tensorrt

3.生成onnx模型文件:

将YOLOv7_Tensorrt文件夹下的EfficientNMS.py和export_onnx.py复制到yolov7文件夹下后运行:

python export_onnx.py --weights ./weights/yolov7.pt

4.生成engine模型文件:

将onnx模型复制到TensorRT/bin文件夹下。

conda activate ddaction
cd TensorRT-8.2.5.1\bin
trtexec --onnx=./yolov7.onnx --saveEngine=./yolov7_fp16.engine --fp16 --workspace=200

5.测试:

修改YOLOv7_Tensorrt\infer.py文件:

import cv2
import tensorrt as trt
import torch
import numpy as np
from collections import OrderedDict,namedtuple

class TRT_engine():
    def __init__(self, weight) -> None:
        self.imgsz = [640,640]
        self.weight = weight
        self.device = torch.device('cuda:0')
        self.init_engine()

    def init_engine(self):
        # Infer TensorRT Engine
        self.Binding = namedtuple('Binding', ('name', 'dtype', 'shape', 'data', 'ptr'))
        self.logger = trt.Logger(trt.Logger.INFO)
        trt.init_libnvinfer_plugins(self.logger, namespace="")
        with open(self.weight, 'rb') as self.f, trt.Runtime(self.logger) as self.runtime:
            self.model = self.runtime.deserialize_cuda_engine(self.f.read())
        self.bindings = OrderedDict()
        self.fp16 = False
        for index in range(self.model.num_bindings):
            self.name = self.model.get_binding_name(index)
            self.dtype = trt.nptype(self.model.get_binding_dtype(index))
            # self.shape = tuple(self.model.get_binding_shape(index))
            a = self.model.get_binding_shape(index)
            # self.shape = (a[0], a[1], a[2], a[3])
            self.shape = (1, 3, 640, 640)
            self.data = torch.from_numpy(np.empty(self.shape, dtype=np.dtype(self.dtype))).to(self.device)
            self.bindings[self.name] = self.Binding(self.name, self.dtype, self.shape, self.data, int(self.data.data_ptr()))
            if self.model.binding_is_input(index) and self.dtype == np.float16:
                self.fp16 = True
        self.binding_addrs = OrderedDict((n, d.ptr) for n, d in self.bindings.items())
        self.context = self.model.create_execution_context()

    def letterbox(self,im,color=(114, 114, 114), auto=False, scaleup=True, stride=32):
        # Resize and pad image while meeting stride-multiple constraints
        shape = im.shape[:2]  # current shape [height, width]
        new_shape = self.imgsz
        if isinstance(new_shape, int):
            new_shape = (new_shape, new_shape)
        # Scale ratio (new / old)
        self.r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
        if not scaleup:  # only scale down, do not scale up (for better val mAP)
            self.r = min(self.r, 1.0)
        # Compute padding
        new_unpad = int(round(shape[1] * self.r)), int(round(shape[0] * self.r))
        self.dw, self.dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh padding
        if auto:  # minimum rectangle
            self.dw, self.dh = np.mod(self.dw, stride), np.mod(self.dh, stride)  # wh padding
        self.dw /= 2  # divide padding into 2 sides
        self.dh /= 2
        if shape[::-1] != new_unpad:  # resize
            im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)
        top, bottom = int(round(self.dh - 0.1)), int(round(self.dh + 0.1))
        left, right = int(round(self.dw - 0.1)), int(round(self.dw + 0.1))
        self.img = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add border
        return self.img,self.r,self.dw,self.dh

    def preprocess(self,image):
        self.img,self.r,self.dw,self.dh = self.letterbox(image)
        self.img = self.img.transpose((2, 0, 1))
        self.img = np.expand_dims(self.img,0)
        self.img = np.ascontiguousarray(self.img)
        self.img = torch.from_numpy(self.img).to(self.device)
        self.img = self.img.float()
        return self.img

    def predict(self,img,threshold):
        img = self.preprocess(img)
        self.binding_addrs['images'] = int(img.data_ptr())
        self.context.execute_v2(list(self.binding_addrs.values()))
        nums = self.bindings['num_dets'].data[0][0][0].tolist()
        boxes = self.bindings['det_boxes'].data[0][0][0].tolist()
        scores =self.bindings['det_scores'].data[0][0][0].tolist()
        classes = self.bindings['det_classes'].data[0][0][0].tolist()
        num = int(nums[0])
        # num = nums[0][0][0]
        new_bboxes = []
        for i in range(num):
            if(scores[i] < threshold):
                continue
            xmin = (boxes[4*i] - self.dw)/self.r
            ymin = (boxes[4*i+1] - self.dh)/self.r
            xmax = (boxes[4*i+2] - self.dw)/self.r
            ymax = (boxes[4*i+3] - self.dh)/self.r
            new_bboxes.append([classes[i],scores[i],xmin,ymin,xmax,ymax])
        return new_bboxes

def visualize(img,bbox_array):
    for temp in bbox_array:
        xmin = int(temp[2])
        ymin = int(temp[3])
        xmax = int(temp[4])
        ymax = int(temp[5])
        clas = int(temp[0])
        score = temp[1]
        cv2.rectangle(img,(xmin,ymin),(xmax,ymax), (105, 237, 249), 2)
        img = cv2.putText(img, "class:"+str(clas)+" "+str(round(score,2)), (xmin,int(ymin)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (105, 237, 249), 1)
    return img

trt_engine = TRT_engine("./trt_model/yolov7_fp16.engine")
img = cv2.imread("./pictures/zidane.jpg")
results = trt_engine.predict(img,threshold=0.5)
img = visualize(img,results)
cv2.imwrite("./pictures/zidane0.jpg", img)
cv2.imshow("img",img)
cv2.waitKey(0)

运行:

python infer.py

在这里插入图片描述

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 很抱歉,我是一名语言模型AI,无法进行操作和编程。但是,我可以为您提供一些相关信息。TensorRT是一种高性能深度学习推理库,可以加速模型的推理速度。YoloV5是一种目标检测算法,可以用于检测图像或视频中的物体。在Windows上使用TensorRT加速YoloV5,您需要先安装TensorRTYoloV5,并将YoloV5模型转换为TensorRT格式。然后,您可以使用TensorRT API加载和推理模型,从而加速YoloV5的推理速度。具体操作步骤可以参考TensorRTYoloV5的官方文档。 ### 回答2: TensorRT是NVIDIA为深度学习框架提供的高性能推理引擎。YoloV5是一种经典的目标检测算法,具有较高的准确率和实时性能。在Windows系统中,使用TensorRT可以加速YoloV5的推理速度,以实现更高效的目标检测。 要在Windows上使用TensorRT加速YoloV5,需要执行以下几个步骤: 1. 安装TensorRT深度学习框架:在Windows系统中,TensorRT可以通过官方网站下载安装包进行安装。目前,TensorRT支持PyTorch、TensorFlow等多种深度学习框架,用户应根据自己的需要选择合适的框架。 2. 编译YoloV5:YoloV5的源代码可以从官方GitHub库中获取。在Windows系统中,需要使用Visual Studio等工具编译源代码,并生成可执行文件。 3. 应用TensorRT进行推理加速:将编译后的YoloV5可执行文件加载至TensorRT中,并使用NVIDIA GPU进行推理加速。 在使用TensorRT加速YoloV5时需要注意的一些问题: 1. 版本兼容性:TensorRT深度学习框架的不同版本可能存在兼容性问题,用户需要根据官方文档提供的信息选择合适的版本。 2. TensorRT配置:用户需要根据自己的硬件配置和应用场景,对TensorRT引擎进行合理的配置。主要包括模型优化、内存使用方式、线程数等方面。 3. 精度损失:使用TensorRT进行推理加速可能会导致精度的损失,用户需要评估自己的应用场景,权衡速度和精度之间的平衡。 综上所述,使用TensorRT加速YoloV5是一种有效的推理加速方法,在Windows系统中也可以实现。用户需要根据自己的实际需求和硬件配置,选择合适的TensorRT版本和深度学习框架,进行相关的配置和优化,以获得最佳的性能和精度。 ### 回答3: 近年来,深度学习在计算机视觉领域得到广泛应用,如物体检测、图像分类等。其中,Yolo系列算法以其速度快、效果好、精度高等优点受到了广泛关注和应用。但是,Yolo系列算法在运行速度方面还有提升的空间。此时,选用TensorRT工具可以对Yolo系列算法进行优化加速TensorRT是Nvidia针对深度学习推理领域开发的一款高性能优化工具,可以将训练好的深度学习模型进行优化后加速模型推理的过程,可以显著提高推理速度和效率。而Yolov5算法是基于PyTorch框架实现的,因此TensorRT需要与PyTorch框架进行结合使用。由于TensorRT在Windows系统中的使用不太友好,本文将对如何在Windows上使用TensorRT加速Yolov5算法进行详细解释。 首先,搭建深度学习环境:安装pytorch、Cuda、cudnn等环境及其依赖项; 其次,生成ONNX模型文件:使用Pytorch训练好的Yolov5模型需要转化为ONNX格式,这个可以使用torch.onnx.export()函数进行转换。 然后,生成TensorRT模型文件:在生成ONNX模型的基础上使用TensorRT的创建推理引擎工具create_inference_engine.py进行转换。 最后,利用TensorRT加速推理过程:在代码中使用TensorRT推理引擎,并比较与未使用TensorRT加速时的运行时间。 需要注意的是,在使用TensorRT优化Yolov5模型时需要调整一些参数,例如batch size、max workspace size等,以及根据硬件环境进行优化,可参考TensorRT官方文档和案例。 总的来说,使用TensorRT可以显著提高Yolov5算法的推理速度和效率,对于实时热点视频监控、智能安防等方面的应用具有重要意义。同时,TensorRT在Windows系统上的使用虽然存在一些不便,但只要按照步骤进行操作,还是能够顺利完成优化加速过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值