姿态估计,计算机视觉的核心任务之一,还原纷繁外表之下的空间信息,洞察千姿百态背后的本征结构。
MMPose 作为 OpenMMLab 系列中的姿态估计算法库,自 2020 年发布以来,经过 2 年的不断迭代打磨,已经成为姿态估计领域覆盖算法最多,功能最全的开源算法库之一。MMPose 的成长离不开来自社区同学的宝贵意见和热情帮助,每个 star 和 PR 都为 MMPose 注入了活力。同时,我们也欣喜地看到 MMPose 正成为越来越多顶会论文、项目产品背后的有力工具。
伴随着此次 OpenMMLab 整体架构升级,MMPose 也终于要跨入 v1.0 时代了。在 1.0 版本中,我们对 MMPose 进行了大幅的重构和优化, 正如标题所说,希望能带给大家一个设计更优雅、功能和扩展性更强大的姿态估计研发框架和解决方案。
太长不看版
MMPose 1.0 带来的 6 大全新体验:
1.基于模型训练引擎 MMEngine 的架构设计,使模型训练流程更直观,代码更简化,接口更统一
2.新增姿态编解码器模块,统合姿态前后处理过程
3.统一 top-down 和 bottom-up 方法的数据接口
4.新增 SimCC,Debias IPR 等多个轻量化姿态估计算法
5.全流程可视化工具,关键点、骨骼、热力图尽收眼底
6.更友好的用户文档,帮助新老用户顺利开启 MMPose 1.0 之旅
MMPose 新版本基于 OpenMMLab 最新推出的模型训练引擎 MMEngine,由此带来了代码结构和训练流程的简化。
在 MMPose 原有的架构设计中,对于一个典型的模型训练过程,我们可以发现各个模块的构建被分散在了脚本、MMPose 库函数、MMCV 库函数中;模型的前向传播,反向更新分散在执行器和钩子中,这对于用户理解训练流程带来了很多困难,用户需要自定义修改时容易找不到位置(图 1 左)。
而在新的架构中,MMEngine 的执行器集中了所有的模块构建功能,训练脚本只用于最基本的配置解析(图 1 右),这样新的训练流程不仅逻辑更加清晰,大大减少了代码量,还能为用户带来更方便的模型调试体验,让用户灵活地定义模型的前向和反向过程。
图 1 基于 MMEngine 的新架构带来的训练流程简化
同时,MMEngine 还带来诸多功能和接口上的遍历,如可以在 MMPose 中轻松地使用其他 OpenMMLab 算法库的模型组件(图 2 左),或者获取其他 OpenMMLab 算法库的模型配置文件 (图 2 右)。
图 2 基于 MMEngine 的跨算法库调用(左:通过 config 调用其他算法库的模块;右:通过 MMEngine 接口跨库获取配置文件)
对物体的关键点进行编码和解码,是姿态估计模型训练和推理的核心步骤之一。
在旧版本的 MMPose 中,编码和解码的过程分散在不同模块中(dataset,pipeline,head,evaluation 等),导致代码逻辑不够连贯,且不同模块的配置互相耦合,给用户的学习和使用带来了不便(图 3)。
图 3: 旧版本 MMPose 中编解码相关代码:较为分散,不易复用
在 MMPose 1.0 中,我们引入了姿态编解码器(Codec)这一新模块,将编码和解码过程整合在一起。每个编解码器通过编码(encode)和解码(decode)两个核心方法,完整定义了一种关键点的表示形式(如:高斯热力图、归一化坐标等)。通过这样的设计,提升了代码的友好性和可复用性。
在使用新版本 MMPose 配置模型时,只要指定使用的编解码器类型和参数,然后在数据集的 pipeline (对训练数据进行编码)和模型的 head(对模型输出进行解码)使用编解码器即可。
图 4 MMPose 1.0 中的编解码器及其配置:整合代码、配置方便
自顶向下(top-down)和自底向上(bottom-up)是姿态估计中重要的两种方法范式。Top-down 方法首先检测目标位置,然后在检测框中检测单个目标的关键点;Bottom-up 方法直接在整幅图像上检测所有关键点,然后将属于同一目标的关键点划分为一组。
图 5 姿态估计中的 2 类重要方法:top-down 和 bottom-up
在旧版本的 MMPose 中,top-down 和 bottom-up 使用不同的 dataset 类,数据格式上存在一定差别。且在每一类方法中,数据样本真值(ground-truth)和模型预测(prediction)格式也存在差别。这导致 top-down 和 bottom-up 两类算法之间功能相似的模块无法复用,而每类算法各自的模块之间又存在耦合(如 dataset 与 evaluation 耦合,model 与 visualization 耦合)。这一定程度上增加了学习、开发和维护的成本(图 6)。
图 6 旧版本 MMPose 中数据接口不统一
在 MMPose 1.0 版本中,我们在 top-down 和 bottom-up 中统一使用新增的数据结构 PoseDataSample 来表示数据样本和模型预测结果(图 7)。通过统一的数据接口定义,使代码更加清晰简洁,降低了模块间不必要的耦合,提高了不同算法间组件的复用性。
图 7 MMPose 1.0 中通过统一的数据接口类 PoseDataSample
在 MMPose 1.0 中,新增了多个轻量化的姿态估计算法:
图 8 MMPose 1.0 新增的轻量化算法性能对比
在后续的开发中,我们会重点推进业界可用的高性能算法的研发。结合 MMDeploy 的模型部署支持,让 MMPose 能够在更多业务场景和产品中发光发热。
可视化是验证模型性能和 debug 的重要手段。在 MMPose 1.0 中,新增的可视化模块 PoseLocalVisualizer 可以方便地展示数据图像、关键点和骨骼、热力图等各种信息(图 9)。
图 9 使用 MMPose 1.0 可视化单个样本
可视化模块的使用非常简单,只要进行简单的初始化,就可以直接对模型输出进行可视化(详细的用法可以参考 MMPose demo:https://github.com/open-mmlab/mmpose/blob/1.x/demo/image_demo.py):
from mmpose.visualization import PoseLocalVisualizer
# 构建 visualizer 并设置 dataset 相关信息
visualizer = PoseLocalVisualizer(name='vis_pose')
visualizer.set_dataset_meta(model.dataset_meta)
# 模型推理
results = inference_topdown(model, img)
# 可视化模型预测结果
visualizer.add_datasample(img, data_sample=results, show=True)
除了直接用于可视化单个样本,我们还提供了 2 个非常实用的可视化工具:
图 10 快速可视化数据集和预处理效果
图 11 在训练中可视化模型效果
我们为 MMPose 1.0 精心准备了用户文档,希望不管是刚接触姿态估计和 MMPose 的同学,还是 MMPose 0.x 版本的老用户,都可以通过我们的文档轻松上手 MMPose 1.0 版本(图 12)。
中文:https://mmpose.readthedocs.io/zh_CN/1.x/
英文:https://mmpose.readthedocs.io/en/1.x/
MMPose 简介和文档大纲:
MMPose 1.0 安装:
MMPose 1.0 上手指南:
图12 MMPose 1.0 文档
目前 MMPose 1.0 正处在公测阶段,在未来的 2 个月内,会有更多新的功能陆续和大家见面:
同时,我们将在未来一段时间内继续维护 MMPose 0.x 分支,具体时间线如图 13 所示。
图 13 MMPose 双分支维护时间线
如文章开头所说,MMPose 的成长离不开社区同学的反馈和帮助。
我们非常欢迎社区同学试用 MMPose 1.0,提出宝贵的意见。点滴的反馈和建议都能帮助 MMPose 变得越来越好用。
更希望能有更多社区同学通过提 PR、issue 和 discussion 参与到 MMPose 1.0 的建设中,我们一起把 MMPose “做大做强,再创辉煌”!