深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析

本文将详细介绍如何脱离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)
        # 添加填充(上下左右)
       
2025-03-07 13:53:46.4404814 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.4492659 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.4647063 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.4728167 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.4801568 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.4914343 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.5035378 [I:onnxruntime:YOLOv8, bfc_arena.cc:267 onnxruntime::BFCArena::Reserve] Reserving memory in BFCArena for Cuda size: 33554432 2025-03-07 13:53:46.5095526 [I:onnxruntime:YOLOv8, bfc_arena.cc:317 onnxruntime::BFCArena::AllocateRawInternal] Extending BFCArena for CUDA_CPU. bin_num:10 (requested) num_bytes: 336000 (actual) rounded_bytes:336128 2025-03-07 13:53:46.5171154 [I:onnxruntime:YOLOv8, bfc_arena.cc:197 onnxruntime::BFCArena::Extend] Extended allocation by 1048576 bytes. 2025-03-07 13:53:46.5200680 [I:onnxruntime:YOLOv8, bfc_arena.cc:200 onnxruntime::BFCArena::Extend] Total allocated bytes: 1048576 2025-03-07 13:53:46.5227517 [I:onnxruntime:YOLOv8, bfc_arena.cc:203 onnxruntime::BFCArena::Extend] Allocated memory at 00000158FF067060 to 00000158FF167060这是最后的日志,过程中未发现异常,综合前几次的日志,GPU是否正确调用,为什么GPU的推理时间要比CPU还慢
03-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VisionX Lab

你的鼓励将是我更新的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值