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





