基于OpenPose的人体睡姿识别实现与研究
2019-09-05杨明健黎镜林郭锐坤唐小煜
杨明健,黎镜林,郭锐坤,唐小煜
(华南师范大学 物理与电信工程学院,广东 广州 510006)
近年来,随着人工智能的高速发展,机器视觉在全球的生产制造中的地位越来越高,对人的姿态、动作识别和行为理解也逐渐成为计算机视觉领域的研究重点. 人体睡姿和健康有着十分紧密的关系,尤其对于体弱多病的人群,采用合适的睡姿能够有效地预防疾病[1]. 因此,运用机器视觉识别人体睡眠姿态,监护人体健康状况的研究具有重要意义和应用价值[2-3]. 目前人体睡姿识别监护的研究或产品大多要求佩戴相关的贴身检测装置,不仅影响睡眠质量,还存在潜在性的伤害危险,但利用机器视觉完成睡姿识别工作则可以避免以上问题. 利用机器视觉识别睡姿的传统方法主要是水平集分割法[1],该方法在面对特殊睡姿以及睡姿图像背景复杂情况时,识别准确率不尽人意. 本文采用OpenPose关键节点提取算法模型解决睡姿图像存在部分遮挡以及复杂背景的问题,采用基于人体关键点提取的睡姿识别算法来解决复杂睡姿问题.
1 OpenPose介绍
OpenPose是卡内基梅隆大学感知计算实验室打造的可以读懂人类肢体语言的开放库和程序包. 本文采用OpenPose关键节点提取算法来提取睡姿图像的特征,包括存在部分遮挡和复杂睡姿的特征,最终由BP神经网络进行睡姿识别,得到比较好的识别效果.
OpenPose的算法流程见图1:首先将输入的图片[图1(a)]经过10层VGG19网络[4]转化成图像特征,再将得到的图像特征分成2个分支分别送入深层卷积网络,来预测每点的关键点的置信度S[图1(b)]和亲和度向量L[图1(c)],然后通过贪心推理[5]分析每个关键点的置信度S以及亲和度向量L,实现关键点的聚类[图1(d)],最后实现骨架的组装[图1(e)].
图1 OpenPose算法流程
2 基于OpenPose的人体睡姿识别算法
OpenPose算法模型能够将输入的人体睡姿图像输出为人体的骨架图以及人体各个关节点的坐标,进而通过计算识别人体的睡姿.
2.1 OpenPose输出选取
OpenPose提供了18或25个人体关节点,70个面部关节点,21个手部关节点的检测提取定位. 其中18或25个人体关节点的主要区别为25个关节点的检测多了左、右脚部的关节点[6]. 由于睡姿识别中脚部的关节点信息对于睡姿的特征提取区别性[7]不高,因此本文选用18个人体关节点信息作为睡姿识别算法的输入. 此外,由于手部和脸部的关节点信息不是睡姿的重要特征,而手部和脸部关节点检测对于图像的运算速率有较大影响,开启手部和脸部关节点检测会大大降低运算速率,给实时识别人体睡姿的实现带来困难. 综上所述,只选取18个人体关节点信息作为睡姿识别算法的输入能够在保证睡姿识别的准确率的前提下提高运算速率. OpenPose输出的18个人体关节点的骨架图如图2所示.
图2 OpenPose输出骨架图(COCO数据集)
2.2 睡姿识别算法实现
2.2.1 睡姿图像的脸部特征提取
针对4种基本睡姿:仰卧、俯卧、左侧卧、右侧卧的特点,俯卧时人脸向下,仰卧时人脸向上,侧卧时人脸朝侧边,因此人脸的朝向是睡姿识别时征集的重要特征. 对于OpenPose输出的18个关节点,眼睛和耳朵的关节点(见图2中的14~17号关节点)是脸部特征中关键的关节点. 睡姿图像脸部关节点检测效果图如图3所示.
(c)左侧卧 (d)右侧卧图3 4种睡姿下OpenPose关节提取效果
将4种睡姿图像进行OpenPose算法提取关节点后,由实验结果可以看出只有俯卧这一睡姿可能提取不出眼部的关节点. 由此表明眼部关节点数量这一特征可以作为睡姿识别的重要特征.
2.2.2 睡姿图像的体态特征提取
睡姿识别中除了脸部特征——人脸的朝向这一重要特征外,人体的体态特征也同样是举足轻重的. 例如人体在仰卧时胸部朝上,两臂一般位于身体两侧. 下面介绍如何通过关节点信息提取睡姿图像的体态特征.
首先将人体分为左、右2个半身. 对于OpenPose输出的人体骨架图,最简单的划分方法为将骨架图中的鼻子所在关节点(x1,y1)(图2的0号关节点)以及胸(背)部关节点(x2,y2)(图2的1号关节点)两点连成1条直线y=kx+b,这样就可以将睡姿图像一分为二,分出的2个平面大致可以代表人体的左、右2个半身,划分效果如图4(a). 划分完左、右2个半身后再判断两臂是否位于同一半身,判断方法为将最能代表两臂位置的手臂关节点(x3,y3)和(x4,y4)的横坐标x3和x4代入刚才得到的分界线y=kx+b,得到分界线上横坐标x3和x4对应的纵坐标y03和y04;若y3和y4同时大于或小于y03和y04,则说明两臂位于同一半身,其他情况则说明两臂位于身体两侧. 考虑到手腕关节点(图2的4号和7号关节点)存在被遮挡的可能性以及肩膀关节点(图2的2和5号关节点)距离分界线过近容易出现误判,本文采用的两臂关节点为手肘(图2的3号和6号关节点). 最终完成睡姿图像中体态特征的提取.
(a) (b)图4 人体分界线提取效果
该划分人体两侧的方法虽然简单,但当人体处于复杂睡姿时,这种划分方法往往会造成体态特征的错误提取. 例如当人体的躯干处于平躺状态但头部偏向一侧时,用这种方法划分出的人体左右半身分界线并不能很好地代表真实的人体两侧分界线[见图4(b)],从而导致体态特征的错误提取. 针对这种情况,可以对提取出的分界线引入修正因子δ和λ,得到新的分界线:
y=(k+λ)x+b+δ.
修正因子大小可以通过大量实验数据进行BP神经网络算法[8-10]获得. BP神经网络是按误差逆传播算法训练的多层前馈网络,本文采用的BP神经网络包含1层输入层、6层隐含层和1层输出层.
由于容易产生误差的情况主要是脸部和靠近胸部的关节位置导致,因此选取图2中的0,1,2,5,14和15号关节点的横、纵坐标共12个特征向量(p1,p2,…,p12)作为神经网络输入层的12个节点;而输出层则有2个节点,输出矢量(o1,o2)对应修正因子δ和λ. 隐含层的激活函数选择tanh函数[11-12],训练算法选择缩小权值的反向传播算法[13-15],神经网络的学习率设置为0.05,误差精度设置为0.005. 训练结束后输出的目标矢量即对应的修正因子δ和λ.
此外代表两臂位置的手臂关节点坐标获取时,通常选取手臂某一关节点的方法容易造成误差. 因此本文针对左、右手臂的所有关节点坐标分别进行加权平均,同样权值的大小通过BP神经网络算法确定.
2.2.3 特征识别
通过提取脸部特征和体态特征2种睡姿特征,可以实现对2种基本睡姿的识别. 大量睡姿图像实验表明,对于脸部特征,仰卧能提取出2个眼部关节点,俯卧则能提取1个或提取不出关节点,侧卧则为1个或2个. 而对于体态特征,人体在仰卧时胸部朝上,两臂通常位于身体两侧;侧卧时两臂位于身体同一侧;而俯卧时背部朝上,两臂也位于身体同一侧. 由于OpenPose输出的关节点信息无法提取出背部还是胸部向上的体态特征,但能提取两臂相对于身体位置的特征,因此若要区分仰卧和俯卧这2种睡姿,则需要结合脸部的朝向加以区分. 综上所述,结合脸部特征和体态特征这2种睡姿特征就能够对任意一睡姿图像进行分类识别.
3 实验及结果分析
3.1 OpenPose关节识别效果分析
为了验证OpenPose算法模型在身体部分遮挡时的识别效果,做以下3种情况的识别效果实验:无被子遮挡图、仅露出头部和仅露出头部和手臂. 这3种情况下关节点的识别效果如图5所示.
通过对比这3个实验的实验结果不难看出,即使存在大面积的关节遮挡,只露出头部和手臂的情况仍能够提取出除了胸部以下的关节点,而本文的睡姿识别算法并没有用到胸部以下的关节点,即在睡姿识别算法正确的前提下,只露出头部和手臂也能够正确识别出睡姿类型. 但只露出头部的情况下只能提取出脸部的关节点,无法识别出睡姿类别. 该情况是通过图像处理技术来识别人体睡姿的缺陷,其解决办法是通过压力测量[16]等其他技术方法来弥补图像处理技术的不足. 本文的实验结果表明,OpenPose的关节识别效果具有相当优秀的鲁棒性和准确性,完全满足存在被子遮挡情况下的关节识别要求.
(a) (b) (c)图5 OpenPose部分关节遮挡关节提取效果
3.2 特征提取正确性试验
睡姿图像的脸部特征和体态特征的提取正确性是正确识别睡姿的前提. 因此本文做了以下实验来验证特征提取的正确性.
3.2.1 脸部特征提取正确性实验
为便于验证脸部特征提取的正确性,本文定义每种睡姿下的正确识别眼部关节点数为si(i=1,2,3,4),其分别对应仰卧、俯卧、左侧卧以及右侧卧. 由上文的分析结果可知s1=1或2,s2=0或1,s3=1或2,s4=1或2. 将4种睡姿的各100张睡姿图像进行OpenPose算法提取眼部关节点信息,得到眼部关节点数s0i,关节检测效果如图3,再与si进行对比,相等则表示脸部特征提取正确,实验结果如表1所示.
表1 脸部特征提取实验结果
实验结果表明脸部特征提取的正确性高达96.25%,且4种睡姿的正确提取率均达90%以上,为睡姿识别检测提供了十分有利的条件.
3.2.2 体态特征提取正确性实验
体态特征提取中分界线划分的正确性直接决定了最终体态特征提取的正确性. 为此,对体态特征提取中经BP神经网络训练后的模型进行误差分析,训练集为4种基本睡姿图片各50张,训练误差曲线如图6所示.
图6 BP神经网络训练误差图
可以看出,经过160次训练后,神经网络的输出与训练集的标准输出的均方误差趋于平稳,约为0.012 3,基本满足BP神经网络预设的误差要求.
3.3 睡姿识别效果分析
为了验证基于OpenPose的人体睡姿识别算法的识别准确率和运算速率,选取5名志愿者做了200组实验,其最终识别的实验结果如表2所示.
表2 睡姿识别实验结果
实验结果表明本文所采取的睡姿识别算法识别准确率高达92.5 %,运算速率平均为9.8帧/s,完全达到实时睡姿识别检测对准确率和运算速率的要求.
4 结 论
提出了基于OpenPose的人体睡姿识别算法. 该算法适用绝大部分复杂情况,包括复杂背景、被子遮挡、复杂睡姿,并具有较高的识别准确率和运算速率,识别准确率高达92.5%,且运算速率高达9.8帧/s,完全达到实时睡姿监测的要求,以此设计的睡姿监测系统能有效地看护病弱人群,如睡眠呼吸暂停综合症病人的睡眠情况.