人体特征点概述
一切人体姿态识别的基础便是人体特征点识别,人体特征点是一系列具有代表意义的人体骨架特征点,人体特征点对应着不同的人体部位,例如眼睛、鼻子、手、肩膀、髋关节、膝关节、脚等。
ML Kit可以识别33个人体特征点,下图展示了ML Kit可以识别的人体特征点:
ML kit框架的强大之处在于,你并不需要具备机器学习方向很专业的技能,仅仅靠几行代码就可以获取到人体33个关键特征点。具体代码我们会在后面去详细介绍。ML Kit识别人体特征点的要求人体的脸部必须出现在画面中。只有当人整个身体都出现在画面中时,姿态估计的效果才是最好的。当然当人体并没有完全出现在画面中时,它同样可以识别部分身体特征点。
同样,我们使用Core ML也同样可以识别人体特征点,Core ML可以识别19个人体特征点,相比之下,ML Kit能够识别33个特征点,更为强大,下图展示了Core ML可以识别的人体特征点:
人体特征点识别的方法
- 图像中只有一个人时,特征点识别相对简单,姿态识别器识别出各个身体部位特征点,然后通过在它们之间创建连接创建姿态。
- 图像中有多人是,问题会变得复杂。目前有两种主流方法去识别特征点。一种是“自顶向下”,首先识别出图像中的每一个人,然后再识别出每个人的特征点;另一种是“自底向上”,首先识别出图像中的所有人体特征点,然后再通过算法将这些人体特征点组装成一个个的人体。如下图所示:
姿态识别的应用
当我们获取到人体特征点后,便可以对人体进行姿态识别,人体姿态识别根据特征点坐标维度分为2D姿态识别和3D姿态识别。
2D姿态识别:
3D姿态识别:
人体姿态识别有很多应用场景,来看几个典型的应用:
- 我们在很多大片中看到的人体特效都是人体姿态识别的应用。先来看看下面这张电影剧照:
右边是真实的人类在摄影棚里面拍摄的图片,根据这个图片便可以检测出其中的人体姿态,那么图形、风格、特效增强、设备和艺术造型等就可以被加载在人体上,就形成了左边图中夸张的电影特效画面了。
-
摔倒检测 在养老院或医院,通过实时摄像头,对摄像头中的人体进行摔倒检测,发出警报,大大缩短了老人、病人的救助时间。那么摔倒检测的原理便是提取摄像头实时画面帧,识别出其中的人体特征点,通过一系列坐标计算算法,检测出是否摔倒。
-
体育、舞蹈动作纠正 同样,通过提取摄像头实时画面帧,识别出其中的人体特征点。通过一系列的算法将用户姿态和标准的体育、舞蹈动作进行对比,从而给出纠正意见。
人体姿态估计还有很多应用场景:
ML Kit人体特征点识别关键点
- 跨平台能力,同时支持
Android和iOS平台 - 能够识别人体33个特征点,包括手、脚的位置
- 在给出33个特征点坐标的同时,会给出每个特征点的可信度,可信度的数值范围从
0.0到1.0,1.0代表最高可信度 ML Kit提供两个优化SDK,分别是基础SDK和准确SDK。基础SDK能够以30fps和45fps的帧率处理实时视频流,但是它识别的特征点可信度范围更为广泛。而准确SDK以更低的帧率处理实时视频流,它识别的特征点的准确度更高。Z轴坐标,ML Kit返回的特征点坐标包含Z轴坐标,这使得上述的3D姿态估计成为可能。Z轴坐标的原点是左、右髋关节的中心点。靠近摄像头方向为Z轴负坐标,而远离摄像头方向为正坐标。Z轴坐标值并没有上限值和下限值。
Z轴正负值示意图:
姿态识别API和面部识别API一样,可以识别出它们对应的特征点位置。面部识别API会尝试识别微笑的嘴巴或张开的嘴巴,而姿态估计API并不会这样,它不会给特征点附上任何意义,开发者只有自己通过一些算法处理特征点坐标去解释当前的姿态。
姿态估计API只能识别一个画面中一个人的人体姿态,如果有两个人同时在一个画面中,它只能返回具有更高可信度的人体的特征点。下面我看一下姿态识别API识别的部分特征点的返回值,其中InFrameLikelihood就是该特征点的可信度。
iOS集成ML Kit 姿态估计SDK
如上一小节所述,ML Kit提供了两种人体姿态识别SDK,基础SDK和准确SDK,下图是两者的比较:
我们使用Pod去集成ML Kit SDK
我们在Podfile中添加如下依赖,保存后,运行pod install,然后使用XCODE打开生成的xcworkspace文件,ML Kit需要XCODE 12.5.1以及更高的版本。
# 引入基础SDK
pod 'GoogleMLKit/PoseDetection', '2.5.0'
# 引入准确SDK
pod 'GoogleMLKit/PoseDetectionAccurate', '2.5.0'