許小偉,余雪靖,嚴(yán)運兵,陳乾坤,李浩東
(武漢科技大學(xué) 汽車與交通工程學(xué)院,湖北 武漢 430065)
隨著汽車保有量的不斷增加,交通擁擠,事故頻發(fā),尤其是車輛追尾事故造成了巨大的交通隱患。因此,車輛識別與距離估計對于智能駕駛安全性具有重要意義[1]。機(jī)器視覺是一種利用攝像機(jī)對物體進(jìn)行檢測和識別[2-5]的方法,其中,單目視覺經(jīng)濟(jì)性較好,算法柔性大、適應(yīng)性強(qiáng),完全可以滿足測距精度要求[6],因此,本文選用單目視覺進(jìn)行測距研究。
機(jī)器視覺中,包括基于傳統(tǒng)特征和基于深度學(xué)習(xí)的目標(biāo)識別方法。傳統(tǒng)的目標(biāo)識別與檢測方法容易受到光照、姿態(tài)等的影響,識別率較低[7]?;谏疃葘W(xué)習(xí)的目標(biāo)檢測與識別方法分為單步法和兩步法。兩步法中的第一步需要生成候選目標(biāo)區(qū)域,第二步采用卷積神經(jīng)網(wǎng)絡(luò)確定目標(biāo)的類別和位置[8-11],兩步法實現(xiàn)了較高的目標(biāo)檢測與識別精度,但是實時性較差。單步法既考慮目標(biāo)檢測精度,又考慮實時性的問題,因此在實時檢測方面得到了更廣泛的應(yīng)用。YOLO系列[12-14]把目標(biāo)檢測作為在整張圖像上的回歸問題,但是較難檢測相鄰較近的目標(biāo)。目標(biāo)檢測(single shot multibox detector,SSD)算法[15]是利用卷積對不同尺度特征圖中的目標(biāo)進(jìn)行預(yù)測,再將預(yù)測結(jié)果結(jié)合起來做目標(biāo)檢測與識別,該方法既有較好的實時性,又滿足了目標(biāo)檢測精度要求,但是對小目標(biāo)的檢測效果不太好,需要對SSD算法進(jìn)行改進(jìn)。因此,本文提出了一種基于改進(jìn)SSD的單目視覺測距算法。
SSD算法是一種單步法,即直接預(yù)測目標(biāo)類別和邊界框的多目標(biāo)檢測算法。與兩步法中的Faster R-CNN相比,SSD算法沒有生成目標(biāo)區(qū)域的過程,極大地提升了運行速度。SSD算法的主網(wǎng)絡(luò)采用VGG16[16],并且將最后兩個全連接層改成卷積層,增加4個卷積層構(gòu)造網(wǎng)絡(luò)結(jié)構(gòu)。針對不同大小的目標(biāo)檢測,SSD算法利用不同卷積層的特征圖進(jìn)行綜合,對不同大小的目標(biāo)進(jìn)行預(yù)測。SSD算法的網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
圖1 SSD算法的網(wǎng)絡(luò)結(jié)構(gòu)圖
由上述分析可知:SSD算法中用作目標(biāo)檢測的特征圖分辨率過小,會導(dǎo)致不能準(zhǔn)確且魯棒地檢測較小的目標(biāo);但是特征圖分辨率也不能過大,因為特征圖分辨率過大,會導(dǎo)致在同一特征圖上的默認(rèn)邊界框數(shù)量過多,實時性較差。因此,在SSD算法原有6個特征層的基礎(chǔ)上,其中第3層卷積層由3次卷積操作組成,本文添加第3個卷積層完成第3次卷積操作后的特征圖,即第3_3特征層作為第1個目標(biāo)檢測的特征層。則作為目標(biāo)檢測的特征層及其分辨率分別為:第3_3特征層75 pixels×75 pixels,第4_3特征層38 pixels×38 pixels,第7特征層19 pixels×19 pixels,第8_2特征層10 pixels×10 pixels,第9_2特征層5 pixels×5 pixels,第10_2特征層3 pixels×3 pixels,第11_2特征層1 pixels×1 pixels。原SSD算法在不同的特征層上默認(rèn)邊界框尺寸和高寬比都不同,第4_3特征層、第10_2特征層和第11_4特征層使用了4個高寬比,在其他特征層上都使用了6個高寬比,一共產(chǎn)生了8 732個默認(rèn)邊界框。而本文對每一層的默認(rèn)邊界框的尺寸和高寬比進(jìn)行調(diào)整以達(dá)到較好的車輛檢測效果,改進(jìn)的默認(rèn)邊界框在7個目標(biāo)檢測的特征層上的總量為9 505個。其默認(rèn)邊界框尺寸和高寬比如表1所示。
表1 默認(rèn)邊界框尺寸及高寬比
默認(rèn)邊界框在同一個特征層有不同的高寬比,在不同的特征層有不同的大小,因此基本可以覆蓋輸入圖像中的各種形狀和大小的車輛目標(biāo)。
采用兩個不同的3 pixels×3 pixels的卷積核對從第7卷積層到第11卷積層中5種不同的輸出特征圖進(jìn)行卷積,一個輸出分類用的置信度,每個默認(rèn)邊界框生成2個類別的置信度(車輛和背景);一個輸出回歸用的位置損失,每個默認(rèn)框生成4個坐標(biāo)值(x,y,w,h)。最后,將前面3個計算結(jié)果分別合并然后傳給損失層。其損失函數(shù)為:
(1)
其中:Lconf為相應(yīng)的預(yù)測框與目標(biāo)類別的置信度損失;Lloc為相應(yīng)的位置回歸損失;N為匹配到默認(rèn)框的預(yù)測框的數(shù)量;α為用于調(diào)整置信度損失和位置損失之間的比例;g為真實框;l為模型輸出的預(yù)測框;x為預(yù)測框是否匹配到某個類別的真實框,分別用0和1表示。采用SSD算法對圖像中的車輛進(jìn)行目標(biāo)識別,返回默認(rèn)框生成的4個坐標(biāo)值(x,y,w,h)。則檢測框4個頂點坐標(biāo)為:
(2)
利用改進(jìn)SSD算法檢測車輛位置,并取檢測框下邊緣的中點作為車輛的像素坐標(biāo),利用該像素坐標(biāo)測量車輛的距離。
圖2為單目測距示意圖。如圖2所示,電荷耦合器件(charge coupled device,CCD)攝像機(jī)的有效焦距為f;CCD攝像機(jī)的俯仰角為α;CCD攝像機(jī)的鏡頭中心到路面的高度為h;光軸與像平面的交點為(x0,y0);像平面坐標(biāo)系的原點一般取(0,0);路面上一點P在像平面上的投影坐標(biāo)為(x,y)。點P是檢測出的前方車輛下部邊框的中心點,根據(jù)幾何關(guān)系得到點P與鏡頭中心的水平距離d的計算公式為:
d=h/tan{α+arctan[(y0-y)/f]},
(3)
其中:h和α可直接測量得到,而f和y需要攝像機(jī)標(biāo)定得到。y是目標(biāo)點在CCD像平面上的投影坐標(biāo)在y軸方向上的分量,稱為像平面坐標(biāo),mm。通過圖像處理只能獲得目標(biāo)點在計算機(jī)內(nèi)存中的坐標(biāo),稱為幀存坐標(biāo)(u,v),單位是像素(pixels)。幀存坐標(biāo)和投影坐標(biāo)變換見圖3。因此,要將計算機(jī)內(nèi)存中的幀存坐標(biāo)轉(zhuǎn)換到像平面坐標(biāo)系統(tǒng)中。
圖2 單目測距示意圖
圖3 幀存坐標(biāo)和投影坐標(biāo)變換
O(u0,v0)是CCD攝像機(jī)光軸與像平面交點(x0,y0)的幀存坐標(biāo),該點一般位于幀存圖像的中心處,但由于攝像機(jī)制作的原因,也會有些偏離,因此需要對其進(jìn)行標(biāo)定。設(shè)幀存中的一個像素對應(yīng)像平面在x軸與y軸方向上的物理尺寸分別為dx、dy,則有變換關(guān)系:
(4)
v可由圖像處理獲得,計算y需要預(yù)先確定v0和dy的值。因此,為計算式(2),攝像機(jī)參數(shù)f、v0、dy必不可少,這就需要進(jìn)行攝像機(jī)參數(shù)的標(biāo)定。
由式(4)可得:
y=(v-v0)×dy,
(5)
其中:v可以由圖像處理得到。
x0=y0=0。
(6)
將式(5)和式(6)代入式(3),可得:
d=h/tan(α+arctan[-(v-v0)/ay])。
(7)
因此,求內(nèi)部參數(shù)時只需求出有效焦距f和像素對應(yīng)的物理尺寸dy的比值ay。
攝像機(jī)標(biāo)定的目的是實現(xiàn)圖像坐標(biāo)系與世界坐標(biāo)系之間的轉(zhuǎn)化,其轉(zhuǎn)化方式可以以內(nèi)參矩陣和外參矩陣來表示。為了方便、快捷且安全地進(jìn)行測距實驗,本文采用仿真軟件PreScan搭建測試場景,采用攝像頭暗箱和PreScan搭建的硬件在環(huán)平臺實現(xiàn)測距工作,其攝像頭的安裝方式如圖4所示。
圖4 攝像頭的安裝方式
在PreScan軟件中設(shè)置主車攝像頭與水平面夾角為10°,即α= 10°,安裝高度為1.5 m。將場景圖像投影到攝像頭暗箱顯示器上,其圖像分辨率為2 048 pixels×1 536 pixels,將攝像頭水平放置,并且調(diào)整攝像頭高度和左右位置,使攝像頭光心對準(zhǔn)屏幕中心,并調(diào)整攝像頭到顯示器的距離,使得攝像頭采集的圖像剛好完全包括顯示器中的畫面,PreScan軟件中相機(jī)設(shè)置如圖5所示。
圖5 PreScan軟件中相機(jī)設(shè)置
在車輛運動過程中,攝像頭外參會發(fā)生變化,但是本文采用的測距方法只需要知道攝像頭內(nèi)參,因此在車輛運動過程中不需要考慮攝像頭位置變化導(dǎo)致需要重復(fù)標(biāo)定的問題[17]。采用MATLAB軟件的工具箱標(biāo)定,其中:ay=2 467.10,v0=749.57,h=1 500,α=10,其距離d可由式(7)計算。
本實驗主要在PC端完成,PC主要配置:CPU為Intel i7-8750h,主頻為2.20 GHz,顯卡為NVIDIA GeForce GTX,操作系統(tǒng)為Windows10。采用CCD攝像機(jī),算法實現(xiàn)軟件環(huán)境為pycharm1.7。為了檢驗算法效果,本文目標(biāo)檢測選取VOC 2007數(shù)據(jù)集中汽車和非汽車的圖像數(shù)據(jù)進(jìn)行模型的訓(xùn)練、驗證以及測試。使用VOC 2007數(shù)據(jù)集分別訓(xùn)練SSD算法和改進(jìn)的SSD算法,分別迭代120 000輪。將SSD算法和本文改進(jìn)的SSD算法做對比,結(jié)果通過平均精度均值(檢測出的目標(biāo)中正確的目標(biāo)所占的比率)和圖片傳輸速率(每秒鐘所處理的圖像幀數(shù))來判斷算法的改進(jìn)效果。
由于本文主要關(guān)注對中小目標(biāo)的檢測,因此在同樣的訓(xùn)練集、驗證集和測試集的條件下對上述模型的檢測結(jié)果進(jìn)行比較,使用評價標(biāo)準(zhǔn)中的平均精度均值來衡量檢測的效果。當(dāng)網(wǎng)絡(luò)閾值(即預(yù)測框與真實框的交并比)設(shè)置為0.5時,對比不同模型中等車輛目標(biāo)的檢測精度,結(jié)果如表2所示。當(dāng)網(wǎng)絡(luò)閾值設(shè)置為0.9時, 對比不同模型小車輛目標(biāo)的檢測精度,結(jié)果如表3所示。
表2 中等車輛目標(biāo)檢測精度對比
表3 小車輛目標(biāo)檢測精度對比
由表2和表3可知:當(dāng)網(wǎng)絡(luò)閾值設(shè)置為0.5時,對中等車輛目標(biāo)進(jìn)行檢測,改進(jìn)的SSD算法檢測精度比SSD算法的檢測精度高0.6%;而當(dāng)網(wǎng)絡(luò)閾值設(shè)置為0.9時,改進(jìn)的SSD算法對小車輛目標(biāo)的檢測精度比SSD算法的檢測精度高6.6%,說明本文算法對小目標(biāo)的檢測精度有較為明顯的提升,雖然檢測速度有所下降,但仍然滿足實時性要求。
為了進(jìn)一步檢測改進(jìn)算法效果,采集較為復(fù)雜環(huán)境下的圖像,分別采用SSD算法與改進(jìn)的SSD算法進(jìn)行車輛目標(biāo)檢測,結(jié)果如圖6所示。
(a) SSD算法車輛檢測效果
(b) 改進(jìn)的SSD算法車輛檢測效果
圖6 SSD算法和改進(jìn)的SSD算法車輛檢測對比
從圖6a可以看出:SSD算法對于近處的目標(biāo)檢測效果較好,對于遠(yuǎn)處較小的車輛目標(biāo)檢測效果較差。從圖6b可以看出:改進(jìn)后的SSD算法對于近處和遠(yuǎn)處的車輛檢測效果均較好,改進(jìn)后的SSD算法對于SSD算法有一定的改進(jìn)。
為了檢測改進(jìn)的SSD算法能夠檢測到的車輛目標(biāo)的距離,本文采用PreScan場景仿真軟件搭建測試場景,分別將前方車輛放置在距離本車10~80 m距離,經(jīng)檢測得出:改進(jìn)的SSD算法可以準(zhǔn)確地檢測出在0~70 m距離的車輛目標(biāo)。采用改進(jìn)SSD算法的部分目標(biāo)檢測圖如圖7所示。
(a) 距離本車20 m
(b) 距離本車40 m
(c) 距離本車60 m
(d) 距離本車80 m
圖7 改進(jìn)SSD算法的部分目標(biāo)檢測圖
表4 測距計算結(jié)果
采用式(7)對前方車輛目標(biāo)測距,計算結(jié)果如表4所示。
由表4可知:目標(biāo)與攝像機(jī)距離在70 m以內(nèi)時,本文提出的算法對目標(biāo)的定位誤差率在2%以內(nèi)。
本文提出一種基于改進(jìn)SSD算法的虛擬場景的車輛檢測與測距算法,并且借助仿真軟件PreScan驗證了該測距算法的效果。當(dāng)網(wǎng)絡(luò)閾值設(shè)置為0.9時,改進(jìn)的SSD算法對小車輛目標(biāo)的檢測精度提升了6.6%,且可以檢測到距離主車70 m以內(nèi)的目標(biāo);通過PreScan硬件在環(huán)平臺測試前方車輛距離為70 m以內(nèi)時,可以達(dá)到2%的定位精度,滿足實際要求。