用OAK相机做智能跌倒检测仪器

用OAK相机做智能跌倒检测仪器

背景

世界卫生组织报告指出,全球每年有30余万人死于跌倒,其中一半是60岁以上老人。在我国,跌倒已成为65岁以上老人伤害死亡的“头号杀手”。 最近,北京市疾控中心公布的抽样调查结果显示:60至69岁老年人每年跌倒发生率为9.8%,70至79岁为15.7%,80岁以上为22.7%,每增长10岁,跌倒发生率会升高0.5倍左右。设计一种保护人体隐私的情况下监控人体是否摔倒,并且在人体摔倒后第一时间实现报警就变得非常有意义。

我们通过OAK-D人工智能利器,结合Movenet神经网络进行姿态识别,全连接层分类网络实现对摔倒的姿态进行分类,实现摔倒报警。它可以实时采集人体关节姿态数据进行摔倒判断,全部识别在OAK相机中完成,不会将人体影像数据传输出去,保护老人的隐私。

目前的解决方案

OAK-D智能相机可以为跌倒检测提供低成本的解决方案。它们不会对人体健康造成感官上的副作用,也不会像使用可穿戴设备的系统那样影响老年人的日常活动。在典型的跌倒检测方法中,从视觉数据中检测出人的行为,并学习特征来区分跌倒和其他活动。现有的方法大多利用从视频数据中提取的基于物理外观的特征来表示跌倒。然而,基于外观的特征在实际环境中的泛化性较差,因为外观特征的变化较大,不同的摄像机视角不同并且背景杂乱。此外,由于大规模公共跌倒数据集的不可用性,大多数现有的跌倒检测器都是使用模拟环境或使用受限数据集(由于隐私问题不能公开共享)进行训练和评估的。因此,这些方法并没有表现出在未见过的真实世界环境中进行跌倒检测的泛化能力。

在本文中,探索了克服上述挑战的方法,

  1. 提出一种基于人体姿态的跌倒表示法,该表示法与场景中人物的外观特征、背景、光照条件和空间位置无关。实验表明,在基于2D姿态和3D姿态的跌倒表示上训练的神经网络模型能够成功地推广到了未知的现实环境中进行跌倒识别。
  2. 提出了3D姿态估计和跌倒识别的神经网络模型,该模型对部分遮挡具有鲁棒性。实验表明,本文的模型成功地从被遮挡的身体部位恢复了关节信息,并从不完整的输入数据中准确识别了跌倒姿态。
  3. 在公开的跌倒数据集上评估了本文的算法模型,其中证明了仅使用合成数据进行训练时,本文的框架显示了对未知的真实世界数据的跌倒识别的出色泛化能力。

与现有的方法相比,本文的工作不同之处在于:首先,本文的框架学习是基于姿态的跌倒特征,这使得框架能够成功地从纯合成数据中学习到的跌倒识别知识迁移到具有未知背景和不同人类角色的真实世界数据中。本文的框架结合了2D和3D姿态知识,使得框架能够成功地处理2D姿态的模糊性(在单个OAK相机的情况下),而不需要多个摄像机。最后,3D姿态估计和跌倒识别的神经网络模型对姿态数据中的缺失信息具有弹性。这使得框架能够准确地从人的姿势中分辨出跌倒和不跌倒的情况。

OAK-D相机的总体工作流程

实现我们方法的详细步骤:

一、模型训练部分:

1.1 准备好姿势检测模型 MoveNet

使用 Katsuya Hyodo 提供的转换好的模型 MoveNet

1.2 使用 MoveNet 对人体的 RGB 图片数据集进行识别得到人体姿态骨骼数据集

使用 MoveNet 模型输出的 17 个人体关节点画出骨骼图(类似于火柴人) _screenshot_10.08.2021

1.3 将骨骼数据集分为训练集与测试集

1.4 使用我们准备好的骨骼数据集,在pytorch下训练全连接层神经网络

使用 pytorch 构建全连接层:(可参考:https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html ,或者可以使用我们提供的 Jupyter notebook Open In Colab

self.sequential = nn.Sequential(
   nn.Linear(16384,100),# 输入为 128x128 的 灰度图
   nn.ReLU(),
   nn.Linear(100,2),
   nn.Softmax(dim=1)
)

因为我们最终要将全连接层神经网络放在OAK-D相机里的 Myriad X 芯片里运行,所以我们要将pytorch训练好的神经网络模型转换成blob文件。我们的转换步骤是先将 pytorch 模型导出到 onnx模型,再将onnx模型转换成openvino支持的格式,在OpenVino下再生成OAK-D需要的blob模型文件 :

示例

以下是将pytorch模型转化为onnx模型的命令:

model = SomeModel()
# Input to the model
x = torch.randn(1, 3, 128, 128)
​
# Export the model
torch.onnx.export(torch_model,x, "model.onnx", input_names = ['input'],output_names = ['output'])

以下是将ONNX模型转换成OpenVino模型的命令:

onnx -> OpenVino

python3 mo.py --input_model model.onnx --data_type FP16

最后我们再用OpenVino工具,将OpenVino模型编译成OAK-D相机支持的blob文件。

OpenVino -> OAK:

./compile_tool -m [INSERT PATH TO MODEL XML FILE] -ip U8 -d MYRIAD -VPU_NUMBER_OF_SHAVES 4 -VPU_NUMBER_OF_CMX_SLICES 4

模型训练好后,我们要开始部署我们的模型到OAK相机上

二、部署工作

2.1 依据 MoveNet 结果生成骨骼图

点这里进入代码

https://github.com/OAKChina/depthai-examples/blob/7cd9de2b4c8beba78a0ac6b15b5fd6748dc722a4/fall_detection_v2/demo.py#L73

2.2 把骨骼图片传入全连接层

https://github.com/OAKChina/depthai-examples/blob/7cd9de2b4c8beba78a0ac6b15b5fd6748dc722a4/fall_detection_v2/demo.py#L86

2.3 全连接层对骨骼进行判断

https://github.com/OAKChina/depthai-examples/blob/7cd9de2b4c8beba78a0ac6b15b5fd6748dc722a4/fall_detection_v2/demo.py#L89

2.4 输出骨骼状态(fall or normal),并使用宽高比进行辅助判断

https://github.com/OAKChina/depthai-examples/blob/7cd9de2b4c8beba78a0ac6b15b5fd6748dc722a4/fall_detection_v2/demo.py#L92

检验我们的结果

在OAK-D相机中运行代码,效果如下:

OAK-D

OAK-D是一款嵌入式空间 AI 平台,它在OAK-1的基础上,扩展了两个全局快门高速深度相机,IMU芯片。并且相机内置双目深度计算、AI神经网络推理。帮助用户构建具有真正实时3D对象定位和跟跟踪的产品。关键指标:

关键指标:

  • 4T超强算力
  • 1200万像素彩色相机
  • 100万全局快门深度相机
  • USB3.0 Type-C接口
  • 2.5W平均功耗