×

CaneCam用CV/TinyML帮助盲人过马路

消耗积分:2 | 格式:zip | 大小:0.08 MB | 2022-11-07

尚文清

分享资料个

描述

背景

视力障碍是全球约 2.5 亿人面临的一个问题。对于视障人士来说,计算机视觉为日常问题提供了一个优雅的解决方案——让计算机为他们看清。到目前为止,计算机视觉仅限于大多数固定应用,需要大型处理器和大型电源。嵌入式 CV 系统存在,但它们拥有陡峭的学习曲线和低于标准的功耗。

但是借助 Edge Impulse,黑客现在可以轻松地在嵌入式系统上启动低功耗 ML/CV 模型,从而将 TinyML 推向大众。

该项目旨在利用 Edge Impulse 的技术和一些简单的组件来解决盲人每天遇到的一个问题——过马路。由于无法看到人行横道灯 (PCL),盲人面临步行旅行的问题,这通常是独自旅行时唯一可用的交通工具。传统上,盲人利用声音提示或犬类辅助设备来了解他们何时可以安全通过。但是随着汽车变得更安静(看着你,Elon)和 CV 技术的进步,需要一个更优雅的解决方案。

输入 CaneCam。

CaneCam 仅使用 Raspberry Pi 4、网络摄像头和一些电路,即可检测到行人过路灯何时变绿,并通过小型电机的手柄振动提醒用户。由于其优化的占空比,CaneCam 一次充电可运行 4 小时以上,足以满足城市一日游的需要。

最好的部分是 - 您也可以使用这些简单的部件和 Edge Impulse 制作 CaneCam!这是如何做到的:

第 1 步:组装手杖

 

poYBAGNkhF6AAYkwAALFU3KaaIw686.png
 

制作任何智能手杖的第一步当然是手杖本身。对于这个项目,我知道我想将电子设备完全包含在手杖内,因为没有人喜欢背着背包、腰带或帽子,而这些花哨的电线会妨碍我。所以 - 我选择使用 Arduino 套件中的一个透明小盒子来独立完成所有接线,使 CaneCam 成为你可以拿起就走的东西。(正如它应该。)

 

pYYBAGNkhGGAeJ7RAACLZX10uuU124.png
 

 

首先,使用钻头在手杖轴上方 3/4 处钻两个孔,从前到后穿过直径。然后将这些孔与塑料盒中的两个相同的孔匹配。这些孔用于容纳固定在盒子背面的两个肘节螺栓和垫圈。

 

pYYBAGNkhGWALK4fAAB-G_-obOg609.png
 

 

完成后,您的盒子应固定在手杖上,晃动几乎为零。

注意:孔的大小仅取决于您使用的螺栓和螺母。

第 2 步:构建电子设备

 

pYYBAGNkhGuAK8CYAAAy8OF3Qhw813.png
 

 

CaneCam 的核心是无处不在的 Raspberry Pi 4B,我之所以选择它是因为它具有运行我们的模型所需的处理能力和 RAM。它连接到用于视频输入的 USB 网络摄像头,以及用于控制振动电机的 5V 继电器。继电器用于将电源从单独的 9V 电池路由到电机,因为从 Pi 的移动电源为电机供电会导致 Pi 的操作出现问题(低电压)。接线非常简单,仅使用 2 个 GPIO 引脚、一些跳线、继电器、迷你面包板和电机。如果你选择一个足够大的盒子,你应该可以把所有东西都装进去,包括网络摄像头的 USB 数据线。

 

poYBAGNkhG6ACvyIAADeXF5VEak386.png
Arduino 在实践中被 RPi 取代,橙色线连接到引脚 18。
 

 

要连接 Pi、继电器、电池和电机,请按照所示示意图进行操作。您可以为内部电子设备选择小型跨接电缆,因为它们非常紧密。

注意:连接到电机的跨接电缆会比其他的要长得多,原因请参见下一节。您可能需要将两根电线焊接在一起以获得所需的长度。

连接电子设备后,只需将网络摄像头插入 pi 上的任何 USB 端口,然后连接移动电源为 Pi 供电。你的接线完成了!

 

pYYBAGNkhHOATv7vAAEwC8BwHcA984.png
 

 

第 3 步:安装电子设备

 

poYBAGNkhHWACS4vAAFJ5xMrgUI294.png
 

现在我们有了胆量和外壳,是时候将两者结合起来了。首先放置移动电源,然后将 Pi、电池、继电器和面包板放在顶部 - 确保所有引脚都连接并固定。

您可以以任何您选择的方式分配包装盒中的组件,只需确保为网络摄像头电缆留出足够的空间。

 

