YOLOv8 TensorRT部署(Python推理)——保姆教学

随着计算机视觉技术的快速发展,YOLO系列模型因其优越的目标检测性能而受到广泛关注。在深度学习推理中,TensorRT作为一款高性能的推理引擎,能够显著提升YOLOv8模型的推理速度和效率。本篇文章将介绍如何在Python中使用TensorRT部署YOLOv8,帮助大家快速上手。

环境准备

在开始之前,请确保您的环境中已经安装了以下软件: 1. NVIDIA显卡(建议使用支持TensorRT的显卡) 2. CUDA Toolkit 3. cuDNN 4. TensorRT 5. Python(建议使用Anaconda管理环境)

接下来,确保安装必需的Python库:

pip install torch torchvision
pip install onnx onnx-tf
pip install numpy opencv-python

将YOLOv8导出为ONNX格式

首先,我们需要将YOLOv8模型导出为ONNX格式。以YOLOv8的官方实现为例,您可以使用以下代码:

import torch

# 加载YOLOv8模型
model = torch.hub.load('ultralytics/yolov8', 'yolov8s', pretrained=True)

# 创建随机输入张量
dummy_input = torch.randn(1, 3, 640, 640)

# 导出为ONNX格式
torch.onnx.export(model, dummy_input, "yolov8.onnx", opset_version=12, 
                  input_names=['images'], output_names=['output'])

运行以上代码后,您将在当前目录下看到一个名为yolov8.onnx的文件。

使用TensorRT进行推理

接下来,我们将使用TensorRT对导出的ONNX模型进行推理。首先需要将ONNX模型转换为TensorRT引擎。

import tensorrt as trt

def build_engine(onnx_file_path):
    logger = trt.Logger(trt.Logger.WARNING)
    with trt.Builder(logger) as builder, builder.create_network() as network:
        # 创建ONNX解析器
        parser = trt.OnnxParser(network, logger)

        # 读取ONNX模型文件
        with open(onnx_file_path, 'rb') as model:
            parser.parse(model.read())

        # 配置优化
        builder.max_workspace_size = 1 << 30  # 1GB
        builder.max_batch_size = 1

        # 返回TensorRT引擎
        return builder.build_cuda_engine(network)

# 构建TensorRT引擎
engine = build_engine('yolov8.onnx')

准备推理函数

在构建完成TensorRT引擎之后,我们需要编写推理函数,以便对输入图像进行目标检测:

import numpy as np
import cv2

def infer(engine, img):
    # 初始化CUDA上下文
    runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))

    with engine.create_execution_context() as context:
        # 预处理输入图像
        img = cv2.resize(img, (640, 640))
        img = img.astype(np.float32) / 255.0
        img = np.transpose(img, (2, 0, 1)).flatten()  # CHW格式
        img = np.array(img, dtype=np.float32)

        # 在CUDA上分配输入输出空间
        d_input = cuda.mem_alloc(1 * img.nbytes)
        d_output = cuda.mem_alloc(1 * engine.get_binding_size(1))

        # 将数据复制到GPU
        cuda.memcpy_htod(d_input, img)

        # 执行推理
        context.execute(batch_size=1, bindings=[int(d_input), int(d_output)])

        # 从GPU获取输出
        output = np.empty(1 * engine.get_binding_size(1), dtype=np.float32)
        cuda.memcpy_dtoh(output, d_output)

        return output

# 加载待检测图像
input_image = cv2.imread('test.jpg')
output = infer(engine, input_image)

# 输出处理
print(output)

结束与总结

以上代码展示了如何将YOLOv8导出为ONNX格式,并利用TensorRT进行推理。通过这个简要的教学,您应该能够在自己的项目中实现YOLOv8模型的高效推理。在实际应用中,可以根据需求进行更多的优化,如模型量化和调整推理参数,进一步提升性能。

希望此教程对您有所帮助,祝您在目标检测的道路上越走越远!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部