蔡文郁,郑雪晨,郭嘉豪,阮智祥
(杭州电子科技大学电子信息学院,浙江 杭州 310018)
老年人身体平衡能力较差,反应能力较慢,独居老人在家中跌倒没有得到及时救助可能导致严重损伤,甚至死亡[1-2]。目前,跌倒检测方法主要有基于可穿戴传感器的跌倒检测[3]、基于环境传感器的跌倒检测[4]和基于视频传感的跌倒检测[5]。基于可穿戴传感器的跌倒检测主要是将采集到的传感数据输入到特定的跌倒模型进行跌倒检测;基于环境传感器的跌倒检测主要是通过压力传感器或音频采集设备得到的数据来判断跌倒;基于视频传感的跌倒检测主要利用摄像机或者深度相机采集视频数据,用图像识别的方法来判定跌倒。与其它两种方法相比,基于视频传感的跌倒检测无需佩戴设备,不易受环境影响,实际应用更加便捷。文献[6]将提取的人体矩形宽高比、离心率、人体Hu矩特征以及人体轴线角等多特征进行融合,利用支持向量机(Support Vector Machine,SVM)进行检测。文献[7]将提取的人体宽高比、人体投影面积、周长等特征输入SVM进行检测。以上方法大部分将人工提取的时间特征、空间特征送入SVM进行判断,如果提取的特征不合适,将导致关键部分的信息丢失,影响算法精度。文献[8]提出一种基于多通道的卷积神经网络(Convolutional Neural Networks,CNN)跌倒检测模型,通过人体佩戴的多种传感器获取多通道信息,并将每一时刻的信息整合为一个向量,从而识别人体行为。文献[9]将提取的灰度、梯度以及光流信息作为底层特征,输入至3D-CNN网络模型以提取高层时空特征进行分类检测。文献[10]提出一种基于颜色空间和多特征融合的视频烟雾检测算法,其视频数据检测处理方法为基于视频的跌倒检测带来了新的方法。利用深度学习模型来识别人体行为,检测精度较高但模型复杂,算法耗时较长,而利用机器学习模型识别跌倒的算法检测耗时短但识别准确度低。为了解决上述问题,本文提出一种基于SVM-MultiCNN模型的视觉感知跌倒检测算法。首先使用机器学习模型对原始视频数据进行初次分类,对于分类结果为类跌倒的数据进一步利用深度学习模型进行二次分类,从而在保证跌倒检测精度的前提下,降低了算法的计算量,极大缩短了检测耗时。
本文研究的跌倒检测算法原理如图1所示,主要分为数据预处理、特征提取、跌倒检测。首先,采用OpenPose[11]软件从原始视频图像中得到人体关键点数据,构建人体关节位置行为矩阵;然后,从人体关节数据矩阵中提取表征跌倒行为的时间特征参数和空间特征参数,并融合成跌倒特征向量;最后,跌倒特征向量经SVM初级分类器分类成跌倒、类跌倒、非跌倒3种结果,再使用CNN分类器对类跌倒的人体关节数据矩阵进行二次分类,输出最终的判断结果。
本文算法通过OpenPose软件获取人体关节点数据。OpenPose是一种检测图像或视频中人体姿态的检测软件,将视觉几何群网络(Visual Geometry Group Network,VGGNet)[12]与训练网络作为骨架,一个分支预测置信图,另一个分支预测关联向量场,结合Caffe,CUDA,CUDNN等第三方依赖库,精准从图像或视频中回归出人体关节点坐标。OpenPose渲染后的人体骨骼关键点如图2所示。OpenPose获取的人体骨架图包含18个关节点,每个关节点数据内容为(x,y,c),其中x,y分别表示关节点X轴和Y轴坐标,c表示该坐标预测值的置信度,取值范围为(0,1),越接近1表示预测越准确,其关节点坐标的还原度也就越高。
由于存在遮挡效应,OpenPose所获取的人体姿态信息中可能会出现个别关节点信息缺失现象,故本文采用插补的方法来弥补。若缺失关节点的后一个人体关节点不缺失,则将缺失关节点用后一个人体关节点填充;若缺失关节点的后一个人体关节点缺失,且前一个人体关节点不缺失,则将缺失关节点用前一个人体关节点填充;否则,将该帧图像删除。
为了直观地表示关节点数据的时序特征,本文用滑动窗口构建同时表征时间和空间特征的s个行为矩阵,定义如下:
(1)
滑动窗口是一个用来存储时间序列数据的固定大小窗口,随着时间推移,滑动窗口沿着时间轴移动,新进入的数据存入窗口底部,顶部数据被移出。图3为滑动窗口示意图,行为矩阵的总帧数W设置为10,总关节点数N为18,行为矩阵大小为[W,N×3],即滑动窗口的宽度为10,长度为54。设置滑动步长为2,最后构建s个大小为10×54的行为矩阵。
对每一个行为矩阵K的表达如下:
K=[K1K2…KW]T,i=1,2,…,W
(2)
行为矩阵的每一行对应一帧图像的关节坐标向量,即第i行对应第i帧图像的关节向量。
对于每一帧图像,第i帧图像的关节向量表达如下:
Ki=[Ki,0Ki,1…Ki,N-1]
(3)
式中,Ki,N-1表示人体关节数据矩阵中第i帧图像中第N-1个关节点的坐标,j=0,1,…,N-1,Ki,N-1包含(x,y,c)3个数据。
图3 滑动窗口示意图
本文算法同时提取空间特征参数和时间特征参数以充分表达跌倒行为。
由于跌倒时人体高度变化值最明显,因此用视频中人体高度的最大值与最小值表征空间特征,定义如下:
hi=hi,head-hi,foot
(4)
(5)
(6)
式中,hi,head表示第i帧图像中的人体的头部纵坐标,hi,foot表示第i帧图像中的人体的脚部纵坐标,yi,14,yi,15,yi,16,yi,17分别表示第i帧图像中关节点右眼-14、左眼-15、右耳-16、左耳-17的纵坐标,yi,10,yi,13分别表示第i帧图像中右脚踝-10、左脚踝-13的纵坐标。本文算法提取各行为矩阵对应图像中人体高度信息的最大值、最小值并作为空间最大值hi,max、空间最小值hi,min(i=1,2,…,W)。
空间特征仅能区分正常走路和跌倒,无法辨别跌倒和躺下、蹲下等类跌倒行为,本文定义图像第i帧的相邻帧高度差Δhi,one和五帧高度差Δhi,five来表达时间特征,公式如下:
Δhi,one=hi-hi-1
(7)
Δhi,five=hi-hi-5
(8)
将各行为矩阵对应的图像中相邻帧高度差Δhi,one和五帧高度差的最大值和最小值定义为短时间最大值Δhi,one,max、短时间最小值Δhi,one,min、长时间最大值Δhi,five,max、长时间最小值Δhi,five,min,并将当前帧对应人体高度信息的最大值hi,max、最小值hi,min(i=1,2,…,W)融合成跌倒特征向量Fi,SVM(i=1,2,…,s)作为SVM分类器的输入,如下所示:
Fi,SVM=(hi,max,hi,min,hi,one,max,hi,one,min,hi,five,max,hi,five,min)
(9)
根据式(9)对各跌倒特征向量Fi,SVM内的每一个元素Ht(t=1,2,…,6)进行归一化处理,进而消除视频中由于体态、距离等个体差异造成的识别误差。
(10)
本文提出的SVM-CNN跌倒检测模型首先将归一化后的行为矩阵输入至SVM,进行跌倒的初次分类得到s个跌倒置信度Pi,SVM的决策层设置2个阈值Pmax和Pmin,对于输出置信度,若所有跌倒置信度Pi均小于Pmin,则判定视频中的行人未跌倒,输出结果yi_为-1,跌倒检测结束;若存在至少一个跌倒置信度Pi大于Pmax,则判定视频中的行人跌倒,输出结果yi_为1,跌倒检测结束;否则,判定为出现类跌倒。对于类跌倒行为,将跌倒特征向量输入至CNN分类器进行二次分类,从而实现细粒度分类。这种方法不仅降低了算法的复杂度,减少耗时,又保证了检测的准确度。
CNN二次分类网络输入源是行为矩阵K,多个级联卷积网络组成,每一层卷积网络的输出作为下一神经网络的输入,卷积核的大小固定,卷积步长设置为1,检测模型末端设置三个全连接层,其神经元数分别设置为1 024,512和2。激活函数为Relu,因为在训练过程中,使用Relu函数代替tanh函数作为激活函数,模型的收敛速度要快[13]。损失函数采用交叉熵函数:
(11)
式中,yi表示期望输出,即原始数据集被标记的结果,yi_表示实际输出,即CNN二次分类网络的输出结果,交叉熵函数体现了实际值与预测值的相近程度,相较于均方差作为损失函数,交叉熵函数利于梯度下降反向传播优化。
尽管本文提出的SVM-CNN跌倒检测模型可以表达跌倒的时间、空间信息,但是由于行为矩阵是由18个关节点顺次拼接而成,仅使用同种大小的卷积核只能表示相邻关节点之间的特征信息。实际上,表征跌倒行为的关节点组合需要综合考虑头、脚、腿等多个关节的相对变化,但使用大尺度卷积核会大大增加计算量。
为了表示不同关节点之间的特征信息,本文提出改进的跌倒检测模型SVM-MultiCNN,即首先利用SVM进行初次分类,对于分类结果为类跌倒的数据进一步利用MultiCNN二次分类,模型算法原理如图4所示。理论上卷积核尺度的涵盖范围是1×1到W×W(W表示滑动窗口高度),但1×1卷积核无法得到不同关节点之间的特征,由于输入数据是[W,N×3]的行为矩阵(N表示18个关节点数据维数),因此本文提出的MultiCNN网络采用四等分的方式设计4种大小不同的卷积核,分别为3×3,5×5,7×7,9×9,每种卷积核的数目一样,再将不同大小的卷积核得到的特征图分别输入至大小为8×1,6×1,4×1,2×1的池化算子进行池化,池化的步长为1,池化后的全连接层和逻辑层SVM-CNN跌倒检测模型一致,最后输出检测结果。
本文对SVM-CNN与SVM-MultiCNN跌倒检测模型进行有监督训练。将预处理后的数据分为训练集和测试集,训练集打乱后分批次输入2种检测模型;训练采用的损失函数为交叉熵函数,利用Adam算法优化损失函数,通过训练找到最优神经元权重;训练后保存相应模型再利用测试集进行测试,获取最终跌倒检测准确度。
图4 基于SVM-MultiCNN模型的跌倒检测算法
表1 实验环境配置
本文算法验证的GPU加速实验环境如表1所示。
测试视频数据集使用工业RGB相机进行采集,共100个跌倒视频,每个视频分辨率为640×480,帧率为30 fp/s,每个时长约2 min。除此之外,还采集了非跌倒视频如躺下、蹲下、坐下、正常走路、跳跃各10个,每种跌倒视频均由实验人员以横向跌倒、侧向跌倒、向前跌倒、向后跌倒完成,全部样本共包含101 400帧,随机选择70%作为训练集,20%作为测试集,10%作为验证集。表2 展示了实验采集的原始跌倒视频经过OpenPose渲染后的视频序列。
表2 OpenPose渲染后的跌倒视频序列
为了获取SVM,CNN,MultiCNN模型的最优参数,在相同的实验环境、相同数据集的情况下,分别做如下对比实验。
实验1提取跌倒特征向量为Fi,SVM分别对应时间特征参数1(hi,max),2(hi,min)及空间特征参数3(hi,one,max),4(hi,one,min),5(hi,five,max),6(hi,five,min),分别选取不同的特征组合作为SVM的输入进行实验,对比结果如图5所示。
由图5可知,SVM的输入特征选择1,2,3,5时为最佳,这是由于仅有时间特征或空间特征不能完全表征跌倒行为,特征值3,4仅表征人体下降的速度变化,特征值5,6仅表征人体跌倒时的高度变化,但无法区分快速蹲下和跌倒,因此,仅选取相邻两帧或者相邻五帧的高度差作为特征值难以区分跌倒行为和类跌倒行为。本文实验中将混合特征1,2,3,5输入至SVM模型。
实验2分别设置CNN的层数为2层和3层,每层卷积核数分别为16,32,64,128,卷积核大小分别为3×3,5×5,7×7,对比实验结果如图6所示。由图6可知:当卷积层数较多时,不但没有提升模型的识别精度,反而增加了模型的复杂度。原因在于本实验构建的行为特征矩阵维度只有10×54,卷积层数及卷积核数不需要太大即可精确检测跌倒,因此CNN模型选择2层卷积,2层卷积核数分别为32,64时,模型的识别精度高且复杂度较低。
图5 不同特征组合对SVM准确度的影响
图6 不同卷积对CNN准确度的影响
实验3设置MultiCNN模型的4种不同卷积核的数目为4,8,16,32,对比实验结果如图7所示。由图7可知:当MultiCNN模型选择卷积核数目为16,即总卷积核数为16×4=64时最佳。这是由于卷积核数过小不能充分表达不同关节点之间的特征信息,过大则导致提取的部分特征信息冗余,同时模型复杂度大大提升。
实验4通过设置不同的阈值区间来验证初次SVM分类中阈值对算法的影响,实验结果如图8所示。当阈值区间上限Pmax越大时,模型检测准确度并没有明显提升,反而增加了单帧检测耗时,影响检测速度;当Pmax越小时,准确度明显下降,同时单帧检测耗时也明显降低。虽然SVM-CNN与SVM-MultiCNN模型的准确度相差无几,但是SVM-MultiCNN模型的检测耗时明显低于SVM-CNN模型。
图7 不同卷积核数对MultiCNN准确度的影响
图8 不同阈值对检测准确度及单帧耗时的影响
本文实验设置CNN模型的第1层、第2层卷积核数分别为32和64,MultiCNN卷积核数为16×4=64,并设置阈值为Pmax=0.8,Pmin=0.2,分别使用SVM,CNN,MultiCNN,SVM-CNN,SVM-MultiCNN算法进行检测,结果如图9、图10所示。
图9 不同算法的跌倒检测准确度
图10 不同算法的单帧检测耗时
从图9可以看出:基于CNN的检测准确度明显高于SVM的检测准确度,但CNN复杂,检测耗时也明显高于传统机器学习算法。而图10则表明:就单帧检测耗时而言,CNN检测耗时最长,SVM检测耗时最短。本文提出SVM-MultiCNN算法在保证了算法准确度的前提下,大大降低了检测耗时,这是由于CNN算法的高准确度是以牺牲模型复杂度为代价的,本文提出的SVM-MultiCNN算法充分提取不同关节点的跌倒特征。综上所述,本文提出的跌倒检测算法在不降低检测准确度的前提下,大大缩短了检测耗时,因此具有独特的性能提升。
实验5为了对本文提出的跌倒检测算法进行有效评估,在公开跌倒数据集UR Fall Detection Dataset中进行相关测试和验证。UR Fall Detection Dataset数据集提供了由Kinect深度相机和同步加速度传感器分别从正面角度和俯视角度获取的深度图、RGB图以及加速度数据。该数据集包含30个跌倒视频和40个日常活动视频,样本的行为包含:横摔、侧摔、走路、坐下、弯腰等多种行为。
本实验仍然设置CNN模型的第1、第2层卷积核数分别为32和64,MultiCNN卷积核数为64,并设置阈值为Pmax=0.8,Pmin=0.2,对单独SVM检测,单独CNN检测,单独MultiCNN检测以及本文提出的SVM-MultiCNN算法进行比较,实验结果如图11、图12所示,再次验证了本文所提算法的有效性。
图11 UR数据集跌倒检测准确度
图12 UR数据集单帧检测耗时
本文提出了一种基于SVM-MultiCNN模型的视觉感知跌倒检测算法,通过构建人体关节点行为矩阵来表征跌倒行为并输入至SVM进行初分类,对于难以判决的类跌倒行为进一步用CNN和MultiCNN实现二次分类,既利用了SVM模型的时间效率,又利用了CNN模型的高精度性,在保证检测准确度的前提下降低了算法的复杂度。后续工作中,将继续探究在采用跌倒检测模型之前先提取人体区域,减少背景带来的冗余信息,从而降低检测耗时。