poYBAGNkhHiAXBbJAAFmZ0m3Qq8207.png
 

 

然后,拿起您的网络摄像头并将其连接到盒子的前面/顶部。我使用了一些胶带,因为我的网络摄像头的形状很适合它,但根据您的盒子和网络摄像头,您的需求可能会有所不同。重要的部分是网络摄像头安装后移动最小。

 

pYYBAGNkhHyAKTQFAAEW4kCdFiE219.png
 

 

从盒子中取出电机和长电缆(不要撕开它的连接),然后将网络摄像头连接到 Pi,然后将其余的网络摄像头电缆铺设(填充)在盒子内。您可能会发现需要在盒盖上钻一个孔才能将 USB 电缆穿过。

 

poYBAGNkhH-AE9NvAADKssukPyM344.png
 

 

最后,将长跨接电缆沿拐杖的轴向上连接到电机的顶部,电机用一些管道胶带固定在那里。确保将电机齐平放置,以便将振动传递到手杖 - 越靠近手柄越好。大量使用胶带进行电缆管理,您就完成了构建!

 

poYBAGNkhIeAT3qXAAnqm6elSJA388.jpg
 

 

注意:我建议未来的设计进一步采用极简主义,并将电机和电缆隐藏在通常是空心的手杖体内。然而,对于这个概念验证,我选择将电机和电缆留在手杖的外部。

第 4 步:构建模型

收集数据

poYBAGNkhIqADRMuAAB9hThOP04140.png
 

这是 Edge Impulse 出现的部分。但在我们打开工作室之前,让我们谈谈数据。具体来说,您将使用哪些图片来构建模型?过去的研究已经成功地制作了可以检测 PCL 的模型,但是正如您可能认识到的那样,并非所有的都是相同的。世界上到处都是 PCL,但你几乎找不到一座城市的灯光与 30 英里外的城市一样——更不用说不同的国家了。

因此,很难为这些看起来如此不同的灯制作一个通用模型。因此,我为我的概念验证选择了一种更具体的方法:我滑板到我家附近的一个 4 路交叉口,并在那里为 8 个 PCL 拍摄了 100 张照片,它们具有不同的方向、模式和放大倍率。(同时避免人们奇怪我为什么对人行横道灯如此感兴趣)

pYYBAGNkhI6Ae_xaAAIOINhSsPY086.png
数据集中的示例图片,以及交叉路口的渲染
 

当然,这意味着我的模型只能在使用这种特定类型 PCL 的人行横道上工作,并且在我收集数据的确切交叉口处效果最好。但是对于概念证明,这就是我所需要的。

边缘脉冲

Edge Impulse是一个相对较新的平台,允许黑客轻松地在嵌入式设备上部署 ML 模型,无论技能水平如何。这就是为什么它非常适合这个专为新手设计的项目。

我们将使用 Edge Impulse 的工作室创建一个可以检测 PCL 的图像分类模型。通常,只有 100 张图片的数据集不足以训练整个模型进行分类。但是多亏了 Edge Impulse,我们可以利用迁移学习来用少量数据获得一个相当好的模型。

首先,创建你的项目

poYBAGNkhJGAHG7OAADu5GyfB58558.png
 

出现提示后,选择图像->对单个对象进行分类,因为每张图片我们只使用一个对象(人行横道灯)。

pYYBAGNkhJSAFzcHAAGXDFwCfIE375.png
 

创建后,您的项目仪表板将在顶部为您提供一个清单,这就是我们将要关注的内容。首先,我们将收集我们的数据 - 实现此目的的两种主要方式是连接手机和从您的计算机上传图片 - 您可以选择其中任何一种。

注意:我使用的 3 个类是“Go”、“Stop”和“Unknown”。未来的项目可以在这些基础上进行扩展,并包括诸如“倒计时”之类的类以获得更多功能
poYBAGNkhJeASdqWAADOTKEpH0o715.png
 

在这个例子中,我将上传我之前拍摄的照片,这些照片保存在我的电脑上。只需选择所有显示“Go”的灯光图片,并为其分配正确的标签,如图所示。

pYYBAGNkhJqAVZVYAAF3cRuBbgk732.png
 

对“停止”和“未知”类再次执行此操作。一旦您上传了所有图片(尝试至少获得 50 张),我们的其余工作将完全包含在 Edge Impulse Studio 中!

创造冲动

我们的下一个任务是制作真正的神经网络。在 Edge Impulse 中,模型被称为脉冲,制作它们是轻而易举的事。单击脉冲设计菜单。这是我们告诉 Edge Impulse 我们正在尝试制作什么样的模型以及使用什么设置的地方。

