RTMPose

1. 人体姿态估计简介

  • 多人姿态估计框架包括5个方面:
    • paradigm:范式
      • top-down:
        • 用于人数不多于6人的场景
        • 使用现成的检测器提供边界框,然后将人体裁剪为统一的尺度进行姿势估计
        • 人体检测器和位姿估计器可输入较小的分辨率
      • bottom-up:
        • 自下而上的范式被认为适合人群场景,因为随着人数的增加,计算成本保持稳定;
        • 通常需要较大的输入分辨率来处理不同的人的尺度,这使得协调准确性和推理速度变得具有挑战性
    • backbone network:骨干网络
    • localization method:定位算法
      • 坐标回归(coordinate regression)
      • 热图回归(heatmap regression)
      • 坐标分类(coordinate classification)
        • 子像素箱分类(将关键点预测看作为分别针对水平和垂直坐标的子像素箱的分类)
        • 代表算法:SimCC
        • 摆脱了对高分辨率热图的依赖,因此可以实现非常紧凑的架构,既不需要高分辨率中间表示,也不需要昂贵的上采样层
        • 展平最终的特征图进行分类,不需要全局池化,从而避免了空间信息的丢失
        • 通过亚像素尺度的坐标分类可以有效缓解量化误差,无需额外的优化后处理
    • training strategy:训练策略
    • deployment:部署推理

2. RTMPose

2.1 网络结构

在这里插入图片描述

  • GAU:Gated Attention Unit (门控注意力单元)
  • RTMPose的整体架构包含:
    • 骨干网络
    • 一个卷积层
    • 一个全连接层
    • 一个用于细化K个关键点表示的门控注意力单元
    • 将二维姿态估计视为x轴和y轴坐标的两个分类任务,以预测关键点的水平和垂直位置

2.2 基于SimCC的优化路线

在这里插入图片描述

2.2.1 SimCC:

  • 核心思想:将水平轴和垂直轴划分为等宽编号的 bin,并将连续坐标离散化为整数 bin 标签。 然后训练模型来预测关键点所在的 bin。 通过使用大量的 bin,可以将量化误差降低到子像素级别。
  • 结构简单:由于这种新颖的公式,SimCC 具有非常简单的结构,使用 1 × 1 卷积层将主干提取的特征转换为矢量化关键点表示,并使用两个全连接层分别执行分类
  • 平滑策略:受传统分类任务中标签平滑的启发[53],SimCC提出了一种高斯标签平滑策略,用以ground-truth bin为中心的高斯分布式软标签代替one-hot标签,该策略在模型训练中融合了归纳偏差,带来了显著的性能改进。

2.2.2 RTMPose

  • 基于SimCC,做了以下改进 (SimCC*)
    • 删除了上采样层 (SimCC*)
    • 使用CSPNext-m 替换 ResNet-50
      在这里插入图片描述

2.3 训练技巧

2.3.1 预训练

  • 主干网络通过基于heatmap的方法进行预训练

2.4 模块设计

2.4.1 特征维度

  • 模型性能随着特征分辨率的提高而提高。
  • 使用全连接层将一维关键点表示扩展到由超参数控制的所需维度。 在本文中使用 256 个维度,精度从 71.2% AP 更改为 71.4% AP。

2.4.2 自注意力模块

  • 为了进一步利用全局和局部空间信息,使用自注意力模块优化关键点表示。
  • 采用transformer变体,门控注意力单元(GAU),与普通transformer相比,它具有更快的速度、更低的内存成本和更好的性能。

2.5 微观设计

2.5.1 损失函数

  • 将坐标分类视为序数回归任务,并遵循 SORD 中提出的软标签编码

2.5.2 更大的卷积核

在这里插入图片描述

2.6 推理流程

  • 除了姿态估计模型之外,还进一步优化了整体自上而下的推理流程,以实现更低的延迟和更好的鲁棒性。 使用 BlazePose中的跳帧检测机制,其中每 K 帧执行一次人体检测,并且在间隔帧中,边界框是根据最后的姿势估计结果生成的。
  • 为了实现帧的平滑预测,在后处理阶段使用基于 OKS 的姿态 NMS 和 OneEuro滤波器。
    在这里插入图片描述
