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