poYBAGNkhJyABFIMAAFN7jgPOAo049.png
 

我们将在脉冲设计中使用推荐的图像分类设置——即 96x96 图像和拟合最短轴。我们还想点击添加处理块添加学习块来添加推荐的图像块和迁移学习块。

pYYBAGNkhJ-AJ8vuAAGE4O4_wVA501.png
加块后的冲动
 

最后,点击保存冲动。导航新的图像菜单项,选择 RGB 颜色深度并保存。这告诉我们的模型我们想要使用彩色图像,当“Go”和“Stop”之间的很大一部分差异是光的颜色时,我们当然需要它。(白对红)

pYYBAGNkhKGAAYBaAAE6auPxnNg799.png
 

保存会将您带到“生成功能”页面,您应该在该页面单击,您猜对了,生成功能。

poYBAGNkhKSATyI5AAF96J6b-iM817.png
 

这为我们提供了图像的特征图,我们可以使用它来观察数据中的模式。

poYBAGNkhKiAXXUCAABqh0t3HkI791.png
 

我们还获得了我们设备上速度和内存使用情况的性能估计。

poYBAGNkhKyAAlXoAAEb0HDs0BM266.png
 

接下来,单击迁移学习。这是我们实际创建/训练网络以响应我们的数据的地方(在这种情况下,是人行横道灯图片)。将训练周期数更改为 100,然后选中数据增强框。

poYBAGNkhK-ADh3DAAEc-0sL6v8224.png
 

接下来,单击选择不同的模型并选择MobileNetV2 96x96 0.35模型。

pYYBAGNkhLKALVs9AAHVRnTf6hY296.jpg
 

几乎完成(与模型)!单击模型框上的编辑按钮,将神经元的数量更改为 20。所有这些更改将使模型更适合您的数据,并使 CaneCam 能够更有效地检测您的交叉灯。

pYYBAGNkhLWAbxGRAAC-XlEr3Bs113.png
以下是您的设置在开始训练之前的外观。
 

最后,单击开始训练按钮。训练可能需要一分钟,因为我们增加了 epoch 的数量,所以花点时间喝点水。

评估冲动

pYYBAGNkhLiAXVypAAC_8NP7evo732.png
 

训练后,我的模型返回了 63.6% 的一般准确率。单击“模型测试”菜单项会显示测试数据集,您可以在其中对分离的数据运行模型。单击“全部分类”以测试数据。

poYBAGNkhLqAVDvzAABsxisQh9I093.png
 

该评估显示了 10 个 Stop and Go 样本的(尽管是无私的)准确度为 100%。对于 <100 幅图像来说不算太破旧。

第 4 步:编码

连接到边缘脉冲

poYBAGNkhL2AP5NJAADudpB678c430.png
 

 

我们中间的工程师们玩得很开心,现在是编码人员开始他们的现场日的时候了。毕竟,没有背后代码的电子产品是什么?

pYYBAGNkhMWAfpVaAAfvKK4jQRo457.png
 

 

虽然您可以通过 SSH 连接到您的 Pi 进行许多项目,但在这个项目中,我们希望看到视频反馈 - 所以我们将连接 USB 键盘和鼠标进行控制,以及通过 Pi 的 Mini-HDMI 端口连接的监视器. 这个设置将是我们编码部分的基础,但别担心,它不是最终的。

注意:以下部分遵循Edge Impulse 的 Raspberry Pi 4 指南,如果您想在没有屏幕或 PiCam 的情况下进行设置,您可以在此处找到说明。

启动你的 Pi(我的使用 Raspbian Buster for CaneCam)并打开终端。要使用 Edge Impulse 设置设备,请运行以下命令:

curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -

sudo apt install -y gcc g++ make build-essential nodejs sox gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps

npm config set user root && sudo npm install edge-impulse-linux -g --unsafe-perm

处理好软件后,将 USB 网络摄像头连接到 Pi 并运行

edge-impulse-linux

这将启动一个向导,要求您登录并选择一个 Edge Impulse 项目。如果要切换项目,请使用--clean.

而已!导航回 Edge Impulse 以验证您的 Pi 是否已连接。您的屏幕应如下所示:

poYBAGNkhMeAEtwiAABumhMc_Bg350.png
 

 

要在没有脚本的情况下运行您的冲动,只需调用

edge-impulse-linux-runner

这将自动下载并运行您的模型,打开终端作为分类的文本输出。很酷!

poYBAGNkhMqAbOJLAADNkBpby2s046.png
 

 