<think>好的,我现在需要帮助用户将RTMPose模型转换为ONNX格式或者如何在ONNX中使用RTMPose。首先,我应该回忆一下MMDeploy的相关知识,因为用户提供的引用里提到了MMDeploy,这可能是一个关键工具。 用户的问题涉及到模型转换,而引用[1]提到使用MMDeploy得到ONNX模型,所以应该从这里入手。首先,我需要确认RTMPose是否在MMDeploy的支持列表中。MMDeploy是OpenMMLab的一个部署工具,支持多种模型的导出,包括检测、分割、姿态估计等,所以RTMPose作为OpenMMLab的模型,应该支持。 接下来,步骤可能包括安装MMDeploy、配置环境,然后使用提供的工具或脚本进行转换。用户可能需要安装一些依赖,比如ONNX运行时,PyTorch,以及MMCV等。需要提醒用户检查版本兼容性,因为不同版本的库可能会有不同的接口。 然后,转换过程中可能需要加载RTMPose的配置文件(config)和检查点文件(checkpoint),使用MMDeploy的转换工具,比如tools/deploy.py脚本,指定后端为ONNX。同时,可能需要指定输入的形状,例如输入图片的大小,这对后续推理很重要。 转换完成后,用户可能需要验证生成的ONNX模型是否正确。引用[1]中也提到了使用Python SDK进行验证,可以建议用户使用ONNX Runtime加载模型,运行示例输入,检查输出是否合理。 另外,用户可能还想知道如何在ONNX中使用转换后的模型,比如进行推理的步骤。这部分需要指导如何加载ONNX模型,预处理输入数据,运行推理,以及后处理结果。可能还需要注意输入输出的名称和格式,是否符合预期。 可能遇到的问题包括版本冲突、模型转换时的错误(如不支持的算子),或者推理时的形状不匹配。这时候需要建议用户查看错误信息,检查环境配置,或者到社区寻求帮助。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如性能优化、部署到其他平台、量化模型等,尤其是引用[2]提到了量化到GGUF格式,虽然用户现在可能不需要,但相关问题可以引导他们进一步探索。 总结来说,回答的结构应该是:先介绍使用MMDeploy进行转换的步骤,然后说明如何验证和使用转换后的模型,最后提醒常见问题和注意事项。确保步骤清晰,命令准确,并引用相关的参考资料。</think>要将RTMPose模型转换为ONNX格式并在ONNX中使用,可按照以下步骤操作: --- ### **步骤1:环境准备** 1. 安装MMDeploy及相关依赖: ```bash pip install openmim mim install mmengine mmcv mmpose pip install mmdeploy==1.3.0 # 确保版本与MMPose兼容[^1] ``` 2. 安装ONNX Runtime: ```bash pip install onnxruntime ``` --- ### **步骤2:模型转换** 1. **下载RTMPose配置文件和预训练权重** 从[MMPose官方仓库](https://github.com/open-mmlab/mmpose)获取RTMPose的配置文件(如`rtmpose-s_8xb256-420e_coco-256x192.py`)和对应的权重文件(`.pth`)。 2. **使用MMDeploy导出ONNX模型** 运行以下命令,指定输入尺寸(如`256x192`): ```bash python tools/deploy.py \ configs/mmpose/pose-detection_onnxruntime_dynamic.py \ /path/to/rtmpose-s_8xb256-420e_coco-256x192.py \ /path/to/rtmpose-s.pth \ /path/to/test_image.jpg \ --work-dir ./rtmpose-onnx \ --device cpu \ --show ``` 生成的ONNX文件将保存在`./rtmpose-onnx`目录中[^1]。 --- ### **步骤3:验证ONNX模型** 1. **使用ONNX Runtime推理** ```python import cv2 import numpy as np import onnxruntime # 加载ONNX模型 session = onnxruntime.InferenceSession("rtmpose-s.onnx") # 预处理输入图像(尺寸需与导出时一致) image = cv2.imread("test.jpg") image = cv2.resize(image, (192, 256)) input_data = np.transpose(image, (2, 0, 1)).astype(np.float32)[None, ...] # 运行推理 outputs = session.run(None, {"input": input_data}) keypoints = outputs[0] # 关键点坐标 ``` 2. **后处理** 根据MMPose的输出格式解析关键点,通常需要应用非极大值抑制(NMS)或阈值过滤。 --- ### **注意事项** 1. **动态输入尺寸** 若需支持动态输入,在导出时添加`--dynamic`参数: ```bash --dynamic ``` 2. **算子兼容性** 若遇到不支持的算子(如`DeformConv2d`),需检查MMDeploy版本或联系社区更新支持列表。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值