使用Arduino Uno Q设计一款边缘视觉桌面助手
我们生活在一个信息过载的世界。我想将计算机视觉与日常生活结合起来,解决一个简单的问题:为了查看早间新闻,不得不在手机上不停地滚动浏览。
认识AI新闻播报器。这是一款独立的桌面硬件设备,将计算机视觉与您的日常生活融为一体。按下SELECT按钮后,它会利用原生边缘计算视觉技术验证您的身份。一旦验证通过,便会立即在清晰的LCD屏幕上呈现个性化的每日新闻摘要,您可通过触控按键模块以自己的节奏浏览新闻标题。无需臃肿的应用程序,无需订阅服务,仅需优雅的边缘计算体验。
最初设计得过于复杂的云/人工智能庞然大物,最终演变为一款美观、运行迅捷且完全无需依赖的嵌入式硬件。通过利用Arduino UNO Q(4GB)的双架构,我构建了一种零依赖的系统架构,无需任何API密钥和速率限制,仅使用纯Python原生库,从而绕过传统硬件瓶颈。
无论你是想了解边缘视觉的初学者,还是希望绕过Arduino桥接负载限制的开发者,本指南都将为你详细展示如何构建它。
宏伟愿景与现实的对比
刚开始时,我打算使用 OpenCV 这样的重型 Python 框架和大型语言模型来摘要新闻。但正如任何硬件工程师都知道的那样,嵌入式系统总能迫使你做出简化。
在Arduino App Lab的前沿技术基础上,我需要将代码运行在隔离且安全的容器中。这个容器缺少标准的C++编译工具。每次我尝试将大型库强制引入项目时,系统都会崩溃。我意识到,为了使这一过程对初学者来说易于访问、高度可靠且便于复现,我必须彻底重新思考我的方法。
拥抱零依赖架构
我并没有与硬件对抗,而是充分利用了它的限制。我摒弃了臃肿的软件,采用了一种严格的“零依赖”架构。
对于初学者来说,“依赖”是指需要下载的外部代码库,才能让程序正常运行。通过避免使用这些依赖,我的项目变得更快、更容易复现。
愿景:我使用了Arduino App Lab原生的视频对象检测模块,直接连接到摄像头,而不是自定义的OpenCV模型。
数据:我并没有使用新闻API付费,而是用Python内置的标准库(urllib和xml)编写了一个轻量级的自定义数据解析器,用于提取原始的Google新闻RSS订阅源。该解析器内存开销为零,且无需任何API密钥。
绕过桥接协议
最大的技术难题是让长篇新闻摘要在2英寸屏幕上显示。Arduino的两个部分通过一个名为Arduino_rpclite的内部桥接器进行通信。
我很快发现,这个桥梁对每条消息的字节数有严格的限制,大约为256字节。当我尝试发送一段较长的新闻描述时,通信就会中断,屏幕也会卡住。此外,我还了解到,在新闻流中使用原始HTML标签和随机换行符(\n)会严重破坏串行通信。
为了解决这个问题,我发明了一种“分片RPC架构”。RPC是远程过程调用的缩写,即处理器之间的通信方式。主Python脚本不再发送整篇新闻文章,而是只发送标题。这样就能原生地将完整的250个字符文本流式传输到屏幕上,而不会导致程序崩溃。
最终用户体验
最终呈现的是一款响应灵敏的桌面伴侣,运行优雅且完全免费。你坐下后按下SELECT按钮,设备会通过摄像头以视觉方式确认你的存在,然后为你提供每日新闻。
打造AI新闻主播是一项极佳的减量实践,证明了构建智能设备并不需要庞大的软件堆栈。
步骤1:网络与环境配置
该项目采用私有且本地的方式。新闻内容直接通过 Python 内置的标准库从 Google News RSS 链接获取,因此无需 API 密钥、Google Cloud 令牌,也无严格的速率限制。
1. 下载并安装 Arduino App Lab(版本 0.7 或更高)。
2. 使用USB-C数据线将您的Arduino UNO Q连接到工作站。
3. 打开 App Lab 工作区底部的终端标签页,以直接与电路板的 Linux 微处理器单元(MPU)通信。
4. 通过执行以下命令启动可视化网络管理器:
5. 使用方向键导航至“激活连接”,选择您的本地WiFi网络,输入凭据,退出工具并断开电路板连接。
步骤2:硬件接线
根据以下映射表连接您的组件。
完成物理组装后,将 Arduino 8-in-1 USB-C 集线器直接插入 UNO Q 的主 USB-C 接口,将迷你摄像头连接到集线器上的可用 USB-A 接口,然后通过集线器的 USB-C PD 接口将其连接到您的工作站。
步骤3:训练边缘视觉模型
配置此砖块以识别用户,训练一个轻量级的单类人脸检测模型。
1. 登录 Edge Impulse Studio,创建一个名为 AI-Newscaster-FaceDetect 的项目。
2. 上传一组包含200到500张人脸图像的数据集,这些图像需在不同的光照条件和角度下拍摄。请确保选择将数据自动划分为训练集和测试集的选项。
3. 导航至数据采集 -> AI标注,选择使用OWL-ViT的边界框标注,并使用提示“一个人脸(face, 0.1)”对您的数据集进行批量标注。
4. 在 Impulse Design 中,将图像输入尺寸设置为 320x320 像素(按短边适配),并添加一个物体检测学习模块。
5. 在目标检测参数中,选择 MobileNetV2 SSD FPN-Lite(仅支持 320x320)架构。使用学习率 0.1 对网络进行 50 个周期的训练。
6. 转到部署页面,搜索 Arduino UNO Q 平台,选择“未优化(float32)”构建流水线,然后生成你的库。从浏览器 URL 中复制你唯一的项目 ID。
步骤4:App Lab 项目设置与部署
准备好资产后,配置 App Lab 套件中的运行环境。
1. 打开 Arduino App Lab,并创建一个名为 AI 新闻播报器的项目。
2. 打开“砖块”面板,插入视频对象检测模块。
3. 在 AI 模型部分,连接您的 Edge Impulse 账户凭据,并选择已训练的面部检测模型。请确认您的 app.yaml 文件中明确列出了正确的项目 model_id。
4. 打开 App Lab 库管理器,将 Adafruit GFX 库与 Adafruit ST7735 和 ST7789 库一起安装。
5. 您可以在“附件”部分找到完整的注释源代码。将Python逻辑上传到您的App Lab容器,将.ino文件烧录到MCU,并将摄像头放在桌面上即可。
点击 App Lab 中的“运行”。平台将自动为 STM32 编译 C++ 代码,部署视觉容器,并启动您的 Python 环境。
步骤5:如何使用你的AI新闻主播
整个用户体验完全在设备上完成,无需手机或电脑。为确保这一点,请在应用名称旁边的下拉菜单中切换“启动时运行”选项。
1. 使用您的5V/3A移动电源为设备供电。
2. 等待LCD显示:“您好!按SELECT键获取新闻……”。
3. 按下 SELECT 按钮以启动摄像头。
4. 看向镜头。一旦检测到你的脸,选择一个新闻类别,它就会为你获取新闻摘要。
5. 使用上下按钮浏览故事,按返回键回到空闲界面。
未来源于本地
我们太过于将注意力投向无限滚动的屏幕。AI新闻播报员通过将智能从云端直接传输到你桌边,重新夺回了那些时间。借助UNO Q的双架构设计,最终打造出一个完全私密、无需订阅且即时响应的智能伙伴。智能硬件的未来不在于添加更多依赖软件的层级,而在于让本地硬件变得更加智能。
本文编译自hackster.io





