【论文阅读】RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose

《RTMPose: Real-Time Multi-Person Pose Estimation based on MMPose》,主要介绍了一种高性能实时多人姿态估计框架RTMPose,能在多种设备上实现实时推理,平衡模型性能和复杂度。
原文链接:https://arxiv.org/abs/2303.07399
代码:https://github.com/open-mmlab/mmpose/tree/main/projects/rtmpose

  1. 研究背景:2D姿态估计在学术基准测试中表现不错,但因模型参数多、延迟高,在工业领域应用受限。实时人体姿态估计在人机交互、动作识别等方面有很大需求,因此本文旨在缩小差距,设计出更适用于工业应用的模型。

  2. 创新点

    1. 采用新范式:使用自上而下的方法,借助实时检测器的高效性,让检测不再成为速度瓶颈,在多数场景能实时处理多人实例。
    2. 选择合适骨干网络:采用CSPNeXt作为骨干网络,在速度、准确性和部署友好性上达到较好平衡。
    3. 新的关键点预测算法:用基于SimCC的算法预测关键点,将其看作分类任务,计算量更低,部署更容易。
    4. 优化训练策略:重新研究并引入适用于姿态估计任务的训练策略,提升了模型性能。
    5. 优化推理流程:联合优化推理流程,用跳帧检测策略降低延迟,通过姿态非极大值抑制(NMS)和平滑滤波提高稳定性。还提供不同尺寸的模型,满足不同场景需求。
  3. 网络设计:整体架构包含卷积层、全连接层和门控注意力单元(GAU)。骨干网络用CSPNeXt/(目标检测),通过全连接层扩展特征维度,再经GAU模块优化关键点表示,最后将2D姿态估计视为对x轴和y轴坐标的两个分类任务,预测关键点的水平和垂直位置。
    RTMPose网络结构

  4. 原理:基于SimCC将关键点定位看作分类问题,把水平和垂直轴划分成等宽的区间,将连续坐标离散化为区间标签,模型训练预测关键点所在区间。利用高斯标签平滑策略,用软标签替代独热标签,减少量化误差,提高模型性能。

  5. 训练策略

    • 预训练:用基于热图的UDP方法对骨干网络预训练,提升模型准确性。
    • 优化策略:采用指数移动平均(EMA)减轻过拟合,使用平坦余弦退火策略提高准确率,抑制归一化层和偏差的权重衰减。
    • 两阶段训练增强:先使用强数据增强训练180个epoch,再用弱增强策略训练30个epoch ,防止模型过拟合,使其更好地学习姿态结构信息。
  6. 实验结果:在COCO、COCO-SinglePerson、COCO-WholeBody等多个数据集上进行实验,RTMPose相比其他开源库,在准确率和复杂度上表现更优。在不同设备上测试推理速度,结果显示RTMPose能在多种设备(CPU、GPU、移动设备)上实现实时推理。

  7. 研究结论:该研究探索了姿态估计中的关键因素,提出的RTMPose框架在平衡模型性能和复杂度方面表现出色,可在多种设备上实时推理。希望该算法及其开源实现能满足工业中姿态估计的部分需求,推动人体姿态估计任务的进一步研究。

### OpenPose 实时多人 2D 姿态估计 OpenPose 是由卡内基梅隆大学感知计算实验室开发的一项开创性技术,旨在实现实时多人2D姿态估计。该系统能够在同一场景中同时检测多个人体的关键点,包括身体、手部、面部和脚部的位置[^1]。 #### 部分亲和域 (Part Affinity Fields) 为了提高姿态估计的准确性并解决遮挡问题,OpenPose引入了部分亲和域(Part Affinity Fields, PAFs)的概念。PAFs用于表示不同部位之间的连接关系,具体来说: - **定义**:对于每一对相连的身体部件(如肩膀到肘),构建一个二维向量场来描述这对部件的方向性和置信度。 - **作用机制**:通过分析这些向量场中的梯度方向可以推断出各个肢体间的相对位置以及它们之间是否存在关联。这使得即使某些关节被遮挡或不可见的情况下也能正确重建完整的骨架结构[^3]。 ```python import cv2 from openpose import pyopenpose as op params = dict() params["model_folder"] = "path/to/models" opWrapper = op.WrapperPython() opWrapper.configure(params) datum = op.Datum() cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() datum.cvInputData = frame opWrapper.emplaceAndPop([datum]) # Display keypoints and part affinity fields on the image cv2.imshow("Keypoints", datum.cvOutputData) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() ``` 此代码片段展示了如何利用OpenPose库读取摄像头输入,并显示处理后的图像,其中包含了检测到的人体关键点及其对应的PAF可视化结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值