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





