欢迎关注我的公众号 [极智视界],获取我的更多经验分享
大家好,我是极智视界,本文来介绍一下 Realtime Multi-Person人体姿态估计之OpenPose。
邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq
OpenPose 主要是采用一个叫做 PAF (Part Affinity Fields,翻译过来是叫 部件亲和场) 来预测人体各部位及其肢体之间的关系,可以更好地检测图片或视频中的人物姿态,如头部、手部和脚部等,并实现多人的实时姿态估计。目的是很明确的,就是更加实时、更加准确地实现多人的人体姿态估计,而采用的方法 PAF 可能就需要好好解释了。看下面的图,
将上面红色手臂放大后,就是上图中的右边部分,可以看到 RAF 的庐山真面目,原文对它的解释是这样的:
a set of 2D vector fields that encode the location and orientation of limbs over the image domain.
首先 RAF 它是一个二维矢量的集合,用来描述人体肢体的两个维度的信息:
- 肢体的位置;==> location;
- 肢体的方向;==> orientation;
这个东西标注的时候就是这么标的,比如下面的也是 RAF,这是 OpenPose 中最重要的概念。
有了 RAF 的概念之后,咱们继续。
人体姿态估计一般会有两种方法,分别是 Top-down 的方法 以及 Bottom-up 的方法。而 OpenPose 是属于 Bottom-up 的方法,也就是先把图中所有肢体关节都检测出来然后进行组装;而 Top-down 的方法不一样,是先用一个目标检测器框人体,然后对目标小图逐个进行单人的姿态估计。这两种方法的优缺点十分明显,Bottom-up 的方法对于肢体关节的再组装难度大,但效率高,耗时增加受人体数量增加的影响没有 Top-down 方法那么明显。Top-down 方法容易受到前面检测器的检测效果的影响,而且对于人越多的场景,效率越低,这种耗时增加是呈线性的,比如对于下面的人群密集的场景,一般 Top-down 就会比 Bottom-up 慢很多。当然 Top-down 也有其优势的地方,虽然 Top-down 的精度易受前面检测器效果的影响,但是一旦前面检测器框的 "准" 了(不一定是真的准,比如 AlphaPose 中就通过降低检测器的置信度阈值来保留更多的检测框,然后主要依靠后续的 P-NMS 筛选的方式来解决这个问题),后面人体姿态估计的精度会提升的很明显,至少它不太会将这个人的关节连接到另外的人上去。
看下面这个架构图,称之为 OpenPose 的多阶段 CNN 架构,
上面的架构分为两个阶段,前面的阶段用来预测 PAFs,后面的阶段预测 maps 的置信度。这里的架构是多阶段多层次的,多阶段的意思不断迭代地进行预测 (包含 3x PAF - 1x CM),下面的图很好地展示了迭代预测的 "循序渐进"。
多层次的意思是 OpenPose 中会将热度图按关节点分为 18 个特征图,这是什么意思呢,来看下面这个图,对于人体关键点的标注,在 COCO 数据集中其实是提供 17 个关键点,而在 OpenPose 中是多出了一个点,为 17 + 1 = 18 个关键点,多出来的关键点是下图中的 1 号关键点 - 脖子,它是 2 号和 5 号肩膀关键点直接求平均得到的。
有了上面关键点标注的概念,在 OpenPose 中,它是会分别按关节用热度图来分开预测的,还是看下面这张图,这个展示的前面那张热度图中只是在预测右臂膀,这样就解释清楚了。
在 OpenPose 中,最难的地方不是定位关键点,而是确定方向、把同属于一个人的关键点连接起来。如下,对于图中的三个人,候选六个关键点。(a) 中红色点和蓝色点就代表关键点,灰色连线是所有的候选连接,而最终咱们的目标是要像 (c) 那样把正确的两两关键点给连接起来,这中间就要经过步骤 (b)。在步骤 (b) 中,采用连线中点 (黄色点) 是否是 body 上的概率来进行筛选,这样其实可以筛选过滤掉一大部分的灰色连接。但问题是经过这样的筛选后,依然还有绿色线和黑色线是保留了下来,我们直观可以分析,黑色线是不对的,但是按目前的信息对于模型来说,还是无法进一步甄别。
这个时候 PAF 就闪亮登场了,PAF 就是用来解决这个限制。就如上图的 (c),再进一步通过连线的方向 (箭头方向,orientation) 来进行匈牙利匹配来进行筛选,然后得到最终正确的连接。具体可能还需要进一步解释一下,来看下面这张图,
蓝色点和橙色点是两个关键点,向量 V 是最完美的那个连接,若 P 点是手臂上的任意一个点,那么 P 和 蓝色点也会形成一个向量,这个向量与最完美的向量 V 之间会存在一定的夹角,也就是这两个向量之间会存在一定的距离。这样,熟悉的剧本不就来了嘛,预测值 "蓝-P向量" 与 真实值 "蓝-橙" 向量,再定个损失函数,定个阈值,咔嚓一训练就完事。通过这样的方式就可以把错误的连线进行过滤,而保留尽可能接近完美的正确连线,就像下面这张图,最终也会通过这种方式将错误的连线删除掉。
下面展示了一些 OpenPose 的多人人体姿态估计的检测效果图,
好了,以上分享了 Realtime Multi-Person人体姿态估计之OpenPose,希望我的分享能对你的学习有一点帮助。
【公众号传送】
畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。一定会对你学习有所帮助,也一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq