本文将详细介绍如何脱离YOLO官方环境,使用ONNX Runtime部署YOLOv8姿态估计模型。内容包括模型加载、图像预处理(Letterbox缩放和填充)、推理执行、输出解码(边界框和关键点处理)、非极大值抑制(NMS)以及结果可视化。文章还将讨论部署中的性能优化和常见问题。
一,引言
姿态估计是计算机视觉中的一项重要任务,旨在检测图像或视频中人体关键点的位置。YOLOv8 Pose是Ultralytics公司推出的实时姿态估计模型,它将目标检测和关键点估计结合在一个端到端的网络中。为了在各种环境中高效部署该模型,选择使用ONNX Runtime(ORT),它支持跨平台(包括CPU和GPU)推理,且不依赖于原始训练框架。
二,模型加载与初始化
在YOLOv8Pose类的初始化方法中,加载ONNX模型并配置推理会话:
class YOLOv8Pose:
def __init__(self, model_path, conf_thres=0.1, iou_thres=0.45):
self.conf_thres = conf_thres
self.iou_thres = iou_thres
# 初始化ONNX Runtime
self.session = ort.InferenceSession(model_path)
self.input_name = self.session.get_inputs()[0].name
self.output_name = self.session.get_outputs()[0].name
self.input_shape = self.session.get_inputs()[0].shape[2:] # (h, w)
注意:
model_path:ONNX模型文件的路径。
conf_thres:置信度阈值,用于过滤低置信度的检测框。
iou_thres:NMS中的IoU阈值。
从模型输入中获取输入形状(高度和宽度),通常为640x640。
三 . 图像预处理:Letterbox缩放与填充
由于模型输入尺寸固定,而输入图像尺寸各异,我们需要将图像调整为模型输入尺寸,同时保持长宽比,以避免扭曲。这通过Letterbox算法实现:
def preprocess(self, img):
# 原始图像尺寸
self.orig_h, self.orig_w = img.shape[:2]
# 计算缩放比例(取最小比例,使长边缩放到模型输入尺寸,短边按比例缩放)
scale = min(self.input_shape[0] / self.orig_h, self.input_shape[1] / self.orig_w)
# 计算缩放后的新尺寸
self.new_unpad = (int(self.orig_w * scale), int(self.orig_h * scale))
# 计算填充(在缩放到模型尺寸后,需要在两侧添加的填充)
self.dw = (self.input_shape[1] - self.new_unpad[0]) / 2 # 水平填充
self.dh = (self.input_shape[0] - self.new_unpad[1]) / 2 # 垂直填充
# 执行缩放
if (self.new_unpad[0], self.new_unpad[1]) != (self.orig_w, self.orig_h):
img = cv2.resize(img, self.new_unpad, interpolation=cv2.INTER_LINEAR)
# 添加填充(上下左右)

最低0.47元/天 解锁文章
8万+






