1. 项目背景简介
人们在行走和奔跑等情况下,经常会发生摔倒的情况。对于正常人而言,在摔倒不是特别严重的情况下,人们可以立刻起来或者打电话报警或者通知家人, 然而对于一些特殊的人群,例如空巢老人等,在摔倒时可能无法站立起来,也无法及时电话报警或者通知家人协助帮忙。有证据表明,跌倒是全球意外伤害死亡的第二大原因,全球每年估计有684000人死于跌倒,并且60岁以上的老年人跌倒致命次数最多(Falls)。
近期我的姥姥因地面湿滑摔跤造成了肋骨骨折,差点造成了脊柱的损伤。幸亏发现的及时并没有造成更加严重的后果。通过这件事让我意识到,如果家里可以有一台自主检测跌倒的的设备,即使在家里没人的情况下也能及时报警,从而避免因发现不及时造成更加严重的伤害。
人体姿态估计可以帮助检测并识别人的行为动作,其目标是在RGB图像或视频中描绘出人体的形状,这是一种多方面任务,其中包含了目标检测、姿态估计、分割等。跌倒也属于人的一种行为动作,因此人体姿态估计技术可以应用于跌倒检测。
2. Openpose简介
可以完成人体姿态估计的方法有很多,本项目使用卡耐基梅隆大学团队开发的开源项目OpenPose,它通过检测人体骨骼关键点来识别人的动作。OpenPose是基于卷积神经网络和监督学习并以caffe为框架写成的开源库,可以实现人的面部表情、躯干和四肢甚至手指的跟踪,不仅适用于单人也适用于多人,同时具有较好的鲁棒性。可以称是世界上第一个基于深度学习的实时多人二维姿态估计,是人机交互上的一个里程碑,为机器理解人提供了一个高质量的信息维度。
检测人体骨骼关键点是姿态估计中极为重要的一步。人体骨架是以图形形式对一个人的方位所进行的描述。本质上,骨架是一组 坐标点,可以连接起来以描述该人的位姿。骨架中的每一个坐标点称为一个“部分(part)”(或关节、关键点)。两个部分之间的有效连接称为一个“对(pair)“(或 肢体)。需要注意,不是所有的部分之间的两两连接都能组成有效肢体。人体骨架模型将人体一些显著的特征或者是一些可以活动的关节定做关键 点,运用人体关键点检测技术,可以实时的定位、跟踪人体。使用最小势能法等 一些判别方法,将人体关键点连接起来,形成人体骨架模型,利用模型加上一些决策条件就能够识别跌倒。
3. 环境搭建
项目链接:https://github.com/LZQthePlane/Online-Realtime-Action-Recognition-based-on-OpenPose
项目环境要求:
python >= 3.5
Opencv >= 3.4.1
sklearn
tensorflow & keras
numpy & scipy
经测试,实际使用环境:
Python==3.6.5
Opencv==3.4.2
Sklearn==0.19.2
Tensorflow==2.1.0
Keras==2.3.1
Scipy==1.5.3
这些包直接可以通过 Anaconda 安装(https://www.anaconda.com/),Anaconda 是 Python 的一个发行版本,其优势是可以十分方便的管理Python环境以及Python的各种包。
配置环境:
使用 Anaconda 创建一跟新的 Python 环境
打开anaconda的命令行Anaconda Prompt。可以直接在windows搜索,或者在安装好的anacond包内找,如图:
根据实际项目使用需求再创建一个新的 Python 环境
经过一段时间的检索后,需要输入y(yes),开始下载并自动安装
启动新安装的Python环境,在命令行输入conda activate detect_falldown即可激活环境,激活成功则前面小括号会显示新环境的名字
下面开始安装OpenCV、sklearn、tensorflow、keras、scipy包
在Anaconda中,安装某一包的方法是在命令行输入指令conda install XXX,这里XXX是包的名字,如果需要安装包的某一个指定版本,那么就需要在输入conda install XXX==x.x.x例如conda install opencv==3.4.2就会对应安装opencv的3.4.2版本
对于某一完整的项目,都需要依赖很多第三方库,有时候逐一安装效率不高,这时可以使用requirements.txt文件一键安装所有的第三方库。本项目下载的文件夹内没有requirements.txt,可以手动创建:
在项目文件夹下新建一个txt文件,重命名为requirements.txt,输入以下文字后保存(蓝色)
opencv==3.4.2
scikit-learn==0.19.2
tensorflow==2.1.0
keras==2.3.1
scipy==1.5.3
需要注意,在conda中sklearn叫scikit-learn,直接下载sklearn会报找不到包的错误。
在命令行中进入本项目的文件夹下,在我的电脑中位置是:G:\AI\pycharm\pycharm program\Online-Realtime-Action-Recognition-based-on-OpenPose-master\detect_falldown,则需要先输入G:按下回车,再输入cd G:\AI\pycharm\pycharm program\Online-Realtime-Action-Recognition-based-on-OpenPose-master\detect_falldown,如图
再输入conda install --yes --file requirements.txt,直接安装所有需依赖包。
配置完环境,还不能直接运行代码。在项目的文件夹中为我们提供了两种神经网络模型以及两种动作识别模型,我们需要根据实际需求选择合适的模型。两种神经网络模型一种是体积较大但识别精度较高的VGG,这个模型需要去网站下载;另一种是体积较小但识别精度低的mobilenet,这里使用VGG。动作识别模型是两个训练完的神经网络参数文件:framewise_recognition.h5和framewise_recognition_under_scene.h5。framewise_recognition.h5可以识别的动作有:蹲、站立、走、挥手;framewise_recognition_under_scene.h5可以识别的动作有:站立、走、工作以及跌倒,这里使用framewise_recognition_under_scene.h5作为动作识别模型。
由于配置环境时使用的tensorflow版本为2.1.0,其与1.x版本在代码上不兼容,因此需要适当更改代码。
在tensorflow的2.x版本中没有属性gfile,而是将gfile封装进io,因此需要更改generate_dets.py文件中第71行,将“with tf.gfile.GFile(checkpoint_filename, "rb") as f:”更改为“with tf.io.gfile.GFile(checkpoint_filename, "rb") as f:”。同时tensorflow1.x版本中的GraphDef()、get_default_graph()、Session()函数与2.x版本不在兼容,需要改成compat.v1.GraphDef()、compat.v1.get_default_graph()、compat.v1.Session()。同理,在pose_visualizer.py文件中也需要更改上述的几项。
4. 跌倒决策的条件类比
本项目跌倒检测使用的是DNN(Deep Neural Networks),通过逐帧识别人体关键点判断被测对象是否跌倒,人体关键点的检测主要基于OpenPose。
使用keras构建一个神经网络模型,如下:
其中,第一层有128个神经元,第二层有64个神经元、第三层有16个神经元、输出层有4个神经元。前三层使用“relu”作为激活函数,且每两层之间使用批标准化(BatchNormalization)统一数据规格。输出层4个神经元对应序号0~3分别表示:站立、行走、工作、跌倒,激活函数使用softmax。Softmax的作用是将输出层的输出转化为概率,取计算概率最大的神经元作为输出的结果。将OpenPose检测出的人体关键点的坐标值作为输入,人体骨架形成的相对应的动作作为标签进行训练(项目文件中已提供训练好的神经网络参数,也可以自己制作数据集训练)便可以得到人体关键点与动作的对应关系。
除了使用DNN,还可以人工制定判断跌倒的规则,如下。
1) 决策条件一:髋关节中心处的下降速度
在突然掉落的过程中,人体的重心将在垂直方向上改变。人体髋关节的中心 点可以代表人体的重心并反映此特征。通过处理从OpenPose获得的关节点数据, 可以获得图像每一帧的髋关节中心点的纵向坐标。因为这是从站立姿势到跌倒姿 势的过程非常短,并且使用的时间也很短,所以每隔五个相邻的帧就会检测一次, 间隔为0.25 s。
决策计算公式:
2) 决策条件二: 人的中心线与地面的夹角
在跌倒的过程中,人体最明显的特征是身体倾斜,而倾斜度会不断增加。为 了反映人体在跌倒过程中连续倾斜的特征,关节点S10和S13 的中点是 s , s 和s0 的 连线是中心线,θ 是人的中心线与地面之间的角度,当角度小于45°是判断为跌倒。
决策计算公式:
3) 决策条件三:人体外部矩形的宽高比
当检测到跌倒时,最直观的功能是改变身体轮廓。如果我们简单地比较移动
目标的长度和高度,则移动目标的长度和高度都会因距相机或相机附近的距离而
变化,而它们的比例将不存在。T为跌倒的阈值,宽高比为P。P
走时;P≥T,判断为跌倒,一般可以设T=1。
决策计算公式:
5. 成果展示
基于Openpose和DNN,模型能够检测并识别人体动作。本项目可以实现在线实时检测(webcam)与离线检测(video)两种检测模式,两种模式的切换通过修改main.py文件中第12行代码args = parser.parse_args()实现。默认为实时检测,这里测试离线检测。在括号中添加视频,并增加参数“—videos”如图,视频为本人使用相机录制。
检测效果如图所示。
侧面跌倒:
正面跌倒:
由上图可以看出,模型检测了侧面以及正面跌倒,检测效果较为良好。同时,为了便于观察检测效果,使用OpenCV在视频窗口中添加了检测过程的实时帧数、运行总时间以及运行总帧数。
查阅相关资料可知,相较于其他人体检测模型,如Mediapipe,OpenPose模型体量大,检测速率较慢,但Openpose的优势在于多人检测,其检测精度远高于Mediapipe。
参考文献 :
https://www.h3399.cn/201905/690465.html
http://www.xjishu.com/zhuanli/55/202010148742.html
https://www.doc88.com/p-73573073942474.html?r=1