任秋宇,張朝陽,石函冰,王超,郭曉爽,賴曉晨
(大連理工大學軟件學院,遼寧大連 116000)
據公安部統計,截至2022 年3 月底,全國機動車保有量達4.02億輛,其中汽車3.07億輛[1]。然而,機動車保有量迅速增加,致使城市交通狀況不斷惡化[2],國內交通管理系統主要又以固定性采集技術為主,弊端在于難以變更,無法在特殊情況出現時,提供更有針對性的采集和檢測活動。隨著Blockly的成熟、深度學習等技術的快速發展,發展移動性交通檢測設備成為本文研究內容。
關于移動性交通檢測的研究已取得一定階段性成果,如:Coifmana Benjamin 等提出一種基于特征跟蹤的交通參數提取方法,該方法以相機校正為基礎,通過特征跟蹤提取出車流量、車速及車流密度等參數[3]。Jung Young-Kee 等提出利用背景差分的視頻分割方法提取出運動車輛,然后通過基于Kalman 濾波跟蹤運動車輛,獲取車流量和車速等參數等[4]。Kusworo Adi等人在灰度圖像上采用背景差分和形態學方法進行車輛計數[5]。Sundoro H S提出基于高斯混合模型(GMM)的背景差分算法和BLOB檢測的車輛計數和車速檢測系統[6]。
本文基于Google 發布的Blockly 工具技術以及深度學習中圖像識別、分類等技術,并結合飛行器硬件設備,在安卓軟件平臺搭載深度學習模塊,設計開發了一款可視化操控的智能交通檢測飛行器。區別于搖桿手柄控制,可將飛行器的不同位移操控封裝成獨立邏輯單元,結合Blockly 技術實現可視化操控,操作者可將不同功能的“積木塊”進行組合拼接,完成對飛行器基本位移的控制。同時通過深度學習模塊實現對車流量、違章記錄等基本交通檢測的功能,旨在提供一種操作性強、靈活度高、成本較低的飛行器移動交通檢測設備模型,為移動檢測技術納入智能交通檢測體系提供方向。
本系統以Google 的Android平臺應用和飛行器為實施載體,以Blockly 代碼工具為控制技術,利用YOLO模型與卡爾曼濾波的深度學習技術實現交通信息數據的采集分析,實現飛行器飛行控制與車輛擁堵狀況檢測、車輛碰撞與車速違規檢測等移動交通檢測功能。以下是對該技術的設計說明以及實現結果的分析闡述。
本系統以Android 和飛行器為實施載體,以Blockly為控制技術,利用YOLO模型與卡爾曼濾波的深度學習技術實現交通信息數據的采集分析,實現飛行器飛行控制與車輛擁堵狀況檢測、車輛碰撞與車速違規檢測等移動交通檢測功能。
本系統分為飛行器設計部分和Android移動應用開發部分,系統的整體架構如圖1所示。

圖1 系統整體架構
1.2.1 物理結構
按照預先的系統框架設計,采用雙MCU 控制,其中NRF51822 負責無線通信與電源管理,STM32F411 CEU6 負責傳感器數據讀取、數據融合、PID 控制、電機控制、無線通信和USB通信等。
1.2.2 邏輯結構
基于NRF51822,使用2.4GHz 無線通信來實時地通過wifiTask在安卓APP與四軸飛行器之間傳輸信號,stablilzerTask 解析出收到的控制指令后執行PID控制以及PWM輸出控制,進而控制電機,實現控制四軸飛行器的飛行動作,以此來實現手機Blockyly控制功能;并通過攝像頭實時拍攝街道錄像,通過串口將數據傳輸至四軸飛行器,同時通過2.4GHz無線通信實時展現至安卓手機界面,以此來實現實時數據傳輸功能。
1.3.1 Android界面設計
搭建了基于SQLite 數據庫的登錄注冊系統。在注冊時,會新建一個DatabaseHelper,在確保注冊賬戶不重復、兩次輸入密碼一致后,DatabaseHelper 會將數據傳入SQLite數據庫中。在登錄時,如果檢測到賬號密碼均與數據庫比對一致,則會彈出“歡迎”并進入主界面,否則彈出“賬號或密碼錯誤”。
1.3.2 Blockly控制設計
利用Blockly 設計環境開發自定義塊并編寫邏輯代碼,并利用Android 中類將blockly 的HTML 嵌入App,在App中將blockly圖形信號轉換為無線信號,從而操作飛行器的移動飛行。
詳細實現步驟如下:
1) 利用Blockly 的工具臺(Workspace) 和工具倉(Toolbox)實現Blocks 塊的邏輯編程語句的封裝,完成塊的拼接和運行。
利用Blockly Developer Tools 的開發環境進行設計開發,其中塊指令定義(Blockly Instruction Definition)的功能可用于定義原始塊和自定義塊[7]。每個獨立塊的命令都應包含如何使用以及在何處使用的屬性[8],避免無法兼容的塊錯誤組合。如使用Javascript語言編寫塊定義,包括定義內嵌輸入屬性(setNext-Statement)、定義顯示文字(AppendField)等。
編寫各個Blocks塊的算法邏輯,并將每個子塊的代碼以字符串的方式作為塊的輸出。以“向右轉”塊為例,當存在“向右轉”塊時,讀取并修改當前飛行方向direction,并通過SendSocket創建網絡連接,通過IO流將當前direction 數據傳輸到飛行器中,從而將blockly轉化無線信號改變飛行方向。
將上述塊的定義代碼和邏輯代碼嵌入工作臺的HTML文件中。
2)使用Android中的Webview類引入HTML文件,實現在App進行的控制信號發送與接收。
基于此實現邏輯,完成了以下Blocks圖形模塊控制工作臺的實現:
飛行器運行模塊:作為所有子塊的母塊,負責啟動飛行器,承載具體的操控子塊。
移動模塊:提供向前/向后兩種移動方向,并可以設置兩檔飛行速度(快/慢)。
旋轉模塊:提供向左/向右兩種旋轉方向,可以在原有基礎上進行45°/90°的旋轉。
行動次數模塊:通過循環(Loop)邏輯,可以內嵌的移動/旋轉模塊,并控制其運行的重復次數。效果演示如圖2所示。

