【使用攻略】【人体关键点识别】
1.方案介绍
百度推出了人体关键点识别,检测图像中的人体并返回人体矩形框位置,精准定位21个核心关键点,包含头顶、五官、颈部、四肢主要关节部位,支持多人检测、大动作等复杂场景。支持多人体检测,检测图像中的所有人体,标记出每个人体的坐标位置;不限人体数量,适应人体轻度遮挡、截断的情况。
人体关键点识别的功能特点可以应用到体育健身,根据人体关键点信息,分析人体姿态、运动轨迹、动作角度等,辅助运动员进行体育训练,分析健身锻炼效果,提升教学效率。在这些应用中对人体姿态的判定是一个关键,通过姿态判定进而判断运动员或者体育爱好者的动作是否符合要求,对于体操,瑜伽等对姿态要求比较高的体育活动;甚至是体感游戏都有很好的帮助。
2.方案思路及实现
本攻略通过人体关键点,计算出人的 左右手臂,左右肩部,左右腿部以及左右髋部8个夹角,进而与要求标准夹角及允许的误差范围进行对比。从而实现人体姿态的判定及打分。我开发的功能在提供姿态打分的同时,提供原图基础上的渲染图及动作分析图,方便运动员进行分析。主要内容包括以下方面:
2.1平台接入
具体接入方式比较简单,可以参考我的另一个帖子,这里就不重复了:
http://ai.baidu.com/forum/topic/show/943327
2.2 百度人体关键点功能调用:
请参照我的另外一篇文章:第四期【百度大脑新品体验】人体关键点识别
https://ai.baidu.com/forum/topic/show/954123
2.3 其他方面:
夹角计算:通过余弦计算。
关键点过滤:对于不同置信度的关键点以不同的颜色显示在渲染图及分析图上,0.9分以上的用绿色,0.5-0.9用黄色,0.5以下用红色。方便用户识别。
渲染图:在原图上进行渲染,显示关键点和主要连线,包括身体,四肢,头部,脸部增加一条中轴线从头顶到鼻子到颈部。
分析图:在新的图片上显示关键点和主要连线,包括身体,四肢,头部,脸部增加一条中轴线从头顶到鼻子到颈部,方便用户查看人脸方向。同时显示每个位置的夹角及是否满足要求,如果符合显示绿色,如果不符显示红色。方便运动员进行分析。
判定分数:100*通过的夹角数量/总识别出来的夹角数量
3 实现效果及测试:
案例1:一个经典的体操鞍马动作:
要求四肢平直,右腿与身体平直,左腿75度左右。以下为具体的角度要求:
required_pose1={
'shoulder_left_angle':[15,10],
'shoulder_right_angle':[60,10],
'hip_left_angle':[180,10],
'hip_right_angle':[75,10],
'arm_left_angle':[180,10],
'arm_right_angle':[180,10],
'leg_left_angle':[180,10],
'leg_right_angle':[180,10]
}
上面的每组数值第一个为要求的角度,第二个为允许误差空间。
下面为渲染图,分析图和报告:
处理时长:0.71秒
person_num: 1
左肩:13.0,符合
右肩:57.5,符合
左髋:175.6,符合
右髋:71.6,符合
左臂:171.2,符合
右臂:173.1,符合
左腿:171.9,符合
右腿:178.8,符合
动作评分:100.0
案例2:多人双手张开动作:
动作模板,双手张开:
required_pose2={
'shoulder_left_angle':[90,10],
'shoulder_right_angle':[90,10],
'hip_left_angle':[170,10],
'hip_right_angle':[170,10],
'arm_left_angle':[180,10],
'arm_right_angle':[180,10],
'leg_left_angle':[180,10],
'leg_right_angle':[180,10]
}
渲染图:
分析图:
报告:
处理时长:4.00秒
person_num: 2
左肩:93.6,符合
右肩:99.5,符合
左髋:165.8,符合
右髋:171.7,符合
左臂:171.9,符合
右臂:180.0,符合
左腿:174.5,符合
右腿:175.2,符合
动作评分:100.0
左肩:116.6,不符
右肩:108.4,不符
左髋:156.8,不符
右髋:164.7,符合
左臂:175.2,符合
右臂:180.0,符合
左腿:nan,不符
右腿:175.2,符合
动作评分:50.0
案例3,瑜伽动作:
动作模板:
required_pose3={
'shoulder_left_angle':[180,10],
'shoulder_right_angle':[80,10],
'hip_left_angle':[110,10],
'hip_right_angle':[80,10],
'arm_left_angle':[45,10],
'arm_right_angle':[45,10],
'leg_left_angle':[30,10],
'leg_right_angle':[55,10]
}
渲染图:
分析图:
报告:
处理时长:0.82秒
person_num: 1
左肩:172.1,符合
右肩:79.0,符合
左髋:108.1,符合
右髋:81.9,符合
左臂:37.4,符合
右臂:36.9,符合
左腿:9.0,不符
右腿:48.2,符合
动作评分:87.5
4 关键代码
import numpy as np
#求角度
def GetCrossAngle(l1p1,l1p2,l2p1,l2p2):
arr_0 = np.array([(l1p2['x'] - l1p1['x']), (l1p2['y'] - l1p1['y'])])
arr_1 = np.array([(l2p2['x'] - l2p1['x']), (l2p2['y'] - l2p1['y'])])
cos_value = (float(arr_0.dot(arr_1)) / (np.sqrt(arr_0.dot(arr_0)) * np.sqrt(arr_1.dot(arr_1))))
result = 180-(np.arccos(cos_value) * (180/np.pi))
result = round(result,1)
return result
#判断角度是否符合要求
def angle_if(d,beginkey,middlekey,endkey,draw,color,setFont,text='',required=None):
total=0
score=0
if ((beginkey in d)&(endkey in d)&(middlekey in d)):
total=1
angle=GetCrossAngle(d[beginkey],d[middlekey],d[middlekey],d[endkey])
result=text+str(angle)
if required:
#print(str(required[0]))
if abs(angle-required[0])
5,测试结果及与竞品的对比
整体测试下来发现,百度人体关键点识别对人体关键点有较强的识别能力,在此基础上构建的人体姿态判定打分功能的效果很好,速度也很快。可以广泛的应用于体育健身及娱乐互动等方面。
现在国内做人体关键点产品的除了百度还有商汤和Face++,在这里也做一个简单的对比。
FACE++
Face++对应的功能名称是:人体骨骼关键点检测 API。效果为传入图片进行人体检测和骨骼关键点检测,定位并返回人体14个关键点(头、颈、肩、肘、手、臀、膝、脚)等部位。支持对图片中的所有人体进行骨骼检测
具体点位如下图所示:
分析效果如图:
商汤科技:
支持14 点人体关键点定位,通过 RGB 图像输入超实时给出人体头、肩、腰、腿等位置。分析效果如图所示:
通过对比可以发现,功能方面,Face++和商汤科技都是检测14个点,百度是21个点。百度多的点主要是在面部,这对于判定人脸的朝向和面部表情有很大帮助(大家可以对比一下渲染图,百度可以渲染出脸部朝向,其他的两个不行)这一点对于一些应用场景是很有用的。性价比方面,百度现在有50000次/天免费调用量,这对于测试和小型应用都足够了。对于商业应用的的价格也很低,所以百度性价比的优势也很大。
6,优化建议
就像手部有关键点识别和手势识别一样,建议百度直接建立一个人体姿态识别的新功能,直接返回人体的姿态识别的结果。可以在夹角的基础上增加更多的内容。对于有这方面需要的用户,用的也更方便。