下载 Python SDK

但是我们希望模型背后有一些力量,并且不仅仅是一个窗口和终端作为我们的输出。为此,我们需要安装 Edge Impulse 的Linux Python SDK ,我们将使用它来构建一个 Python 脚本,该脚本使用我们构建的脉冲/模型来控制 CaneCam。

为此,请安装最新版本的Python 3 ,或通过发出命令检查您是否已经拥有 >=3.7 的 Python3 版本

python3 --version

我已经安装了 Python 3.7.3,所以我可以继续下一步。问题:

sudo apt-get install libatlas-base-dev libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev

pip3 install edge_impulse_linux -i https://pypi.python.org/simple

然后,通过以下方式下载模型文件:

edge-impulse-linux-runner --download modelfile.eim

模型最终在您的 Pi 上,在与您刚刚下载的 modelfile.eim 相同的目录中创建一个 Python 文件。通过导航到 Pi 的简单 Python 脚本编辑器 Thonny 来执行此操作。创建一个新文件并从 CaneCam.py 复制代码(在本指南的附件部分),或者在您的 Pi 上找到本指南并在那里下载。将文件命名为 CaneCam.py 该文件是 Edge Impulse 网络摄像头检测脚本的修改版本,增加了标签检测、占空比和电机控制。

简而言之,脚本每 5 秒拍摄一张照片,并等待直到它检测到行人灯(打开或关闭),然后唤醒其视频源并以每秒约 5 帧的速度运行(每 2 秒拍摄一次)。进入视频模式后,脚本会不断寻找“Go”行人灯。它找到一个,脚本打开马达,直到下一帧脚本再次决定要做什么。重复此过程,直到看不到 PCL,之后系统又回到“睡眠”状态,也就是。每 5 秒拍摄一张照片。该系统允许 Pi 在不主动处理视频馈送时节省电量,并将电池组的正常运行时间从 2 小时延长到 4 小时以上!

注意:请参阅代码中的注释以更深入地了解每一行的功能。

cd将两个文件(CaneCam.py、modelfile.eim)保存在同一目录中后,使用终端中的命令移至该目录。最后,问题:

python3 CaneCam.py modelfile.eim

您的终端将开始输出置信度值和建议的操作。您可以通过更改min_conf_thresholdCaneCam.py 来调整建议的阈值。将弹出一个 96x96 视频源,让您查看模型所看到的内容,您可以将其指向自己并制作您最好的人行横道灯脸,这很有趣。

 

pYYBAGNkhM6ADKN5AAE8l92F5NI657.png
成品
 

 

上传代码后,将电源切换到电池组,启动代码,然后将 Pi 与所有其他电子设备一起放入手杖盒中。盖上盖子 - 瞧!您自己的 CaneCam。将它带入世界,享受无需看到十字路口灯即可过马路的安心。

视频

 

需要改进的方面

如视频所示,CaneCam 在我收集数据的十字路口运行良好,只需几秒钟即可识别“Go”灯。然而,这主要是由于我的模型过度拟合这些 PCL 示例。从本质上讲,它与广义相反。如果其他人要复制这个项目,我建议在该地区收集更大的 PCL 数据集,看看该模型是否可以推广到不同的环境。

未来的应用

CV 和 TinyML 行业正在蓬勃发展,像 Edge Impulse 这样的公司因为处于其中而做得很好。CaneCam 的伟大之处在于它不是非常专门用于一项任务 - 相机可用于检测几乎任何带有 CV 的东西。这意味着通过更多的工作,好奇的黑客可以添加文本阅读、位置跟踪和避障等功能——所有这些问题都可以极大地改善盲人的生活。如果一家企业要采用 CaneCam,那么实施是明确的——为现有的拐杖制作附件或开发一个完整的智能拐杖系统——功能从过马路开始,并随着时间的推移放弃增加功能的软件更新。

结论

我创建这个项目是为了证明一个我认为是未来技术的概念——辅助机器学习。具体来说,计算机视觉为视力受损、行动不便或其他残疾的人带来了许多可能性。通过发现盲人日常遇到的问题,我能够使用一些简单的工具来证明一个具有巨大影响的小想法。

在接下来的几十年里,我想象着一个世界,像失明这样的残疾不再是阻碍人们生活的疾病。用于阅读的 CV 眼镜等辅助技术、CaneCam 等交通技术等将能够改变全球 2.5 亿视力障碍者的生活和出行方式。人是世界的产业,如果我们现在不投资他们,谁知道我们会留下什么。

感谢您的阅读和愉快的黑客攻击!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !