点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
所有目标检测已成为动作识别研究的重要垫脚石,即训练AI对行走和坐下等一般动作进行分类。为了使AI能够理解接收到的输入,我们需要教它检测特定的图案和形状,并制定自己的规则。
为了构建能够检测跌倒的AI ,我们决定不收集大型数据集和为此目的专门训练模型。相反,我们使用姿势估计作为构建基块。
姿势估计
姿势估计是人体关节(通常称为关键点)在图像和视频帧中的定位。通常,每个人都将由多个关键点组成。将在关键点对之间绘制线条,有效地绘制人的粗略形状。基于输入和检测方法的姿势估计方法有很多种。
为了使每个人都可以轻松访问此模型,我将输入选择为RGB图像并由OpenCV处理。这意味着它与典型的网络摄像头,视频文件甚至HTTP / RTSP流兼容。
预训练模型
我们使用的姿势估计模型是EPFL的VITA实验室的OpenPifPaf。检测方法是自下而上的,这意味着AI首先分析整个图像并找出它看到的所有关键点。然后,它将关键点组合在一起以确定图像中的人物。这与自顶向下方法不同,在自顶向下方法中,AI使用基本人员检测器来识别感兴趣的区域,然后再放大以识别各个关键点。要了解有关OpenPifPaf如何开发的更多信息,请查看其CVPR 2019论文或阅读其源代码。
多流输入
大多数开源模型只能在任何时候处理单个输入。为了将来使它更具通用性和可扩展性,我们使用了Python中的多处理库来使用子进程同时处理多个流。这使我们能够在具有此功能的计算机上充分利用多个处理器。
人员追踪
在有多个人的视频帧中,可能很难找出一个跌倒的人。这是因为算法需要在连续的帧之间关联同一个人。但是,如果他/她不断移动,它如何知道是否在看同一个人呢?
解决方案是实施多人跟踪器。不一定要花哨;只需一个简单的通用对象跟踪器就足够了。如何完成跟踪非常简单明了,可以在以下步骤中进行概述:
1. 计算质心(以脖子为准)。
2. 为每个质心分配唯一的ID。
3. 在下一帧中计算新质心。
4. 计算当前帧和上一帧的质心之间的欧几里得距离,并根据最小距离对其进行关联。
5. 如果找到相关性,请使用旧质心的ID更新新质心。
6. 如果未找到相关性,则给新质心一个唯一的ID(新人进入框架)。
7. 如果此人离开框架达一定数量的框架,请移除质心和ID。
跌倒检测算法
概念化的初始跌倒检测算法相对简单。我首先选择脖子作为稳定的参考点(与摆动的胳膊和腿比较)。接下来,我根据定义整个人的边界框计算了人的感知高度。然后,我以帧间隔计算了脖子点之间的垂直距离。如果垂直距离超过人的感知身高的一半,则该算法将发出跌倒信号。
但是,在观看多部关于摔倒的YouTube视频之后,我意识到摔倒的方式和方向不同。当视场倾斜时,未检测到一些跌倒,因为受害者似乎并没有剧烈运动变化。我的模型也不够精确,当人们弯腰绑鞋带或直接沿着视频帧奔跑时,我的模型总是会产生误报。
我们决定实施更多功能来完善算法:
我们没有分析一维运动(y轴),而是分析了二维运动(x轴和y轴)以包含不同的相机角度。
添加了边界框检查,以查看人的宽度是否大于其身高。这假定该人在地面上而不是直立的。通过使用这种方法,快速移动的人或骑自行车的人可以消除误报。
添加了两点检查功能,仅当可以同时检测到该人的脖子和脚踝点时才注意跌倒。如果由于遮挡而无法完全识别人的身高,这可以防止对人的身高进行不正确的计算
试验结果
在撰写本文时,缺乏大量的跌倒检测数据集。我们选择UR跌倒检测数据集来测试我的模型,因为它包含不同的跌倒场景。在总共30个视频中,该模型正确地识别了25个跌倒,并在主体掉出画面时错过了另外5个跌倒。这给了我们83.33%的精确度和90.91%的F1分数。
这些结果可以被认为是一个良好的开端,但由于样本量较小,因此尚无定论。由于没有其他类似跌倒的动作(例如系鞋带),这也意味着我无法对模型进行压力测试。
该测试是在两台NVIDIA Quadro GV100上执行的,平均速度为6 FPS,仅够进行实时处理。由于众多层的结果,计算量非常大。声称以高于15 FPS的速度运行的模型通常是不准确的,或者由可怕的GPU支持。
应用领域
跌倒检测可用于许多情况下以提供帮助。一个非详尽的清单包括:
1. 喝醉的人
2. 老人
3. 孩子们在操场上
4. 患有心脏病或中风等疾病的人
5. 粗心的人跌倒
对于更严重的情况,对跌倒的迅速反应可能意味着生与死之间的差异。
未来发展
跌倒检测的准确性在很大程度上取决于姿势估计的准确性。典型的姿势估计模型是在具有对象正面视图的清晰图像上训练的。但是,跌倒会导致对象被扭曲为怪异的姿势,并且大多数姿势估计模型都无法在这种情况下准确定义骨骼。此外,这些模型的鲁棒性不足以克服遮挡或图像噪声。
为了达到人类水平的检测精度,当前的姿势估计模型将需要在更多种姿势上进行训练,并包括具有遮挡的低分辨率图像。
当前的硬件限制也阻碍了姿势估计模型在具有高帧频的视频上平稳运行的能力。这些模型将需要一段时间才能在具有基本GPU甚至仅具有CPU的任何笔记本电脑上轻松运行。
除了姿势估计之外,专门针对跌倒进行训练的深度学习模型可能会表现得甚至更好。必须仔细训练模型,以将跌倒与其他类似跌倒的动作区分开。当然,这必须与广泛的数据集相结合,以训练模型。当然,这种模型的范围是有限的,因为它只能标识一个特定的动作,而不能标识各种动作。
另一种可能的方法也将是基于知识的系统,该系统正在开发一种模型,以使其能够学习人类的行为。这可以通过基于规则的系统在其中基于某些规则进行决策来实现,也可以通过基于案例的系统在过去的案例中应用相似性来实现,而过去的案例表明该案例可以对新案例做出明智的判断。
结论
为了解决包括多个动作在内的一般动作识别这一更困难的问题,我们必须首先理解并掌握检测单个动作的复杂性。如果我们能够开发出一个可以轻松识别跌倒的模型,那么我们将能够提取某些模式,从而使该模型能够轻松地检测其他类型的动作。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~