利用基于視覺(jué)的分散監(jiān)控系統(tǒng),根據(jù)動(dòng)物的存在和路況動(dòng)態(tài)調(diào)整交通規(guī)則
拯救生命,一次一個(gè)傳感器
每年都有無(wú)數(shù)的動(dòng)物在道路上受傷或死亡,無(wú)數(shù)的司機(jī)在這個(gè)過(guò)程中處于危險(xiǎn)之中。隨著交通量的增加和氣候條件變得越來(lái)越不可預(yù)測(cè),傳統(tǒng)的道路安全系統(tǒng)正在努力跟上。對(duì)于這個(gè)問(wèn)題,我的建議是建立一個(gè)分散的道路監(jiān)控系統(tǒng),監(jiān)測(cè)該地區(qū)的動(dòng)物存在情況,以及道路狀況和空氣能見(jiàn)度,并實(shí)時(shí)調(diào)整交通規(guī)則,以提高道路安全,無(wú)論是對(duì)動(dòng)物還是靠近野生動(dòng)物自然棲息地的司機(jī)。
我的建議的動(dòng)態(tài)特性也有助于解決一個(gè)共同的挑戰(zhàn):司機(jī)經(jīng)常忽略的過(guò)于保守的速度限制。與依賴可能無(wú)法反映實(shí)際風(fēng)險(xiǎn)的靜態(tài)標(biāo)志不同,分散式監(jiān)控允許限速和警報(bào)僅在必要時(shí)更改,使其更可信、更有效、更有可能被遵循。
這個(gè)項(xiàng)目的核心是一個(gè)簡(jiǎn)單而有力的目標(biāo):為人類(lèi)和動(dòng)物提供更安全的道路。
一般概念
該項(xiàng)目可分為兩個(gè)部分:主要處理單元/道路標(biāo)志顯示和用于野生動(dòng)物探測(cè)的遠(yuǎn)程跟蹤攝像機(jī)陣列。
在上面的圖像中,你可以看到四個(gè)低功率跟蹤攝像機(jī)監(jiān)視著道路周?chē)膮^(qū)域。這些攝像機(jī)對(duì)一幀進(jìn)行簡(jiǎn)單的二值分類(lèi),以檢測(cè)是否存在某些動(dòng)物。
檢測(cè)到后,將幀發(fā)送到主處理單元(標(biāo)志本身),然后進(jìn)行更穩(wěn)健的分類(lèi)以檢測(cè)動(dòng)物的類(lèi)型。這種分類(lèi)的結(jié)果與其他路況數(shù)據(jù)相結(jié)合,以改變速度限制和相應(yīng)的警告。
顯示
該顯示屏由兩個(gè)64x64像素的LED面板組成,類(lèi)似于普通電子道路標(biāo)志中使用的面板。為了控制它們,我使用Raspberry Pi Pico W作為驅(qū)動(dòng)程序。每個(gè)面板顯示一個(gè)路標(biāo)。
Pico有所有關(guān)于要顯示的標(biāo)志的數(shù)據(jù)預(yù)加載在flash中,作為從GIMP導(dǎo)出的C數(shù)組,主處理單元只發(fā)送有關(guān)哪個(gè)標(biāo)志打開(kāi),哪個(gè)標(biāo)志要顯示的信息,以及在限速標(biāo)志的情況下,有關(guān)限速的信息:
為了提高數(shù)據(jù)的可靠性,這些數(shù)據(jù)通過(guò)MODBUS協(xié)議串行發(fā)送。
使用Python和PyModbus在一個(gè)簡(jiǎn)單的循環(huán)中測(cè)試了顯示代碼:
第一階段動(dòng)物檢測(cè)
第一階段動(dòng)物檢測(cè)在現(xiàn)場(chǎng)進(jìn)行,采用低功耗ESP32-CAM模塊:
它的工作基本上是檢測(cè)動(dòng)物的存在,并提醒主要處理單元。這個(gè)目的并不復(fù)雜,所以不需要過(guò)于復(fù)雜和超大的算法。為了檢測(cè)動(dòng)物,我在Edge Impulse中創(chuàng)建了一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。這個(gè)網(wǎng)絡(luò)只有兩類(lèi):動(dòng)物和非動(dòng)物,它的足跡足夠小,可以很容易地適應(yīng)ESP32-CAM的閃光燈。該網(wǎng)絡(luò)采用320x240灰度圖像:
在實(shí)際硬件上,一旦檢測(cè)到,ESP32-CAM使用MQTT通知主處理單元,并通過(guò)它發(fā)送整個(gè)幀以進(jìn)行進(jìn)一步處理。這個(gè)設(shè)備的主循環(huán)非常簡(jiǎn)單:
同時(shí),設(shè)備也可以通過(guò)MQTT進(jìn)入深度睡眠狀態(tài):
這個(gè)功能對(duì)于節(jié)省電力和防止跟蹤攝像機(jī)在野生動(dòng)物警報(bào)最近已經(jīng)發(fā)布時(shí)發(fā)送檢測(cè)是有用的。
第二階段動(dòng)物分類(lèi)器
主處理單元接收到早期檢測(cè)后,進(jìn)入第二階段分級(jí)機(jī)。該分類(lèi)器更健壯,并使用ResNet架構(gòu)將檢測(cè)分類(lèi)為特定的動(dòng)物。就我而言,我創(chuàng)建了一個(gè)網(wǎng)絡(luò),對(duì)波蘭常見(jiàn)的動(dòng)物進(jìn)行分類(lèi):
添加“empty”類(lèi)來(lái)過(guò)濾掉第一階段的誤報(bào)。
網(wǎng)絡(luò)是使用Keras準(zhǔn)備和訓(xùn)練的。
第二階段分類(lèi)是稍后將描述的更大運(yùn)行時(shí)的一部分。
道路能見(jiàn)度分類(lèi)器
道路能見(jiàn)度也是這個(gè)項(xiàng)目的一個(gè)重要方面。在能見(jiàn)度較低的情況下,跟蹤攝像機(jī)可能返回假陽(yáng)性,或者更糟,產(chǎn)生假陰性。
為了防止這種情況,我們?yōu)檫@個(gè)項(xiàng)目設(shè)計(jì)了一個(gè)額外的網(wǎng)絡(luò)來(lái)估計(jì)道路上的空氣能見(jiàn)度。該網(wǎng)絡(luò)使用了在利用機(jī)場(chǎng)閉路電視片段通過(guò)視頻理解技術(shù)進(jìn)行能見(jiàn)度預(yù)測(cè)中提出的模型:
為了訓(xùn)練這個(gè)網(wǎng)絡(luò),我使用了GRAM道路交通監(jiān)控?cái)?shù)據(jù)集。問(wèn)題是這個(gè)數(shù)據(jù)集不包含任何關(guān)于能見(jiàn)度的數(shù)據(jù),所以我用人工創(chuàng)建的霧來(lái)增強(qiáng)這個(gè)數(shù)據(jù)集。
首先,為了生成逼真的霧,需要深度數(shù)據(jù)。該數(shù)據(jù)集也不包含任何深度數(shù)據(jù),因?yàn)樗皇荂CTV單目攝像機(jī)的簡(jiǎn)單記錄。為了生成深度數(shù)據(jù),我使用了depth - anything:
然后,為了生成霧,對(duì)原始幀進(jìn)行簡(jiǎn)單的卷積:
該網(wǎng)絡(luò)需要以SIFT和光流數(shù)據(jù)的形式額外輸入圖像。這些是使用OpenCV生成的:
生成所有所需的數(shù)據(jù)后,使用Keras準(zhǔn)備和訓(xùn)練網(wǎng)絡(luò)。
這個(gè)網(wǎng)絡(luò)運(yùn)行在Jetson Nano和接收幀從兩個(gè)樹(shù)莓派相機(jī)在立體聲配置運(yùn)行:
該網(wǎng)絡(luò)也是稍后將描述的更大運(yùn)行時(shí)的一部分。
將它們結(jié)合在一起
LED面板使用3D打印支架連接在一起。這些底座也有一個(gè)小空間用于DIN導(dǎo)軌,用于安裝Pico面板驅(qū)動(dòng)器和Jetson Nano上的標(biāo)志本身。
一切都是由降壓轉(zhuǎn)換器在5V供電。
標(biāo)識(shí)本身被安裝在三腳架上進(jìn)行測(cè)試。
運(yùn)行邏輯
邏輯運(yùn)行器在Jetson Nano上作為一系列并行運(yùn)行的多個(gè)Python腳本運(yùn)行:
?MQTT
?第二階段分級(jí)器
?相機(jī)用戶
?空氣能見(jiàn)度分級(jí)器
?運(yùn)行時(shí)邏輯
?LED標(biāo)識(shí)驅(qū)動(dòng)
MQTT Runner只是一個(gè)簡(jiǎn)單的paho-mqtt訂閱者/發(fā)布者,它等待來(lái)自跟蹤攝像機(jī)的消息,并在必要時(shí)使它們進(jìn)入深度睡眠狀態(tài)。從這個(gè)運(yùn)行器接收到的每個(gè)幀都被傳遞到第二階段分類(lèi)器的隊(duì)列。
第二階段分類(lèi)器在自己的獨(dú)立線程中無(wú)限循環(huán)運(yùn)行。在每次循環(huán)迭代期間,它檢查隊(duì)列中是否有新的幀。然后通過(guò)Tensorflow模型處理每個(gè)新幀。然后將推斷的結(jié)果傳遞給運(yùn)行時(shí)邏輯。
Camera Subscriber只是一個(gè)簡(jiǎn)單的類(lèi),它以異步方式從附加的CSI攝像機(jī)獲取新幀。相機(jī)訂戶由空氣能見(jiàn)度分類(lèi)器使用。
空氣能見(jiàn)度分類(lèi)器也在單獨(dú)的線程中運(yùn)行,從CSI攝像機(jī)中獲取幀,對(duì)其進(jìn)行預(yù)處理,生成SIFT和Optical Flow圖像,然后通過(guò)Tensorflow模型進(jìn)行推理。然后將推理的每個(gè)結(jié)果傳遞給運(yùn)行時(shí)邏輯。
運(yùn)行時(shí)邏輯結(jié)合了來(lái)自第二階段分類(lèi)器和空氣能見(jiàn)度分類(lèi)器的數(shù)據(jù)來(lái)估計(jì)安全的道路規(guī)則。數(shù)據(jù)通過(guò)兩個(gè)回調(diào)方法獲得:
然后,運(yùn)行時(shí)邏輯在慢循環(huán)中運(yùn)行,并使用這些值來(lái)更改道路規(guī)則。在這個(gè)項(xiàng)目中,有兩個(gè)標(biāo)志的空間(每個(gè)LED面板一個(gè))。最上面的是一個(gè)警告信號(hào)。這個(gè)星座的邏輯很簡(jiǎn)單:
如果新檢測(cè)到的與當(dāng)前檢測(cè)到的相同,則重置顯示該標(biāo)志的計(jì)時(shí)器,并延長(zhǎng)該標(biāo)志的停留時(shí)間。如果新的檢測(cè)優(yōu)先級(jí)更高,比如野生動(dòng)物比農(nóng)場(chǎng)動(dòng)物更危險(xiǎn),那么立即應(yīng)用野生動(dòng)物警告。計(jì)時(shí)器結(jié)束后,如果有野生動(dòng)物標(biāo)志,如果在野生動(dòng)物警告期間檢測(cè)到農(nóng)場(chǎng)動(dòng)物,則顯示農(nóng)場(chǎng)動(dòng)物警告。否則標(biāo)志會(huì)關(guān)閉。
底部的標(biāo)志是速度限制。它的邏輯是使用霧和動(dòng)物數(shù)據(jù)以安全的方式調(diào)整速度限制:
__process_speed_sign的邏輯與__process_animal_sign非常相似。不同之處在于,如果有必要,它沒(méi)有應(yīng)用更高優(yōu)先級(jí)的警告,而是降低了速度限制。
__lookup_speed的邏輯看起來(lái)有點(diǎn)復(fù)雜,但實(shí)際上它只是一個(gè)簡(jiǎn)單的真值表,它取霧和動(dòng)物存在的值:
從左到右依次為:
S(“小”霧),M(“中”霧),H(“高”霧),A(農(nóng)場(chǎng)動(dòng)物警告),WA(野生動(dòng)物警告)。這個(gè)真值表被最小化并實(shí)現(xiàn)為上述函數(shù)。
Sign Driver只是一個(gè)簡(jiǎn)單的MODBUS客戶端,用于將運(yùn)行時(shí)邏輯的判決寫(xiě)入LED面板驅(qū)動(dòng)程序:
系統(tǒng)內(nèi)運(yùn)行的所有邏輯總結(jié)如下:
結(jié)論
總而言之,在我看來(lái),該系統(tǒng)為道路安全提供了一種更智能、更敏感的方法,并尊重了駕駛員和野生動(dòng)物的需求。通過(guò)正確的實(shí)施,該解決方案可以減少碰撞,挽救生命,并為自然和人類(lèi)活動(dòng)交叉的地區(qū)提供更智能的基礎(chǔ)設(shè)施。
本文編譯自hackster.io





