王新宇
(中國人民公安大學(xué), 北京 100038)
智能化是城市交通信號控制系統(tǒng)的發(fā)展趨勢,前端交通感知設(shè)備是交通信號控制的源泉和數(shù)據(jù)基礎(chǔ)。目前視頻采集設(shè)備是采用最多的交通數(shù)據(jù)采集方式,在實際應(yīng)用中產(chǎn)生了大量的視頻數(shù)據(jù)。但由于缺少前置的計算能力,需要將產(chǎn)生的數(shù)據(jù)傳送至數(shù)據(jù)中心進(jìn)行統(tǒng)一處理,這不但對網(wǎng)絡(luò)造成了沉重負(fù)擔(dān),也影響了交通控制的實時性[1]。隨著大數(shù)據(jù)、云計算、人工智能等信息技術(shù)的發(fā)展,基于邊緣計算與AI計算機視覺的路側(cè)邊緣計算設(shè)備成為了研究熱點。例如張立立等[2]以邊緣計算為基礎(chǔ)、以場景驅(qū)動為要求、以交通控制資源化為支撐、以人工智能為核心提出了新一代的智能交通信號控制總體架構(gòu);高若雯[3]提出了一種交通信號控制場景下的邊緣計算架構(gòu),根據(jù)路網(wǎng)狀態(tài)將其劃分成多個子區(qū)域,設(shè)計路口間的協(xié)作機制,并結(jié)合多智能體強化學(xué)習(xí)來生成各個子區(qū)域的多路口交通信號協(xié)作控制方案;汪煜超[4]以邊緣計算下的相鄰多路口交通信號燈聯(lián)合控制為核心,在云端邊緣合作的工作場景下,提出了基于邊緣節(jié)點的交叉口交通控制算法,通過對輸入量和相位選擇機制的優(yōu)化,改進(jìn)了傳統(tǒng)的模糊控制方法,并將模糊控制與強化學(xué)習(xí)結(jié)合起來,提高了算法的性能。
本文采用人工智能算法并結(jié)合邊緣計算設(shè)備,設(shè)計一套交通信號燈控制裝置,探索人工智能等信息技術(shù)在交通控制中的應(yīng)用,為智慧路口的設(shè)計與應(yīng)用提供參考。
本文設(shè)計的控制裝置基于Yolo v5算法,包括硬件和軟件2大部分。首先對控制裝置的硬件設(shè)備進(jìn)行搭建,并將相應(yīng)的軟件配置到核心硬件中,最后將控制裝置應(yīng)用到交通信號燈的控制中。
Yolo(You Only Look Once)是一種基于深度神經(jīng)網(wǎng)絡(luò)的對象識別和定位算法,運行速度較快,可用于實時系統(tǒng)[5]。目前Yolo已發(fā)展到v5版本,通過引用了馬賽克增強、自適應(yīng)錨框等新特性,使Yolo算法具有很好的目標(biāo)檢測性能。目標(biāo)檢測是目前人工智能中應(yīng)用比較成熟的領(lǐng)域,其算法一般分為2大類別:1) two-stage系列算法,如R-CNN,F(xiàn)ast R-CNN, Faster R-CNN等,這種算法通過先生成待選框(Region Proposal),再進(jìn)行分類獲取類別,回歸獲取位置;2) one-stage系列算法,如Yolo,SSD等,這類算法則直接采用CNN網(wǎng)絡(luò)獲取目標(biāo)和位置[6]。
相對而言,two-stage系列算法精度更高,但速度慢;one-stage系列算法速度快,但準(zhǔn)確率略低。目前,在很多目標(biāo)檢測領(lǐng)域里,如車輛視頻檢測通常只需保證分類的準(zhǔn)確率,但實際中檢測速度比定位精度更重要。one-stage的模型具有天然優(yōu)勢,能極大減輕算力有限邊緣設(shè)備的計算壓力。為此,本文設(shè)計采用one-stage系列的目標(biāo)檢測模型,Yolo是one-stage類中速度優(yōu)化的代表,選擇最新版本Yolo v5模型作為目標(biāo)檢測算法。通過OpenVINO優(yōu)化后,速度還能得到進(jìn)一步提升,可實現(xiàn)對交通信號燈的實時控制[7]。
控制裝置用到的硬件設(shè)備主要有樹莓派、攝像頭、屏幕、LED燈,其構(gòu)成如圖1所示。
1) 樹莓派
樹莓派(RaspberryPi)是控制裝置的核心硬件,承擔(dān)邊緣計算的功能,是一款體積非常小(類似于信用卡大小)的微型計算機[8]。由于Yolo目標(biāo)檢測模型的部署需要強大的內(nèi)存和運行速度,因此本設(shè)計選擇樹莓派4B作為處理器。樹莓派4B比上一代的樹莓派3B+,在處理器速度、多媒體性能、內(nèi)存和連接方面提供了突破性的增長,同時保留了向后兼容性[9]。
圖1 控制裝置硬件構(gòu)成
樹莓派是本設(shè)計裝置的硬件平臺,硬件配置上,需要64G內(nèi)存的TF卡作為硬盤及Type-c接口的電源,軟件系統(tǒng)選擇Windows 10 IoT Core,該系統(tǒng)專用于物聯(lián)網(wǎng)開發(fā),先在官網(wǎng)下載系統(tǒng),并將系統(tǒng)錄刻到TF卡中,然后將TF卡插入樹莓派中進(jìn)行第一次啟動,配置靜態(tài)IP以及相關(guān)環(huán)境。
2) CSI攝像頭
CSI(Camera Serial Interface)攝像頭[10]是一種采用了CSI接口框架的相機設(shè)備。CSI框架由MIPI(Mobile Industry Processor Interface)聯(lián)盟組織于2005年發(fā)布,是一種全新的應(yīng)用于相機和處理器之間的接口框架,利用這種接口進(jìn)行數(shù)據(jù)傳輸靈活、高速[11]。
3) 屏幕與LED燈
屏幕主要用于人機交互。三色LED燈用來模擬交通信號燈。圖1所示控制裝置中相關(guān)設(shè)備的功能是:由樹莓派發(fā)出指令控制三色LED燈的亮滅,實現(xiàn)對交通流的調(diào)控;屏幕顯示車輛信息和交通信號燈色信息,方便人員了解路口情況。
設(shè)計控制裝置主要軟件工具為PyTorch和OpenVINO。
1) PyTorch軟件及特征
PyTorch是一種簡潔且高效快速的深度學(xué)習(xí)框架,可用于Yolo v5模型的訓(xùn)練。Pytorch是torch的python版本,專門針對 GPU 加速的深度神經(jīng)網(wǎng)絡(luò)(DNN)編程。Torch 是一個對多維矩陣數(shù)據(jù)進(jìn)行操作的庫,在機器學(xué)習(xí)和數(shù)學(xué)密集型應(yīng)用方面有廣泛應(yīng)用[12]。
Pytorch的設(shè)計非常簡潔,遵循由tensor→variable(autograd)→nn.Module 三個從低到高的抽象層次[13],編程代碼更易理解,并在快速基礎(chǔ)上保持了較高的靈活性。具體特征如下:(1) Python的優(yōu)先支持策略,這也是Pytorch的主要特征,該框架從細(xì)粒度上直接支持python的訪問;(2) 動態(tài)圖的良好支撐,由于Pytorch直接基于 python API 構(gòu)建的python 接口,使得運行程序時,可動態(tài)構(gòu)建及調(diào)整計算圖,靈活性較高;(3) 易于debug,Pytorch在運行過程中可生成動態(tài)圖,讓開發(fā)人員較為容易地在堆棧跟蹤中找到出現(xiàn)的問題。
2) OpenVINO軟件及工作流程
OpenVINO是英特爾推出的視覺推理加速工具包,為英特爾平臺進(jìn)行模型推理加速[14]。OpenVINO 提供了一整套在Intel計算設(shè)備上完成深度學(xué)習(xí)推理計算的解決方案,它支持 Intel CPU、 GPU、FPGA 和 Movidius 計算棒等多種設(shè)備。OpenVINO 工具包的主要組件是 DLDT(Deep Learning Deployment Toolkit,深度學(xué)習(xí)部署工具包)。
OpenVINO典型工作流程是:(1) 訓(xùn)練一個DLDT支持的Pytorch框架的Yolo v5網(wǎng)絡(luò)模型(Train a Model);(2) 使用模型優(yōu)化器對網(wǎng)絡(luò)模型進(jìn)行編譯和優(yōu)化(Run Model Optimizer),生成Openvino IR(Intermediate Representation,中間表示)格式的網(wǎng)絡(luò)配置文件(.xml 文件)和模型參數(shù)文件(.bin 文件);(3) 調(diào)用Intel 推理引擎進(jìn)行網(wǎng)絡(luò)運算,并將結(jié)果返回給 User Application(應(yīng)用程序)。
經(jīng)過優(yōu)化器的編譯和優(yōu)化以及推理引擎的調(diào)用,就可以對模型進(jìn)行部署。
Yolo v5按照網(wǎng)絡(luò)深度大小和特征圖寬度大小分為 Yolo v5s、 Yolo v5m、Yolo v5l、Yolo v5x模型。本設(shè)計采用Yolo v5s 作為使用模型。相較于上述的其他幾種模型,Yolo v5s的網(wǎng)絡(luò)結(jié)構(gòu)最小、精度低,但速度快。Yolo v5s的結(jié)構(gòu)由輸入端(input)、主干網(wǎng)絡(luò)(BackBone)、Neck、輸出端(prediction)4部分組成,其主要功能分別如下:
1) 輸入端(input)
將圖像按規(guī)定的大小寬度輸入,Yolo v5中對圖像采用了馬賽克數(shù)據(jù)增強的方法進(jìn)行處理,提高對小目標(biāo)的檢測效果,在對數(shù)據(jù)集進(jìn)行訓(xùn)練時,通過自適應(yīng)計算得到最佳錨框值,這有利于提升檢測速度。
2) 主干網(wǎng)絡(luò)(backbone)
在不同圖像細(xì)粒度上聚合并形成圖像特征的卷積神經(jīng)網(wǎng)絡(luò),其中使用了 Focus 和 CSP結(jié)構(gòu)。Focus結(jié)構(gòu)負(fù)責(zé)圖片進(jìn)入主干網(wǎng)絡(luò)前,對圖片進(jìn)行切片操作;CSP結(jié)構(gòu)是對輸入的特征利用兩路的1*1卷積進(jìn)行過渡,這有利于提升網(wǎng)絡(luò)學(xué)習(xí)能力,降低“瓶頸”和內(nèi)存成本。
3) Neck部分
對圖像特征進(jìn)行組合的網(wǎng)絡(luò)層,并將圖像特征傳遞給預(yù)測層。Yolo v5的Neck部分采用了FPN+PAN的結(jié)構(gòu)。FPN將高層的特征信息進(jìn)行上采樣,以一種從上到下的方式進(jìn)行傳遞融合,得到進(jìn)行預(yù)測的特征圖。PAN則是自底向上傳達(dá)強定位特征。并且Yolo v5的Neck結(jié)構(gòu)中,采用了主干網(wǎng)絡(luò)中的CSP結(jié)構(gòu)進(jìn)行卷積操作,加強了網(wǎng)絡(luò)特征融合的能力。
4) 輸出端(prediction)
即預(yù)測層,對圖像特征進(jìn)行預(yù)測,生成邊界框并預(yù)測類別。
1) 試驗平臺
Yolo v5算法要在Pytorch中實現(xiàn)。本設(shè)計所采用平臺為windows10 IoT Core系統(tǒng)、Pycharm集成開發(fā)環(huán)境(IDE)、anaconda Pyhon3.7、torch 1.7.1、cuda11.0、OpenVINO。
2) Yolo v5算法實現(xiàn)的操作流程
(1) 配置環(huán)境:配置虛擬環(huán)境conda create -n Yolo v5 python==3.7進(jìn)入環(huán)境,使用pip安裝相關(guān)模塊和依賴。
(2) 準(zhǔn)備數(shù)據(jù)集:在github上下載Yolo v5模型代碼,并在data目錄下新建Annotations、 images、 ImageSets、 labels 四個文件夾,將準(zhǔn)備好的車輛圖片通過精靈標(biāo)記助手進(jìn)行標(biāo)記。數(shù)據(jù)集標(biāo)記好后,將原始圖片數(shù)據(jù)集放到images文件夾中,將精靈標(biāo)記助手所生成的.xml文件全部放入到Annotations文件夾中[15]。
(3) 構(gòu)建數(shù)據(jù)集:在根目錄下新建makeTxt.py和voc_label.py文件,運行makeTxt.py將數(shù)據(jù)集進(jìn)行分類,按照8∶1∶1隨機分成訓(xùn)練集、驗證集、測試集,在ImagesSets文件夾中存放分類情況[16];運行voc_label.py文件讀取.xml文件中的標(biāo)注信息,并將生成的信息寫入txt文件中存到labels文件里。
(4) 訓(xùn)練模型:配置完成后,執(zhí)行train.py訓(xùn)練文件開始訓(xùn)練。在訓(xùn)練中,可利用tensorboard進(jìn)行可視化訓(xùn)練[17]。訓(xùn)練結(jié)束后會在runs/train/exp下得到weights權(quán)重文件夾,存放了訓(xùn)練300輪得到的最好的權(quán)重,即best.pt以及最后一輪訓(xùn)練得到的權(quán)重,即last.pt文件。
(5) 測試模型:得到訓(xùn)練好的權(quán)重文件后,對模型進(jìn)行測試。首先在根目錄的detect.py中進(jìn)行調(diào)試,修改-weights、-source、-conf-thres、-project參數(shù),執(zhí)行detect.py文件,最終在runs/detect/exp文件夾下得到檢測后的視頻。
(6) 優(yōu)化模型:將訓(xùn)練好的的模型通過 OpenVINO平臺進(jìn)行優(yōu)化。安裝OpenVINO開發(fā)工具,建立虛擬環(huán)境,導(dǎo)出在 Pytorch上訓(xùn)練好的 Yolo v5 模型、修改激活函數(shù),將模型文件.pb格式轉(zhuǎn)化為.onnx 格式,然后再轉(zhuǎn)化成 IR 模型,將out目錄下生成的模型文件傳輸?shù)綐漭缮稀?/p>
本文以兩相位控制的十字路口為例,闡述交通信號燈控制邏輯的設(shè)計過程。假設(shè)東西方向為第一相位,南北方向為第二相位,設(shè)置信號參數(shù)為:信號周期60 s,每個相位的綠燈顯示時間為25 s,黃燈時間為5 s[18]。本設(shè)計為裝置設(shè)置了3種工作模式,分別為正常工作模式、智能工作模式、緊急工作模式[19]。
1) 正常工作模式。該模式時,交通信號燈有A、B、C、D四種工作狀態(tài)。A狀態(tài)東西方向綠燈25 s,南北方向紅燈30 s。當(dāng)東西方向綠燈倒計時為0 s時,A變?yōu)锽狀態(tài),即東西方向變?yōu)辄S燈5 s倒計時[20],南北方向此時為5 s倒計時。當(dāng)?shù)褂嫊r時間減為0 s時,B變?yōu)镃狀態(tài):東西方向進(jìn)入紅燈30 s倒計時,南北方向進(jìn)入綠燈25 s倒計時。當(dāng)南北方向綠燈時間減為0 s時,C狀態(tài)進(jìn)入D狀態(tài):南北方向為5 s黃燈倒計時,東西方向為5 s紅燈倒計時,當(dāng)?shù)褂嫊r時間為0 s時[21],執(zhí)行A狀態(tài)。以此循環(huán)。交通信號燈正常工作模式時,交通信號燈的4種狀態(tài)如圖2所示。
2) 智能工作模式。若某相位開始時,檢測到該相位方向流量超過30 veh/min,則延長5 s。在這段綠燈結(jié)束時間前,如果檢測到車流量依然超過30 veh/min,則繼續(xù)延長5 s,直到累計的綠燈時間達(dá)到預(yù)定的最大綠燈時間40 s,或在綠燈時間內(nèi)該方向流量小于30 veh/min,則進(jìn)入正常工作模式,同時使該相位方向黃燈5 s倒計時,沖突相位方向5 s紅燈倒計時,作為工作模式的過渡。
(a) A狀態(tài) (b) B狀態(tài)
(c) C狀態(tài) (d) D狀態(tài)
3) 緊急工作模式。如果在交叉口物理區(qū)域發(fā)生特殊情況,如發(fā)生交通事故,或有救護(hù)車、警車、消防車等特殊車輛通過,則東西南北方向都禁止通行。如果東西方向有緊急情況,則南北方向禁止通行;如果南北方向有緊急情況,則東西方向禁止通行。
交通信號燈控制邏輯如圖3所示。
交通信號燈控制邏輯的實現(xiàn)是整個控制裝置運行的一部分。整個控制裝置運行包括2部分:一是交通信號燈控制邏輯的實現(xiàn),二是樹莓派控制組件的實現(xiàn)。
1) 交通信號燈控制邏輯的實現(xiàn)
首先進(jìn)行初始化,設(shè)置信號參數(shù),以東西相位為例,根據(jù)交通信號燈的控制邏輯處理車輛信息,得到交通信號燈的切換時間以及亮燈時長,通過http協(xié)議發(fā)送控制命令給樹莓派。
2) 樹莓派控制組件的實現(xiàn)
包括2部分:一是Web API監(jiān)聽。在樹莓派上啟動一個flask服務(wù)(flask是一個非常小的Python Web框架,被稱為微型框架[22])用來監(jiān)聽指定端口,在API接口收到請求后執(zhí)行交通信號燈的亮滅邏輯。二是三色LED燈的控制。對GPIO進(jìn)行初始化,定義GPIO函數(shù),將程序輸出結(jié)果通過GPIO連接LED燈進(jìn)行控制。
圖3 交通信號燈控制邏輯
控制裝置的運行過程為模型訓(xùn)練和裝置運行2個階段。
1) 模型訓(xùn)練階段。通過深度學(xué)習(xí)主流框架 Pytorch軟件平臺,訓(xùn)練Yolo v5模型,通過 OpenVINO 平臺進(jìn)行優(yōu)化和調(diào)用,并將其部署在樹莓派上。
2) 裝置運行階段。將訓(xùn)練、優(yōu)化好的模型搭載在樹莓派主控平臺上,調(diào)用CSI攝像頭對路口車輛信息進(jìn)行實時采集,利用http協(xié)議將信息反饋給樹莓派(http是全稱超文本傳輸協(xié)議,是客戶端和服務(wù)端之間進(jìn)行請求的一個標(biāo)準(zhǔn)),樹莓派通過Web接口接收信息并通過樹莓派的GPIO串口連接LED燈進(jìn)行控制。
基于Yolo v5目標(biāo)檢測算法的交通信號燈智能控制裝置在試驗中進(jìn)行測試,并與傳統(tǒng)的信號控制方法進(jìn)行對比,按雙向車流大小以及是否有特殊車輛通過,分別測試該裝置的正常工作模式、智能工作模式以及緊急工作模式。經(jīng)過數(shù)次測試,得出了不同情況下車輛通過交叉口的平均時間,結(jié)果如表1所示。
表1 控制裝置運行測試結(jié)果 s
由表1可知,在車流量較小的情況下,2種控制方式差別不大,但是某相位車流量較大以及特殊車輛通過時,該裝置的控制效果相較于傳統(tǒng)的信號控制有所改善。
1) 將控制裝置接通電源,即開始運行,系統(tǒng)首先初始化,此時屏幕上顯示出主界面;2) 根據(jù)交叉口歷史數(shù)據(jù),設(shè)置信號控制基本參數(shù);3) 點擊主界面中的起動按鈕,系統(tǒng)即進(jìn)入工作模式,此時裝置中的攝像頭處于工作狀態(tài);4) 當(dāng)有車輛經(jīng)過時,采集車輛信息,并通過部署在樹莓派上的Yolo算法,采集信息進(jìn)行分析,將車流量、車速等數(shù)據(jù)顯示在主屏幕上,同時根據(jù)車流量的變化,實時調(diào)整綠燈時間,進(jìn)而實現(xiàn)對路口交通流的控制。
1) 利用Yolo v5算法的實時性和樹莓派的可操作性,設(shè)計了一套交通信號燈控制裝置,實現(xiàn)對交通信號燈的實時控制。
2) 該控制裝置有一定的學(xué)習(xí)和分析能力,可對路口的實時數(shù)據(jù)進(jìn)行采集并反饋給樹莓派。樹莓派中的交通信號燈控制算法根據(jù)車輛信息進(jìn)行運算,并通過http協(xié)議來控制交通信號燈,可實現(xiàn)交通信號燈綠燈時間的智能化調(diào)節(jié),同時把車輛信息和交通信號燈時間顯示在屏幕上,方便人機交互。
3) 設(shè)計的控制裝置,具有相對獨立的模塊化的交通信號燈控制模型。在訓(xùn)練數(shù)據(jù)準(zhǔn)備與預(yù)處理、模型訓(xùn)練、模型驗證等方面功能獨立,自成體系,利于安裝和后期運維。
4) 利用深度學(xué)習(xí)Yolo v5算法可實現(xiàn)車輛的快速檢測,其硬件成本較低,性價比高。
5) 可根據(jù)交通復(fù)雜程度,對控制裝置進(jìn)行升級,或增加服務(wù)內(nèi)容。