构建一个Python应用程序,使用多个ML模型来执行对象检测和异常检测
扫描二维码
随时随地手机看文章
虽然我当然不认为自己是数据科学家,但多年来我在各种简单但功能强大的Edge AI项目上进行了实验。为什么?可能是因为我通常使用的相对受限的硬件适合于构建更简单、不那么雄心勃勃的产品。但有了Edge AI,我们可以执行以前认为在小型硬件上不可能完成的艰巨任务。
作为嵌入式设备上机器学习的早期先驱(又名TinyML或Edge AI), Edge Impulse已经发展成为开发人员最喜欢的,当涉及到构建,测试和部署机器学习模型时,从小型esp32到最新的Jetson Orin Nano Super都可以运行。
在这个项目中,我通过展示如何构建一个“多模型”项目,在我的边缘人工智能之旅中迈出了下一步。由于单个ML模型不能总是执行我们需要的每个计算或生成我们需要的每个推理,我们可能需要有效地将多个模型链接在一起以实现我们产品的目的。
具体来说,我们将学习如何:
•利用边缘脉冲建立一个目标检测模型。
•并利用边缘脉冲建立了异常检测模型。
•编写一个Python应用程序,并将应用程序+模型部署到Raspberry Pi 5上。
•生成实时短信和电子邮件警报时,检测到异常,使用蓝调笔记卡蜂窝。
今天,我们的假冒公司生产砖。具体来说,就是那些带有蓝军标志的小砖块。随着这些新砖从传送带上下来,我们想分析它们的问题。当发现“坏砖”时,我们也想要即时通知。
因此,我们将看到当应用程序运行时,我们的对象(砖块)将被对象检测模型检测到,然后被异常检测模型扫描异常。如果达到指定的异常计数,将生成警报并通过蜂窝发送到云,用于SMS和电子邮件通知(附带异常图像!)。
想看看实际的项目吗?加入我们2月27日的网络研讨会:智能视觉,智能工业:边缘脉冲和蓝色异常检测
首先,让我们快速看看我们今天将使用的两个关键平台:Edge Impulse和Blues。
Edge Impulse简介
如果你还不熟悉Edge Impulse,他们提供了一个强大的平台,用于在受限设备上构建、测试、部署和优化Edge AI模型。
我们将使用Edge Impulse Studio来构建部署到树莓派5的对象检测和异常检测ML模型。
蓝调简介
bluesnotecard及其配套的云服务Notehub允许在几乎任何主机微控制器或单板计算机(如树莓派)上添加无线连接。
Notecard提供蜂窝,LoRa,Wi-Fi和卫星选项,是各种规模的物联网项目的易于使用的低功耗选项。
Notecard是用基于json的API编程的,它可以在所有无线电类型中工作,以及用于流行语言(如C, Arduino和Python)的sdk。
正如我们今天将看到的,Blues云服务Notehub与Notecard配对以提供安全的双向通信。您可以发送/接收事件(或blue语言中的Notes),并将这些出站Notes路由到任何云服务(现在是AWS)。
好了,让我们开始建造吧!
构建目标检测模型
我们的第一步是获取足够的图像来构建一个机器学习模型,该模型可以准确地识别传送带上的砖块。
我们可以从这个Python脚本开始,它使用Pi Camera模块每1.5秒拍摄一次移动的传送带的照片。
注意:这个项目的完整Python源代码可以在GitHub上找到,物体检测边缘脉冲项目也可以在这里找到。
允许Python脚本运行并保存足够的砖块在传送带上不同位置的图像(我开始时大约有100个)。有了保存到Pi的图像,是时候在边缘脉冲工作室创建一个新项目了。
转到Data acquisition选项卡并上传您刚刚保存的所有图像。请注意,它会自动将图像分为训练集和测试集。(稍后我们将回到测试方面。)
接下来,每个图像需要将每个砖标记为这样。这有点乏味,但Edge Impulse Studio内部的工具确实使这成为一个相对痛苦的过程!
下一步是创建你的“冲动”(Edge impulse用来描述完整的ML管道)。前往Impulse设计选项卡并遵循提供的默认选项(Edge Impulse在帮助您根据已提供的数据选择正确选项时非常聪明!)。
然后,您将前往图像选项卡,从标记的图像生成功能。在我们的例子中,我们只创建了一个功能:“砖块”。
接下来,访问Object detection选项卡来训练模型。所有的培训都发生在云端,所以不需要本地工具或花哨的gpu !
一旦您的模型得到训练,就转到模型测试选项卡。还记得分配给测试集的映像吗?好吧,因为这些被标记但不用于训练模型,它们是模型快速测试的完美候选者。
你应该会发现80-90%的对象(砖块)被成功检测!
现在可以在树莓派上下载模型文件。有关如何在Pi上设置Edge Impulse CLI的说明,请参阅Edge Impulse文档。
要登录到Edge Impulse并下载刚刚创建的模型文件,您将在Pi上使用这样的命令:
建立异常检测模型
在这一点上,我们有一个功能对象检测模型,将识别传送带上的砖块。很好,但现在我们要仔细检查每块砖是否有异常。
和上一个模型一样,我们的第一步是获取砖块的图像。不幸的是,我们不能使用与前一步相同的图像,因为我们需要这些新图像特定于砖块本身,而不需要任何其他周围环境。
幸运的是,Edge Impulse的Louis Moreau构建了一个基于flask的python应用程序,让我们可以使用我们刚刚创建的对象检测模型来保存砖块的单个图像。
注意:这个Python脚本是从前面提到的项目派生出来的。这个版本包含了一些轻微的调整,但所有的功劳都是路易斯的!此外,你可以在Edge Impulse Studio找到我的这个ML项目版本。
当你将——save-images-interval标志传递给这个Python脚本时,它会按照你指定的节奏(以秒为单位)简单地保存检测到的对象图像:
让一些砖块在传送带上运行,这个Python应用程序将在短时间内生成许多有用的砖块图像。
回到Edge Impulse Studio,为异常检测模型创建一个新项目。
转到图像采集选项卡并上传您刚刚保存的所有图像。这一次,您可以指定一个标签,而不是单独标记图像。“无异常”)上载时,所有图片。
进入冲量选项卡,设置冲量:
之后,完成模型的步骤与之前相同:
前往图像选项卡生成功能。
转到视觉异常检测选项卡来训练你的模型。
在model testing选项卡下测试您的模型。
您可以点击一个单独的测试样本,看看是否/为什么边缘脉冲检测到任何异常在您的测试图像。在接下来的例子中,我意识到传送带的一小部分反射了很多光,导致模型认为这是砖的异常!
使用与上面相同的命令下载模型文件,但这次使用——clean参数切换到新项目:
这样,我们就完成了Edge Impulse。是时候了解更多关于安全无线连接的信息了!
设置蓝调记事卡和Notehub
这个项目的Blues Notecard和Notehub的优点是能够使用蜂窝,LoRa, Wi-Fi或卫星连接,同时使用相同的,简单的基于json的API。
现在,虽然许多基于pi的项目可以使用机载Wi-Fi,但通常部署在Wi-Fi范围之外,或者本地IT不希望为不安全/未知的设备提供Wi-Fi访问。
当您选择Notecard和Notehub,你有一个交钥匙,完全安全的云管道在您的处置!
记事卡硬件设置
在这个项目中,我们将使用即将发布的“中频”Notecard Cellular。这款Notecard变体使用LTE Cat-1 bis,这是一种用于支持物联网应用的LTE协议。它提供与Cat-1相同的吞吐量和延迟,在任何支持LTE的地方都支持,但更便宜,只需要一个天线设计即可运行。
记事卡插到一个叫做记事卡的载体板上。目前使用的是专用于Raspberry Pi兼容的单板计算机,称为Notecarrier Pi Hat。这个帽子然后通过提供的头插入树莓派。
记事卡软件设置
Notecard的API都是基于json的。这意味着您向Notecard发送(和从Notecard接收)的所有内容都是JSON。例如,要获得Notecard的GPS位置,您可以使用该卡。位置API:
...并以JSON格式返回请求的数据:
但是,在使用Python这样的语言时,最好使用note-python库与Notecard进行接口。
在提供的Python脚本中,您将看到发送了几个命令来配置Notecard以与云通信。让我们快速浏览一下:
首先,我们使用枢纽。设置API来告诉Notecard在Notehub中使用哪个云项目(是的,我们将在稍后创建一个免费的Notehub项目):
其次,可选地创建一个模板,有效地为Notecard提供一个“提示”,以便更有效地存储数据并将数据发送到Notehub。模板API:
被语法弄糊涂了?“异常”和“image_data”旁边的那些值只是作为提示告诉Notecard异常计数将是2字节带符号的整数,图像数据将是字符串(base64编码的图像字符串)。
再往下,我们将得到最后一个Notecard命令,那就是笔记。添加API。这将在每次检测到异常图像时创建一个注释(或事件),并将异常计数(以及前面提到的二进制图像数据的base64编码字符串)发送到云:
注意:同样,请务必查阅该项目的完整源代码,以便在上下文中更好地理解这些命令。
Notehub云设置
前往notehub。创建您的免费蓝调Notehub帐户。
创建您的第一个项目并复制您的全局唯一产品标识符:
这个字符串表示Python脚本中使用的NOTEHUB_PRODUCT_UID的值。
当您使用Notecard和Notehub时,这就是将您的产品连接到云所需要的全部!
运行Python应用
是时候开始谈正事了。如果此时运行Python脚本,它将执行以下操作:
扫描视频馈送中的物体(砖块)。
如果发现了砖块,它将使用第二个ML模型扫描异常情况。
如果在一张图像中发现足够多的异常,它将发送一个事件(一个笔记)到Notehub。
事实上,你会看到这些数据开始出现在Notehub:
这很棒,但是我们仍然缺少与我们的云服务的集成,今天的云服务是一个AWS Lambda函数,用于接收来自Notehub的数据,而Twilio + SendGrid用于接收短信和电子邮件通知。
创建AWS Lambda函数
lambda是非常容易创建的云函数,它允许您处理来自任意源的入站数据(从Notehub路由数据的完美候选)。
Lambda函数的完整源代码可以在GitHub上找到。
我将指出一些关键部分:
将图像保存到S3
当Notehub将事件路由到Lambda时,我们希望将base64编码的字符串作为jpeg图像保存到S3桶中(是的,这意味着您还必须在AWS中设置S3桶):
然后,我们需要在S3中为该图像生成一个安全的URL,以便我们可以将其传递给Twilio和SendGrid以发出警报:
最后,我们将使用Twilio和SendGrid sdk来发送SMS和电子邮件通知。
以下是Twilio所需的代码:
注意:我正在掩盖设置Twilio和SendGrid帐户的一些要求。要完成这一步,您将需要两个服务中的一些密钥、id和令牌,因此请查看Twilio文档和SendGrid文档。
最后,确保部署Lambda函数并从Configuration选项卡复制function URL,因为您将在下一步中用到它。
将数据从Notehub路由到AWS
我们的最后一步(我保证)是在Notehub中配置一条路由,将事件发送给Lambda函数。
返回到Notehub并单击Routes选项卡。
使用“AWS”选项创建一条新路由:
确保在Type下拉框中选择Lambda(这是默认的),并将函数URL粘贴到URL字段中:
向下滚动一点,确保你的异常。qo选择Notefile作为唯一将被路由到Lambda函数的Note/事件(否则,来自您的Notecard的所有事件也将被发送到AWS):
一定要保存路线,这样你就万事通了!
回到你的树莓派,让我们再次运行Python应用程序:
尝试切换对象的位置,混淆其中的一些,或者以其他方式制造一个“异常”。如果你观察Pi终端的输出,你应该会看到检测到的异常:
在一个重要的异常检测后,在几秒钟内,你会看到这些事件显示在Notehub和图像文件将出现在你的S3桶:
最后,您将看到短信和电子邮件通知,让您知道检测到异常情况(以及在对象本身上识别异常的有用图像!):
下一个步骤
我希望你能体验到使用Edge Impulse实现多模型边缘人工智能解决方案是多么容易,并将其与Blues, AWS和Twilio + SendGrid连接到云。
今天用你自己的Notecard和noteccarrier Pi Hat开始使用Blues(或者如果你想使用基于stm32的微控制器,可以查看Blues Starter Kit for Cell+WiFi)。
本文编译自hackster.io