AI增强型安全监控项目
“通过使用微波传感器和OAK相机让进入建筑更安全。”
— Ralph Yamamoto
这个项目中使用的东西
硬件组件:
- OAK-D-IoT-40
- Microwave Proximity Detector RCWL-0516
- M5Stack M5StickC ESP32-PICO Mini IoT Development Board
- M5Stack M5StickC 18650C
- Raspberry Pi 4 Model B
软件应用和在线服务:
- Intel OpenVINO toolkit
- DepthAI Gen2 API
- Espressif ESP-IDF
- Arduino IDE
- Node-RED
- PlatformIO IDE
手工工具和制造机器:
- AnyCubic Mega S 3D 打印机(用来打印支架)
背景
为了tinyML视觉挑战,我正在做一个概念验证项目,以识别接近我家前门的人。OpenCV的OAK相机性能给我留下了深刻的印象,我想尝试使用它的ESP32版产品,它集成了一个用于主机处理和通信的ESP32。使用像OAK相机这样的高性能设备需要小心管理功耗。大部分的电力是在推理过程中消耗的,所以我决定增加一个额外的微波传感器,只有在物体进入检测边界时才开启推理功能。
我没有时间实现一个完全打包和集成的解决方案,但我希望演示如何实现各种项目元素及其相互通信。
微波探测器
微波探测器是RCWL-0516,价格低廉,易于集成。它利用3千兆赫信号的多普勒频移来检测运动物体。该装微波检测器是RCWL-0516,它价格低廉,集成简单。它利用3GHz信号的多普勒频移来探测移动物体。该装置有一个大的4-28V电源范围,被调节到3.3V。它为检测范围内的任何东西提供一个数字3.3V检测输出。标称检测范围为7米。灵敏度与电路板的正面正交最好。
我的要求是在入口门5米内探测。为了制作原型和测试,我决定将这个装置做成便携式的。我将RCWL-0516安装在一个带有18650可充电电池组的M5StickC上。当检测到移动时,用户指示灯将点亮。检测事件和电池电压也通过MQTT发布。附上连接示意图和代码。
这是一张通往前门的照片。第一步离门5米。在测试中,当我在这个步骤之前的时候,这个单元就会触发。不幸的是,我无法在手机摄像头上曝光来拍摄演示视频(在这个分辨率下看不到发光二极管灯),尽管它是清晰可见的。
这是室内拍摄的视频。我从6米外的一个房间开始。你需要仔细看,但当我开始走路时,发光二极管就会打开,只要有运动,发光二极管就会一直被触发。当我停下来时,它会关闭,当我后退时,它会再次触发。
微波探测器MQTT仪表板
这是显示微波探测器模块状态的仪表板。节点红色仪表板运行在树莓派 4上,我使用它作为MQTT服务器/代理来处理设备之间的消息传递。状态要么是安全的或者移动和多普勒显示检测的历史记录。
OAK相机
OAK-D-IoT-40是OAK-D的嵌入式/IoT版本,如下图所示,它有双目深度OV9282 (1280×800)相机,具有同步的全局快门,以实现3D人工智能。再加上高分辨率IMX378 (12MP,4056×3040)彩色摄像头。主板在SOM上有一个英特尔Movidius Myriad X VPU,主板背面有散热片。3个摄像头和VPU用于实现DepthAI。此外,还有一个ESP32,通过SPI与VPU通信,并提供蓝牙和WiFi连接。
我为OAK-D-IoT-40 3D打印了一个三脚架支架,我可以在原型制作阶段使用。它是一个完全开放的框架,允许在需要时接触电路板,背面的SOM散热器完全暴露在外,以提高散热性能。
下面,该装置安装在一个短三脚架上,用于程序开发和测试。顶部的蓝色microUSB电缆用于编程和与ESP32通信。中间的红色USB-C电缆用于编程和与VPU通信。底部黑色电源线提供5V @ 3A(如果有USB-C电源能够3A,则不需要)。为了证明我的概念,我可能会保持这种配置,尽管我会尝试获得一个独立的配置,其中VPU启动与模型运行。在这种情况下,只需要电源线。
这是主板的背面,SOM散热器完全暴露在外。对于初始测试,我预计推理会持续运行很长时间。我注意到运行推理时散热器摸起来很热。作为这个项目的一部分,我计划在不同的运行模式下进行功率和热量测量。在最终部署中,我将最小化推理占空比,以降低整体功耗。最坏的情况是,我可能需要为机箱添加一个风扇(或者尝试更大的散热器)。
OpenVino工具包
面向边缘的英特尔开发云提供了一个沙箱,用于在专门用于深度学习的英特尔硬件上原型化和实验人工智能推理工作负载。您可以使用英特尔OpenVINO发行版工具包中内置的工具优化您的深度学习模型,然后在CPU、GPU和vpu(视觉处理单元)的组合上测试它们的性能。
我很久以前就在NCS和NCS2上使用了OpenVino软件,我希望我能够在DevCloud中完成所有的模型优化和测试,这样我就不必在本地升级或重新安装OpenVino了。不幸的是,当我试图运行教程时,我发现VPU资源不可用。这似乎是教程中的一个错误,但是主持人给我指出了一个帖子(小YOLO V3对象检测示例),它允许我比较运行在不同硬件设备(中央处理器、图形处理器、VPU等)上的模型。
对于我的概念证明,我不认为我有时间做任何模型开发或玩模型优化器设置。好消息是,英特尔开放模型动物园存储库有许多适合我的用例的预训练模型。希望DevCloud笔记本中的MYRIAD设备能够修复这个错误,我可以稍后尝试测试不同的型号配置。
以下是OAK-D-IoT-40的基本流程
对于这个项目,我将从一个现有的模型开始(可能是几个,因为处理管道允许)。我需要弄清楚的流程的关键部分是如何转换中间表示(IR)文件(bin和。xml)添加到。在MyriadX上部署模型所需的blob文件。
在“tinyML视觉挑战-Intel-Luxonis视觉平台网络研讨会”期间,来自Luxonis的Erik展示了如何将文件转换代码添加到DevCloud中的对象检测教程笔记本的末尾。过程很简单——安装blobconverter python模块,使用IR文件和输出文件的路径运行blobconverter,并指定要使用的剃须刀(内核)数量。然后使用文件链接模块将blob文件下载到主机。
这是笔记本的输出:
一个非常短的片段,用于验证blob文件是否正确生成和下载。使用depthai_demo脚本,blob文件已复制到depthai/resources/nn/mobilenet-ssd文件夹。
python dep Thai _ demo . py-CNN mobile net-SSD
我后来发现,OAK还提供了一个在线blob转换器,可以轻松地将OpenVino模型转换为不同的版本和 shave次数://blobconverter.luxonis.com/ 。
OAK-D-IoT-40上的设备间通信
推理完全在Myriad X上运行。在原型制作和开发中,Myriad X由主机处理器通过USB-C接口操作。然而,在独立部署中,Myriad X以独立的可引导配置运行。在这种情况下,推理结果的通信由ESP32处理,该ESP32通过SPI与Myriad X通信。下一步是验证该接口的编程和操作。
OAK有一个运行在ESP32上的示例程序,它通过spi消息与VPU接口。我试过了esp32-spi-message-demo 它从人物跟踪器管道在VPU上运行。轨迹小程序提供关于跟踪状态(“新的”、“已跟踪的”、“丢失的”、“已移除的”)以及检测到的边界框的X、Y坐标的信息。如下图所示,我遇到了一些延迟问题——来自ESP32的串行流滞后于视频输出。
我也有一些界面周期性崩溃的不稳定性。Luxonis目前正在重构spi-api以提高spi吞吐量,希望这也能解决不稳定性问题。我将推迟这个界面的工作,直到更新发布。原则上,在我的最终解决方案中,ESP32将处理来自VPU的检测和识别数据,并将MQTT信息发送给经纪人。我也将使用来自微波探测器的MQTT信息来触发VPU推断。
电源管理
我在长时间连续运行推理时观察到的一件事是,VPU上的散热器在被动冷却下变得非常热。如果我能改变在长时间连续运行推理时,我观察到一件事,就是VPU上的散热片在被动冷却时变得非常热。如果我能够改变散热片的方向,使其垂直,以便更好地进行对流冷却,将会有所帮助。我可能以后会尝试使用不同的散热器,或者安装一个风扇进行主动冷却。在任何情况下,我都需要研究量化所使用的功率,并试图减少它。这将使我能够在停电时使用备用电池,并可能继续使用被动冷却。Luxonis指出,VPU的最大工作温度是105℃。
DepthAI的API允许记录VPU的性能信息,如cpu和内存的使用以及芯片温度。为了得到一个基线,我使用了mobilenet-ssd的例子,并在30分钟内绘制了它。
使用以下命令将温度记录到文件中:
python dep Thai _ demo . py-CNN mobile net-SSD-report temp-report _ file mobile net _ templog 30min . CSV
mobilenet-ssd温度测量测试条件:
通常情况下,我不会期望某人/某物在检测区超过5分钟,所以就芯片温度而言,我应该没有问题(除非环境温度很高或我使用高功率管道,否则有连续工作的余地)。
然而,仍然有一个关于总功率的担忧。通过减少推理工作周期来降低功率的一个快速方法是降低摄像机的帧率(FPS)。下面是我计划在这个项目中使用的人脸检测/人脸识别管道NN的功率与帧速率的快速测试。
我使用1FPS的功率作为我的基线,并绘制了当我将帧率提高到30FPS时的功率差异。基线功率为2.1瓦。
功率的增加与帧速率的关系从5FPS开始是相当线性的。在5FPS时,对运动的反应似乎有点太慢了,所以我打算看看10FPS是否是一个好的折衷办法。
项目管道
DepthAI有一个在VPU运行的处理管道的概念。它是由一组节点和它们之间的链接构成的。这是一个类似于我以前在OpenCV中使用的Gstreamer管道的概念。
下面是我的项目的简化管道图。它使用两组神经网络节点。第一组将在检测到的物体超过2米时进行人员检测和跟踪,第二组将在物体在2米以内时进行人脸检测和识别(阈值可能会改变)。立体摄像机提供来自空间位置计算器的距离测量,并将其传递给一个脚本节点,该节点控制哪个神经网络接收RGB摄像机的输出进行推理。RGB摄像机图像和NN推断结果使用Xout节点传递给主机。
我在下面创建了一个我想实现的处理管道的操作的 “模拟”。这是一个模拟,因为它是在输入的视频上按顺序操作神经网络,而不是切换摄像机的输入。正如你从视频中看到的,独立的人物检测和图像识别网络管道都在单独运作。我还在努力使网络切换与摄像机一起工作。
控制管道中的图像流
我在理解如何使用管道中的脚本节点来引导图像流的问题上挣扎了一会儿。
我最终创建了一个简单的例子来测试我的做法是否正确。我从 “ImageManip Tiling “的例子开始,它将相机预览框水平分割成两半,并将两半并排显示。然后,我添加了空间定位计算器和一个脚本节点,以便在投资回报率的平均深度大于2米时交换平铺图像。你可以看到它在下面工作。当我移入和移出位于画面中心的感兴趣区域(ROI)时,测量的深度发生了变化,这导致瓷砖中的图像发生了交换。
现在我可以用空间定位计算器来调整该脚本节点,以引导NN的输入。
切换管道中使用的NN输出
我做了一个简短的演示,在 “mobilenet-ssd “和 “face-detection-retail-0004 “神经网络之间根据基于空间深度计算的物体距离进行切换。我需要将这一功能纳入我的终端应用中,我正在使用的更复杂的管道。
项目总结
我没能在tinyML视觉挑战赛的时间范围内完成一个部署的独立项目,但我已经能够展示我正在整合的所有元素。
我想感谢Luxonis和英特尔为在边缘实现视觉人工智能而开发的伟大产品。并特别感谢Luxonis团队在其Discord频道上的及时支持。
我期待着使用DepthAI和OpenVino完成这个项目和其他许多项目。这些工具实际上使开发变得非常有趣,因为你对它们的能力越来越强。