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模型的高效推理。在实际应用中,可以根据需求进行更多的优化,如模型量化和调整推理参数,进一步提升性能。
希望此教程对您有所帮助,祝您在目标检测的道路上越走越远!