圖2 Blockly工作臺控制效果實例
1.3.3 Python算法設計
在Android Studio 上引入Chaquo 組件,使得Python深度學習算法可以在手機移動應用上運行。
具體交通檢測步驟如下:
1.3.3.1 車輛擁堵狀況檢測
車輛的計數部分主要使用YOLO 模型和卡爾曼濾波的深度學習技術。車輛計數的核心思想是在視頻的中間設置一條基準線,利用YOLO 模型進行車輛檢測,當檢測到的車輛經過基準線時,計數加一。卡爾曼濾波技術則主要用于目標的追蹤。
深度學習實現思路如下:
1)YOLO模型的引用和視頻處理
文章使用預訓練的模型,引入coco數據集、cfg文件和權重文件。這里,因為需要識別的物體較為簡單,使用預訓練的模型就已經夠用。
首先對視頻逐幀讀取,然后遍歷每一幀圖像,對圖像中的物體進行識別。對于二進制的數據,需要將其轉換為前端可識別的圖片,即轉換為blob格式進行前向傳播。接著將blob送入網絡,從而進行預測,返回目標框邊界和相應的概率。
接下來需要遍歷每個輸出結果,將檢測結果與原圖片進行適配,進而更新目標框和置信度。當然,在此過程中需要進行非極大值抑制,從而選擇出最優目標框。在這里使用cv2.dnn.NMSBoxes函數,該函數可以在目標檢測中篩選置信度低于閾值的,還進行Nms篩選。
在車輛計數模塊,根據在上一幀和當前幀的檢測結果,利用虛擬線圈完成車輛計數。獲取前后兩幀中檢測框的中心點,若前后兩幀檢測框中心點的連線穿過設置的基準線,則進行計數。最后將統計的車輛數返回在視頻上方即可。
2)卡爾曼濾波技術的使用
在目標追蹤過程中使用卡爾曼濾波,對目標的下一步動作做出有根據的猜測。猜測的依據是預測值和觀測值,首先認為預測值和觀測值都符合高斯分布且包含誤差,然后預設預測值的誤差Q和觀測值的誤差R,接著計算得到卡爾曼增益,最后利用卡爾曼增益來綜合預測值和觀測值的結果,得到所要的最優估計,進而合理預測和追蹤目標。
1.3.3.2 車輛碰撞與車速違規檢測
在YOLO 模型和卡爾曼濾波技術的基礎上,文章通過分析每一幀與上一幀車輛的偏移位置,獲取車輛在一段時間內的像素位移,并通過攝像機的標定來建立圖像像素坐標與空間中對應點的世界坐標的映射關系,從而根據車輛的像素位移求出車輛的實際位移,進而計算車輛速度。算法流程如圖3所示。
效果演示如圖4 所示。可以看出,算法正確識別出了共有7輛車,其中有2輛車與其他5輛車行進方向相反。每一輛車沒有像素距離的重疊,所以檢測出沒有碰撞;以左下角的黑色車輛為例,計算得出其實時車速為61.4km/h,并將數據實時懸掛于車輛左上方,并未超速,所以未出現提示。
本系統以Android 和飛行器為實施載體,以Blockly為控制技術,利用YOLO模型與卡爾曼濾波的深度學習技術實現交通信息數據的采集分析,實現飛行器飛行控制與車輛擁堵狀況檢測、車輛碰撞與車速違規檢測等移動交通檢測功能。經過實際測試與使用,手機控制飛行器操作流暢,飛行器實時傳輸數據情況良好,深度學習算法計算后的結果較為準確,具有較好的可應用性與市場前景。

圖3 算法流程

圖4 深度學習檢測效果實例