李曉龍,陳國良,葛凱凱
(武漢理工大學(xué)機電工程學(xué)院,湖北 武漢 430070)
隨著社會的發(fā)展,科技的不斷創(chuàng)新,人民物質(zhì)生活水平的不斷提高,汽車產(chǎn)業(yè)得到了飛速的發(fā)展,小汽車漸漸地走進了千家萬戶。私家車雖然能給人們的出行帶來便捷,但是隨著城鎮(zhèn)化的不斷加快,大量人口涌入城市,導(dǎo)致城市車輛數(shù)量迅速增加,而城市停車位緊缺,導(dǎo)致車輛違?,F(xiàn)象十分嚴重,城市交通混亂,甚至癱瘓[1]。因此必須對車輛進行有效監(jiān)管,才能保證城市交通的正常運行,而監(jiān)管車輛最直接有效的方法就是對車輛抄牌。常用的車輛抄牌還是依靠交警巡邏人工拍照完成,這種人工監(jiān)管車輛的方法費時費力,而且覆蓋面不廣,容易漏檢。
針對上述問題,本文提出一種使用四旋翼無人機進行車輛自主抄牌的方法。首先,在個人電腦上使用卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練出車輛識別模型在圖像中識別車輛位置,并將訓(xùn)練好的模型拷貝到嵌入式開發(fā)板,通過車輛形狀特征估計車輛姿態(tài);然后,通過無人機機載攝像頭參數(shù)和無人機飛行高度計算得到無人機相對于車輛的位姿;接著,編寫腳本程序依次執(zhí)行車輛識別程序、車輛姿態(tài)識別程序、無人機位姿計算程序;最后,將無人機位姿信息發(fā)送給無人機控制器,控制無人機飛行到正對車頭或者車尾的位置,通過云臺調(diào)整攝像頭角度拍攝清晰的車牌圖像。
在攝像頭采集圖像的過程中,一般會存在干擾噪聲,本文使用二維零均值離散高斯函數(shù)[2-3]對攝像頭采集到的圖像進行濾波。航拍攝像頭分辨率較高,本文對攝像頭采集到的圖像進行下采樣。下采樣可以使圖像像素的數(shù)量成指數(shù)倍地減少,從而減小算法的計算量,提升算法的實時性。本文拍攝圖像的分辨率為4000×3000,經(jīng)過下采樣后將圖像縮小到1200×900,有效地加快了算法的計算效率。下采樣后圖像中計算的坐標值乘以縮放因子即可得到原圖像中相應(yīng)的坐標值。
在輸入到卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練前,需要對車輛樣本進行特征提取。特征提取可以有效降低訓(xùn)練輸入的維度,降低模型的復(fù)雜度。圖像識別中最常用的特征是梯度直方圖特征[4-7](Histogram of Oriented Gradient, HOG),因此本文選擇梯度直方圖特征作為訓(xùn)練輸入,將提取到的特征作為模型訓(xùn)練的輸入,圖1為車輛的HOG圖。
圖1 車輛HOG特征
本文共拍攝了131幅圖片,共截取了正樣本1850個;隨機截取不包含車輛的圖像獲得負樣本2500個,正負樣本構(gòu)成訓(xùn)練集。正樣本截取使用軟件LabelImg,在軟件中使用矩形框框出目標,軟件可自動得到目標矩形框在圖像中的左上角和右下角坐標。軟件標注如圖2所示。
圖2 使用LabelImg標注正樣本
訓(xùn)練模型選用目前在目標檢測領(lǐng)域檢測效果最好的卷積神經(jīng)網(wǎng)絡(luò)[8-11](Convolution Neural Network,CNN)。使用卷積神經(jīng)網(wǎng)絡(luò)進行車輛識別模型訓(xùn)練,可以使用Google公司的人工智能平臺Tensorflow來實現(xiàn)。該平臺源碼完全開源,提供完備的API函數(shù),以Python語言為基礎(chǔ),編程簡單,且提供了大量的參考實例,比較適合快速構(gòu)建實踐項目。以下是本文使用Tensorflow進行車輛識別的基本步驟:
1)參考Tensowflow給出的示例腳本將輸入數(shù)據(jù)轉(zhuǎn)換為Tensorflow可識別的TFRecord格式。
2)設(shè)置分類標簽,本文僅識別車輛,設(shè)置類別數(shù)為1,設(shè)置類別標簽為“car”。
3)配置卷積神經(jīng)網(wǎng)絡(luò)參數(shù):設(shè)置批次大小為20個樣本,批次大小不能太大,太大容易導(dǎo)致內(nèi)存溢出,訓(xùn)練過程崩潰;使用指數(shù)衰減的學(xué)習(xí)率,學(xué)習(xí)率初始化為0.004,衰減因子為0.95,衰減步數(shù)為800720;激活函數(shù)選擇函數(shù);正則化方式選擇L2正則化,模型復(fù)雜損失比例設(shè)置為0.00004;訓(xùn)練模型采用Inception-v3模型。
4)運行訓(xùn)練Python腳本文件,訓(xùn)練模型。
本文實驗硬件:CPU AMD A8-7650k,主頻3.4 GB;內(nèi)存8 GB;硬盤240 GB固態(tài)硬盤。實驗軟件:系統(tǒng)Ubuntu16.04;Tensorflow1.4;Python3.5。Tensorflow支持Google云訓(xùn)練和本地訓(xùn)練這2種方式。Google云訓(xùn)練速度快,但是國內(nèi)無法使用,因此選擇本地訓(xùn)練方式。花費大概1天時間訓(xùn)練迭代2000次。訓(xùn)練過程中可以使用Tensorflow的訓(xùn)練監(jiān)測工具TensorBoard對訓(xùn)練過程進行實時監(jiān)控,圖3所示的是TensorBoard中總損失函數(shù)的變化情況,從圖3中可以看出訓(xùn)練是收斂的。圖4是用訓(xùn)練好的模型檢測車輛的效果圖。
圖3 TensorBoard總損失
圖4 CNN檢測車輛效果圖
拍攝100幅車輛航拍圖像(包含384個正樣本)和隨機選取不含車輛樣本的100幅圖像作為測試集。為了高效地評估模型,可以使用式(1)來判斷模型預(yù)測是否正確。滿足式(1)表示預(yù)測的包圍框正確[12]。
(1)
其中,Rd為預(yù)測的包圍框區(qū)域,Rl為標注的包圍框區(qū)域。圖5為CNN模型和可變性彈性部件模型[13-16](Deformable Part Model, DPM)在測試集上的召回率-精確率曲線。
圖5 模型召回率-準確率曲線
分類器性能好的評估標準是讓召回率值增長的同時保持準確率在一個很高的水平。從圖5中可以看出CNN模型的性能要優(yōu)于DPM模型,由召回率-準確率曲線可以計算出CNN的平均準確率(mean Average Precision, mAP)為95.42%,DPM的平均準確率為89.56%。因此后續(xù)實驗本文選擇CNN模型來識別車輛。
航拍車輛會有不同的朝向,為了準確判斷無人機相對于車輛的位置,必須識別出車輛的姿態(tài)。車輛在圖像上一般為近似矩形結(jié)構(gòu),在車身方向?qū)⒋嬖谝粋€梯度主方向,而車身方向與這個邊緣梯度主方向垂直[17]。
1)給定圖像I,它在每個像素處的梯度為Mg(x,y),在整個檢測窗口上計算像素的梯度方向角Og(x,y)。首先計算圖像每個像素3個顏色通道在水平和垂直方向上的一階偏導(dǎo)數(shù),計算3個通道的梯度幅值,如式(2)所示;然后選出3個通道幅值的最大值作為該像素的幅值,如式(3)所示;最后計算車輛的方向角,如式(4)所示。
(2)
(3)
(4)
2)以8×8像素的胞元為單位,分別計算梯度直方圖9個區(qū)域的梯度幅值,如式(5)所示。
gcell(k)=∑Mg(x,y)|Og(x,y)∈Ok,k∈{1,2,…,9}
(5)
其中,Ok為梯度直方圖的第k個區(qū)域。對于包含有車輛的窗口,窗口應(yīng)該存在與車輛方向垂直的梯度主方向。為了驗證這個性質(zhì),可以計算胞元梯度向量gcell的協(xié)方差矩陣Rg(先將gcell正則化),如式(6)所示。
(6)
將協(xié)方差矩陣Rg進行特征值分解,計算其最大特征值dmax,對應(yīng)的就是車輛朝向的方向角,如式(7)所示。
(7)
為了驗證該車輛姿態(tài)估計算法,人工標注了200幅車輛圖像的姿態(tài)角(標注角度離哪個離散角度近就取哪個離散角的值,例如10°~20°取10°,21°~30°取30°),將人工標記結(jié)果與計算結(jié)果進行比較,可以得到表1的結(jié)果。從表1中可以看出估計角度偏差在20°以內(nèi)的正確率為96.5%,表明該車輛姿態(tài)估計算法可行。
表1 車輛姿態(tài)估計結(jié)果
根據(jù)車輛的位置和姿態(tài)可以計算出無人機抄牌的位置,如圖6左所示。設(shè)識別的車輛包圍框的左上頂點坐標為(x1,y1),右下頂點坐標為(x2,y2),估計的車輛姿態(tài)角為α,車輛寬度為d(可以取一個平均值,本文取1.7 m),抄牌位置為距車輛前方和后方的距離為l(本文實驗設(shè)置為5 m),由此可以計算出無人抄牌的位置P1、P2的坐標,如式(8)、式(9)所示。
(8)
(9)
實際拍攝過程中應(yīng)保證車牌在拍攝圖像的中心,即保證攝像頭光軸應(yīng)對準車牌的中心點,如圖6右所示。設(shè)無人機飛行高度為h(本文實驗設(shè)置為5 m),車牌距地面的高度為m(可取一個平均值,本文取0.4 m),車牌的寬度為n(小車一般是藍牌,尺寸為440 mm×140 mm,即n=0.14 m,由此可以計算出攝像頭的俯仰角β,如式(10)所示。
(10)
圖6 抄牌位置和角度計算
本文設(shè)計的無人機車輛違停檢測取證系統(tǒng)結(jié)構(gòu)如圖7所示,主要包括以下幾個部分:攝像頭模塊、嵌入式圖像處理器、無人機和無人機二軸云臺。其中攝像頭模塊用于圖像采集,通過USB線將采集到的圖像數(shù)據(jù)傳輸?shù)角度胧綀D像處理器中,嵌入式處理器中進行車輛識別和車輛姿態(tài)估計的運算,然后將車輛的位置和姿態(tài)信息通過串口傳輸?shù)綗o人機飛控,無人機飛控控制無人機飛行到車輛上方合適位置,嵌入式開發(fā)板向二軸云臺發(fā)送PWM信號,控制二軸云臺使得攝像頭旋轉(zhuǎn)到合適角度拍攝清晰的車輛車牌圖像。
圖7 無人機抄牌系統(tǒng)結(jié)構(gòu)圖
攝像頭選用基于UVC協(xié)議的免驅(qū)USB攝像頭,在Linux系統(tǒng)下可直接讀取攝像頭圖像,無需編寫驅(qū)動程序,如圖8左所示。該攝像頭的基本參數(shù)如下:1/2.3英寸CMOS,有效像素1200萬,分辨率4000×3000,視場角94°,物理焦距3.6 mm。本文使用布蓋的Matlab標定工具箱對攝像頭進行標注,可以得到攝像頭傳感器像元尺寸為1.33 μm×1.33 μm。
嵌入式開發(fā)平臺選用Firefly-RK3288開發(fā)板,如圖8右所示。該開發(fā)板搭載Cortex-A17架構(gòu)處理器,主頻1.8 GHz,4 GB的RAM,32 GB的ROM,可以連接USB攝像頭。開發(fā)板安裝有Unbuntu16.04系統(tǒng),可進行嵌入式應(yīng)用程序開發(fā)。
圖8 攝像頭和嵌入式開發(fā)板
無人機選用大疆經(jīng)緯M100四旋翼無人機,如圖9左所示。該無人機具有低電量警報、低電量自動返航以及遙控信號丟失自動返航等安全保護措施,適合實地飛行。經(jīng)緯M100無人機支持大疆OnBoard-SDK、Mobile-SDK,可以使用SDK提供的API函數(shù)來編寫飛行應(yīng)用程序。
使用2個直流電機構(gòu)成二軸云臺控制攝像頭的拍攝角度,如圖9右所示。云臺電機控制線與嵌入式開發(fā)板I/O口相連,嵌入式開發(fā)板使用PWM信號控制云臺的旋轉(zhuǎn)角度。圖10為無人機自主抄牌平臺。
圖9 無人機和云臺
圖10 無人機自主抄牌平臺
圖11為無人機抄牌的全過程,無人機通過機載攝像頭拍攝地面圖像,使用卷積神經(jīng)網(wǎng)絡(luò)模型識別出圖像中的車輛,根據(jù)車輛的形狀特征識別出車輛的姿態(tài),然后根據(jù)攝像頭的參數(shù)和無人機的飛行高度,計算無人機相對于車輛的位置和姿態(tài),從而得到攝像頭拍攝車牌的合適位置和合適角度,最后將這些信息發(fā)送給無人機,控制無人機飛行到合適的位置,調(diào)整到合適姿態(tài)(正對車輛軸線),通過二軸云臺調(diào)整攝像頭到合適角度拍攝車牌圖像。
圖11 無人機抄牌過程
實際應(yīng)用中,車輛位置姿態(tài)估計不精確和無人機控制精度不夠可能會導(dǎo)致無人機拍攝不全甚至拍攝不到車牌的情況,如圖12所示。
圖12 車牌拍不全拍不到的情況
參考文獻[18-19],通過車牌的顏色特征可以定位車牌的位置,如果檢測到的車牌在拍攝圖像的邊界位置,說明車牌圖像不完整。當檢測到的車牌不完整時,如果不完整的車牌在圖像的左半邊緣區(qū)域(圖12左所示),說明攝像頭需要向左旋轉(zhuǎn)(無人機逆時針做偏航運動);如果不完整的車牌在圖像的右半邊緣區(qū)域(如圖12中所示),說明攝像頭需要向右旋轉(zhuǎn)(無人機做順時針偏航運動);如果不完整的車牌在圖像的上半邊緣區(qū)域,說明攝像頭需要向上調(diào)整(云臺向上做俯仰運動);如果不完整的車牌在圖像的下半邊緣區(qū)域,說明攝像頭需要向下調(diào)整(云臺向下做俯仰運動)。當檢測不到車牌時,如圖12右所示,可上下,左右調(diào)整攝像頭角度搜索車牌圖像,本文云臺角度調(diào)整一次的幅度設(shè)為10°。圖13為攝像頭調(diào)整的過程。
圖13 車牌拍攝不全的云臺調(diào)整
實驗證明按照上述的云臺調(diào)整策略可大幅提高車輛抄牌的成功率,但是抄牌過程中會遇到如圖14的抄牌不全的情況,對車牌后續(xù)的識別造成影響。這種情況主要是部分車輛車牌安裝遮擋的問題,需要飛機飛行到較低的位置才能拍攝到完整的車牌,后續(xù)可以對這種情況下的抄牌位置和角度進行優(yōu)化計算。
本文將圖像處理技術(shù)與無人機技術(shù)相結(jié)合,實現(xiàn)了車輛抄牌的自動化,可以高效地監(jiān)管城市車輛,降低交警的勞動強度,后期可對無人機避障和無人機路徑規(guī)劃進行研究,真正實現(xiàn)無人機抄牌的全自動化。