设计一款简单的应用程序,利用树莓派人工智能摄像头和姿态估测技术,能够根据人体的微小动作来检测何时有人打瞌睡
扫描二维码
随时随地手机看文章
随着Raspberry Pi AI 摄像头的发布,我觉得可以尝试一下它并开发一个应用程序!我上学的时候常常会打瞌睡,但作为一名教师,看到学生打瞌睡可不是一件愉快的事……有时我也会在拥挤的餐厅里注意到有人打瞌睡。在这种情况下,如果能知道有人在打瞌睡的话,应对起来会更容易些!总之,我想创建一个打瞌睡检测应用程序来帮助自己保持清醒……!
无需具备高级编程或人工智能方面的知识,但请明白的是,我们将在一定程度上使用 Git 和 Python。
1. 设置 Raspberry Pi 人工智能摄像头
首先,让我们安装树莓派人工智能摄像头。
按照此 Raspberry Pi 拼装指南来安装 Raspberry Pi 人工智能摄像头,以确保所有设置都已完成。
2. 利用树莓派人工智能摄像头进行骨骼检测的实现方法
接下来,让我们运行这个样本,看看能否用树莓派人工智能摄像头来估算骨骼结构!
从零开始实现骨骼估计和显示需要耗费大量的精力和时间。然而,最近我们公司推出了一个叫做“应用模块库”的东西,它能让你轻松创建样本。鉴于这是一个绝佳的机会,我将使用它!
首先,让我们安装 Modlib 仓库。
接下来,按照 UV 文档中提供的安装说明来安装 uv 并进行设置。通过运行以下命令来验证您的 uv 安装是否成功:
然后确保你的树莓派运行的是最新版本的软件:
接下来,我们可以运行 modlib 的 posenet 示例,以此来测试我们的系统并查看关键点的检测结果。
最后,请执行以下命令。最后,请执行以下命令。
太棒了!这个操作很简单,但你可以看到骨骼识别技术运行得非常正常!即便头部低垂并且戴着口罩,它似乎也能很好地识别!现在我们肯定能够检测出正在打瞌睡的人了!
3. 创建应用程序
我们将对第二章中提到的部分样本进行修改,从而真正开发出打瞌睡检测应用程序!这一次,我们将依据骨骼估计过程中关键点的坐标几乎没有变化这一情况来判断某人是否正在打瞌睡。
有多种方法可以判断眼睛是否闭合;您可以根据自己的喜好选择合适的方法来操作!接下来我们就按照以下步骤进行实施。
3.1. 保存骨骼估计数据
首先,创建一个新的 Python 脚本“SleepDetection.py”。然后,为了启动该脚本的逻辑,我们将保存骨骼估计数据。我们将把数据添加到一个名为“poses_record”的列表中。为了比较前一帧和当前帧之间的差异,该列表的长度限制为 2,但您可以根据需要进行更改。我添加了之前程序中用“+”标记的部分。
3.2. 计算估计关键点坐标的距离
接下来,我们将计算前一帧和当前帧中估计关键点坐标之间的距离。为此,我们将编写一个名为“track_motionless()”的新函数。
从之前的数据(即 poses_record[0])和当前的数据(即 poses_record[1])中获取 x、y 坐标,并计算距离。理论上可以获取 17 种关键点!这次我们并没有明确指定使用哪些关键点,但或许设定一些限制会是个好主意,比如只在识别出左眼和右眼时才进行处理。
3.3. 判断距离是否超过阈值
接下来,我们将判断距离是否超过了阈值。我们将使用一个名为“motionless_count”的变量来统计关键点坐标几乎没有变化的帧数。
如果有人正在打瞌睡,且坐标值与之前相比变化不大,我们将增加“静止计数”。我们设定了一个名为“DISTANCE_THRESHOLD”的阈值,用于判断坐标值是否未发生变化,但您可以根据需要进行修改。然而,如果仅检测到一个关键点,数据的可靠性就不是很高,因此只有当多个关键点都低于该阈值时,静止计数才会增加。这也涵盖了没有人在画面中的情况。
3.4. 如果静止时间超过阈值,则判定为打瞌睡。
接下来,我们将根据“静止计数”是否超过阈值来判断是否处于打瞌睡状态。不过,这其实并不复杂,只需添加以下内容即可:
3.5. 用户界面显示
最后,让我们明确地显示出有人正在在用户界面上打瞌睡的情况!这一次,我们使用 OpenCV 在图像上显示“睡眠”字样。
您还可以使用其他工具或方法,比如发出声音!在这里,我只提取了与用户界面显示相关的部分。
完整方案
最后,我将给出完整的程序。该程序也已在 GitHub 上公开提供,您大可随意参考它!
您可以使用以下命令来运行它。如果您需要一个 pyproject.toml 文件,我们的 Github 上已经提供了该文件,所以如果您感兴趣的话,请尝试一下吧!
结论
在这篇文章中,我使用了树莓派人工智能摄像头来开发了一个打瞌睡检测应用程序。
虽然仅仅为了监测打瞌睡行为而购买专用设备可能看起来没有必要,但树莓派人工智能摄像头却是一个功能强大的平台,可以被重新用于许多其他计算机视觉项目——因此它不仅仅局限于这一单一用途,是一个非常实用的选择。
本文编译自hackster.io





