構(gòu)建一個Python應(yīng)用程序,使用多個ML模型來執(zhí)行對象檢測和異常檢測
雖然我當(dāng)然不認(rèn)為自己是數(shù)據(jù)科學(xué)家,但多年來我在各種簡單但功能強(qiáng)大的Edge AI項(xiàng)目上進(jìn)行了實(shí)驗(yàn)。為什么?可能是因?yàn)槲彝ǔJ褂玫南鄬κ芟薜挠布m合于構(gòu)建更簡單、不那么雄心勃勃的產(chǎn)品。但有了Edge AI,我們可以執(zhí)行以前認(rèn)為在小型硬件上不可能完成的艱巨任務(wù)。
作為嵌入式設(shè)備上機(jī)器學(xué)習(xí)的早期先驅(qū)(又名TinyML或Edge AI), Edge Impulse已經(jīng)發(fā)展成為開發(fā)人員最喜歡的,當(dāng)涉及到構(gòu)建,測試和部署機(jī)器學(xué)習(xí)模型時,從小型esp32到最新的Jetson Orin Nano Super都可以運(yùn)行。
在這個項(xiàng)目中,我通過展示如何構(gòu)建一個“多模型”項(xiàng)目,在我的邊緣人工智能之旅中邁出了下一步。由于單個ML模型不能總是執(zhí)行我們需要的每個計(jì)算或生成我們需要的每個推理,我們可能需要有效地將多個模型鏈接在一起以實(shí)現(xiàn)我們產(chǎn)品的目的。
具體來說,我們將學(xué)習(xí)如何:
?利用邊緣脈沖建立一個目標(biāo)檢測模型。
?并利用邊緣脈沖建立了異常檢測模型。
?編寫一個Python應(yīng)用程序,并將應(yīng)用程序+模型部署到Raspberry Pi 5上。
?生成實(shí)時短信和電子郵件警報時,檢測到異常,使用藍(lán)調(diào)筆記卡蜂窩。
今天,我們的假冒公司生產(chǎn)磚。具體來說,就是那些帶有藍(lán)軍標(biāo)志的小磚塊。隨著這些新磚從傳送帶上下來,我們想分析它們的問題。當(dāng)發(fā)現(xiàn)“壞磚”時,我們也想要即時通知。
因此,我們將看到當(dāng)應(yīng)用程序運(yùn)行時,我們的對象(磚塊)將被對象檢測模型檢測到,然后被異常檢測模型掃描異常。如果達(dá)到指定的異常計(jì)數(shù),將生成警報并通過蜂窩發(fā)送到云,用于SMS和電子郵件通知(附帶異常圖像!)。
想看看實(shí)際的項(xiàng)目嗎?加入我們2月27日的網(wǎng)絡(luò)研討會:智能視覺,智能工業(yè):邊緣脈沖和藍(lán)色異常檢測
首先,讓我們快速看看我們今天將使用的兩個關(guān)鍵平臺:Edge Impulse和Blues。
Edge Impulse簡介
如果你還不熟悉Edge Impulse,他們提供了一個強(qiáng)大的平臺,用于在受限設(shè)備上構(gòu)建、測試、部署和優(yōu)化Edge AI模型。
我們將使用Edge Impulse Studio來構(gòu)建部署到樹莓派5的對象檢測和異常檢測ML模型。
藍(lán)調(diào)簡介
bluesnotecard及其配套的云服務(wù)Notehub允許在幾乎任何主機(jī)微控制器或單板計(jì)算機(jī)(如樹莓派)上添加無線連接。
Notecard提供蜂窩,LoRa,Wi-Fi和衛(wèi)星選項(xiàng),是各種規(guī)模的物聯(lián)網(wǎng)項(xiàng)目的易于使用的低功耗選項(xiàng)。
Notecard是用基于json的API編程的,它可以在所有無線電類型中工作,以及用于流行語言(如C, Arduino和Python)的sdk。
正如我們今天將看到的,Blues云服務(wù)Notehub與Notecard配對以提供安全的雙向通信。您可以發(fā)送/接收事件(或blue語言中的Notes),并將這些出站Notes路由到任何云服務(wù)(現(xiàn)在是AWS)。
好了,讓我們開始建造吧!
構(gòu)建目標(biāo)檢測模型
我們的第一步是獲取足夠的圖像來構(gòu)建一個機(jī)器學(xué)習(xí)模型,該模型可以準(zhǔn)確地識別傳送帶上的磚塊。
我們可以從這個Python腳本開始,它使用Pi Camera模塊每1.5秒拍攝一次移動的傳送帶的照片。
注意:這個項(xiàng)目的完整Python源代碼可以在GitHub上找到,物體檢測邊緣脈沖項(xiàng)目也可以在這里找到。
允許Python腳本運(yùn)行并保存足夠的磚塊在傳送帶上不同位置的圖像(我開始時大約有100個)。有了保存到Pi的圖像,是時候在邊緣脈沖工作室創(chuàng)建一個新項(xiàng)目了。
轉(zhuǎn)到Data acquisition選項(xiàng)卡并上傳您剛剛保存的所有圖像。請注意,它會自動將圖像分為訓(xùn)練集和測試集。(稍后我們將回到測試方面。)
接下來,每個圖像需要將每個磚標(biāo)記為這樣。這有點(diǎn)乏味,但Edge Impulse Studio內(nèi)部的工具確實(shí)使這成為一個相對痛苦的過程!
下一步是創(chuàng)建你的“沖動”(Edge impulse用來描述完整的ML管道)。前往Impulse設(shè)計(jì)選項(xiàng)卡并遵循提供的默認(rèn)選項(xiàng)(Edge Impulse在幫助您根據(jù)已提供的數(shù)據(jù)選擇正確選項(xiàng)時非常聰明!)。
然后,您將前往圖像選項(xiàng)卡,從標(biāo)記的圖像生成功能。在我們的例子中,我們只創(chuàng)建了一個功能:“磚塊”。
接下來,訪問Object detection選項(xiàng)卡來訓(xùn)練模型。所有的培訓(xùn)都發(fā)生在云端,所以不需要本地工具或花哨的gpu !
一旦您的模型得到訓(xùn)練,就轉(zhuǎn)到模型測試選項(xiàng)卡。還記得分配給測試集的映像嗎?好吧,因?yàn)檫@些被標(biāo)記但不用于訓(xùn)練模型,它們是模型快速測試的完美候選者。
你應(yīng)該會發(fā)現(xiàn)80-90%的對象(磚塊)被成功檢測!
現(xiàn)在可以在樹莓派上下載模型文件。有關(guān)如何在Pi上設(shè)置Edge Impulse CLI的說明,請參閱Edge Impulse文檔。
要登錄到Edge Impulse并下載剛剛創(chuàng)建的模型文件,您將在Pi上使用這樣的命令:
建立異常檢測模型
在這一點(diǎn)上,我們有一個功能對象檢測模型,將識別傳送帶上的磚塊。很好,但現(xiàn)在我們要仔細(xì)檢查每塊磚是否有異常。
和上一個模型一樣,我們的第一步是獲取磚塊的圖像。不幸的是,我們不能使用與前一步相同的圖像,因?yàn)槲覀冃枰@些新圖像特定于磚塊本身,而不需要任何其他周圍環(huán)境。
幸運(yùn)的是,Edge Impulse的Louis Moreau構(gòu)建了一個基于flask的python應(yīng)用程序,讓我們可以使用我們剛剛創(chuàng)建的對象檢測模型來保存磚塊的單個圖像。
注意:這個Python腳本是從前面提到的項(xiàng)目派生出來的。這個版本包含了一些輕微的調(diào)整,但所有的功勞都是路易斯的!此外,你可以在Edge Impulse Studio找到我的這個ML項(xiàng)目版本。
當(dāng)你將——save-images-interval標(biāo)志傳遞給這個Python腳本時,它會按照你指定的節(jié)奏(以秒為單位)簡單地保存檢測到的對象圖像:
讓一些磚塊在傳送帶上運(yùn)行,這個Python應(yīng)用程序?qū)⒃诙虝r間內(nèi)生成許多有用的磚塊圖像。
回到Edge Impulse Studio,為異常檢測模型創(chuàng)建一個新項(xiàng)目。
轉(zhuǎn)到圖像采集選項(xiàng)卡并上傳您剛剛保存的所有圖像。這一次,您可以指定一個標(biāo)簽,而不是單獨(dú)標(biāo)記圖像。“無異?!?上載時,所有圖片。
進(jìn)入沖量選項(xiàng)卡,設(shè)置沖量:
之后,完成模型的步驟與之前相同:
前往圖像選項(xiàng)卡生成功能。
轉(zhuǎn)到視覺異常檢測選項(xiàng)卡來訓(xùn)練你的模型。
在model testing選項(xiàng)卡下測試您的模型。
您可以點(diǎn)擊一個單獨(dú)的測試樣本,看看是否/為什么邊緣脈沖檢測到任何異常在您的測試圖像。在接下來的例子中,我意識到傳送帶的一小部分反射了很多光,導(dǎo)致模型認(rèn)為這是磚的異常!
使用與上面相同的命令下載模型文件,但這次使用——clean參數(shù)切換到新項(xiàng)目:
這樣,我們就完成了Edge Impulse。是時候了解更多關(guān)于安全無線連接的信息了!
設(shè)置藍(lán)調(diào)記事卡和Notehub
這個項(xiàng)目的Blues Notecard和Notehub的優(yōu)點(diǎn)是能夠使用蜂窩,LoRa, Wi-Fi或衛(wèi)星連接,同時使用相同的,簡單的基于json的API。
現(xiàn)在,雖然許多基于pi的項(xiàng)目可以使用機(jī)載Wi-Fi,但通常部署在Wi-Fi范圍之外,或者本地IT不希望為不安全/未知的設(shè)備提供Wi-Fi訪問。
當(dāng)您選擇Notecard和Notehub,你有一個交鑰匙,完全安全的云管道在您的處置!
記事卡硬件設(shè)置
在這個項(xiàng)目中,我們將使用即將發(fā)布的“中頻”Notecard Cellular。這款Notecard變體使用LTE Cat-1 bis,這是一種用于支持物聯(lián)網(wǎng)應(yīng)用的LTE協(xié)議。它提供與Cat-1相同的吞吐量和延遲,在任何支持LTE的地方都支持,但更便宜,只需要一個天線設(shè)計(jì)即可運(yùn)行。
記事卡插到一個叫做記事卡的載體板上。目前使用的是專用于Raspberry Pi兼容的單板計(jì)算機(jī),稱為Notecarrier Pi Hat。這個帽子然后通過提供的頭插入樹莓派。
記事卡軟件設(shè)置
Notecard的API都是基于json的。這意味著您向Notecard發(fā)送(和從Notecard接收)的所有內(nèi)容都是JSON。例如,要獲得Notecard的GPS位置,您可以使用該卡。位置API:
...并以JSON格式返回請求的數(shù)據(jù):
但是,在使用Python這樣的語言時,最好使用note-python庫與Notecard進(jìn)行接口。
在提供的Python腳本中,您將看到發(fā)送了幾個命令來配置Notecard以與云通信。讓我們快速瀏覽一下:
首先,我們使用樞紐。設(shè)置API來告訴Notecard在Notehub中使用哪個云項(xiàng)目(是的,我們將在稍后創(chuàng)建一個免費(fèi)的Notehub項(xiàng)目):
其次,可選地創(chuàng)建一個模板,有效地為Notecard提供一個“提示”,以便更有效地存儲數(shù)據(jù)并將數(shù)據(jù)發(fā)送到Notehub。模板API:
被語法弄糊涂了?“異?!焙汀癷mage_data”旁邊的那些值只是作為提示告訴Notecard異常計(jì)數(shù)將是2字節(jié)帶符號的整數(shù),圖像數(shù)據(jù)將是字符串(base64編碼的圖像字符串)。
再往下,我們將得到最后一個Notecard命令,那就是筆記。添加API。這將在每次檢測到異常圖像時創(chuàng)建一個注釋(或事件),并將異常計(jì)數(shù)(以及前面提到的二進(jìn)制圖像數(shù)據(jù)的base64編碼字符串)發(fā)送到云:
注意:同樣,請務(wù)必查閱該項(xiàng)目的完整源代碼,以便在上下文中更好地理解這些命令。
Notehub云設(shè)置
前往notehub。創(chuàng)建您的免費(fèi)藍(lán)調(diào)Notehub帳戶。
創(chuàng)建您的第一個項(xiàng)目并復(fù)制您的全局唯一產(chǎn)品標(biāo)識符:
這個字符串表示Python腳本中使用的NOTEHUB_PRODUCT_UID的值。
當(dāng)您使用Notecard和Notehub時,這就是將您的產(chǎn)品連接到云所需要的全部!
運(yùn)行Python應(yīng)用
是時候開始談?wù)铝?。如果此時運(yùn)行Python腳本,它將執(zhí)行以下操作:
掃描視頻饋送中的物體(磚塊)。
如果發(fā)現(xiàn)了磚塊,它將使用第二個ML模型掃描異常情況。
如果在一張圖像中發(fā)現(xiàn)足夠多的異常,它將發(fā)送一個事件(一個筆記)到Notehub。
事實(shí)上,你會看到這些數(shù)據(jù)開始出現(xiàn)在Notehub:
這很棒,但是我們?nèi)匀蝗鄙倥c我們的云服務(wù)的集成,今天的云服務(wù)是一個AWS Lambda函數(shù),用于接收來自Notehub的數(shù)據(jù),而Twilio + SendGrid用于接收短信和電子郵件通知。
創(chuàng)建AWS Lambda函數(shù)
lambda是非常容易創(chuàng)建的云函數(shù),它允許您處理來自任意源的入站數(shù)據(jù)(從Notehub路由數(shù)據(jù)的完美候選)。
Lambda函數(shù)的完整源代碼可以在GitHub上找到。
我將指出一些關(guān)鍵部分:
將圖像保存到S3
當(dāng)Notehub將事件路由到Lambda時,我們希望將base64編碼的字符串作為jpeg圖像保存到S3桶中(是的,這意味著您還必須在AWS中設(shè)置S3桶):
然后,我們需要在S3中為該圖像生成一個安全的URL,以便我們可以將其傳遞給Twilio和SendGrid以發(fā)出警報:
最后,我們將使用Twilio和SendGrid sdk來發(fā)送SMS和電子郵件通知。
以下是Twilio所需的代碼:
注意:我正在掩蓋設(shè)置Twilio和SendGrid帳戶的一些要求。要完成這一步,您將需要兩個服務(wù)中的一些密鑰、id和令牌,因此請查看Twilio文檔和SendGrid文檔。
最后,確保部署Lambda函數(shù)并從Configuration選項(xiàng)卡復(fù)制function URL,因?yàn)槟鷮⒃谙乱徊街杏玫剿?
將數(shù)據(jù)從Notehub路由到AWS
我們的最后一步(我保證)是在Notehub中配置一條路由,將事件發(fā)送給Lambda函數(shù)。
返回到Notehub并單擊Routes選項(xiàng)卡。
使用“AWS”選項(xiàng)創(chuàng)建一條新路由:
確保在Type下拉框中選擇Lambda(這是默認(rèn)的),并將函數(shù)URL粘貼到URL字段中:
向下滾動一點(diǎn),確保你的異常。qo選擇Notefile作為唯一將被路由到Lambda函數(shù)的Note/事件(否則,來自您的Notecard的所有事件也將被發(fā)送到AWS):
一定要保存路線,這樣你就萬事通了!
回到你的樹莓派,讓我們再次運(yùn)行Python應(yīng)用程序:
嘗試切換對象的位置,混淆其中的一些,或者以其他方式制造一個“異常”。如果你觀察Pi終端的輸出,你應(yīng)該會看到檢測到的異常:
在一個重要的異常檢測后,在幾秒鐘內(nèi),你會看到這些事件顯示在Notehub和圖像文件將出現(xiàn)在你的S3桶:
最后,您將看到短信和電子郵件通知,讓您知道檢測到異常情況(以及在對象本身上識別異常的有用圖像!):
下一個步驟
我希望你能體驗(yàn)到使用Edge Impulse實(shí)現(xiàn)多模型邊緣人工智能解決方案是多么容易,并將其與Blues, AWS和Twilio + SendGrid連接到云。
今天用你自己的Notecard和noteccarrier Pi Hat開始使用Blues(或者如果你想使用基于stm32的微控制器,可以查看Blues Starter Kit for Cell+WiFi)。
本文編譯自hackster.io