鄭帥帥 王 剛
(哈爾濱工業(yè)大學機電工程學院 黑龍江 哈爾濱 150001)
隨著人工智能領域的不斷發(fā)展,人們對具備自動駕駛能力的汽車的需求也不斷增強,越來越多的科研機構和企業(yè)投入到相關技術的研發(fā)之中。結構化道路上的車道檢測是高級輔助駕駛系統(tǒng)(ADAS)的重要部分,根據(jù)道路圖像獲取車道線的位置信息,確定車與車道的相對位置,為車道偏離預警系統(tǒng)、車道保持輔助系統(tǒng)提供決策依據(jù)。
目前,車道檢測方法主要分為如下兩大類:
1)基于深度學習的車道檢測算法[1-3]是當前研究熱點,這類算法采用多層卷積神經(jīng)網(wǎng)絡提取車道線特征,具有準確率高、魯棒性強等優(yōu)點,但計算開銷較高,需要較好的GPU資源才能達到實時性的要求。文獻[4]提出一種端到端的車道線檢測算法,實現(xiàn)對道路圖片中的車道線實例分割以及對各車道線像素點的多項式曲線擬合,在NVIDIA 1080 TI顯卡上能達到52幀/s的運行速度。
2)基于傳統(tǒng)方法的車道線檢測算法,主要有圖像特征法[5-7]和幾何模型法[8-9]。圖像特征方法通過分析圖像的底層特征,如車道顏色、邊緣信息和紋理結構等,將圖像分割成若干部分,得到車道線提取的預處理數(shù)據(jù)。文獻[10]結合Hough變換與隨機抽樣一致(RANSAC)算法進行車道檢測,在直車道上具有較好的檢測效果,不過實時性較差,而且在車道彎曲和污損等條件下魯棒性欠佳。幾何模型法主要采用不同的道路模型來實現(xiàn)結構化的車道檢測,如直線模型[11]、多項式模型[12]等。該方法一般分為3個步驟:選擇道路模型,提取車道線像素,擬合車道參數(shù)。文獻[13]利用一對平行的雙曲線模型同時對兩側(cè)車道線進行檢測,在結構化道路上準確率高且具有一定的魯棒性,不過在光照變化、車道線不連續(xù)的情況下達不到預期的檢測效果。
考慮到現(xiàn)有車道檢測算法存在難以權衡實時性及魯棒性等問題,本文提出一種基于滑動窗口與多幀平均的快速車道線檢測方法,在結構化道路上,具有較高的準確率和魯棒性,同時保證了檢測的實時性,能夠為ADAS提供有效的車道線位置信息。
本文算法主要包括圖像預處理、車道線提取和車道線輸出三大部分,如圖1所示。車道預處理主要包括對于選定感興趣區(qū)域(ROI)進行逆透視變換(IPM)[14],將輸入幀轉(zhuǎn)化到鳥瞰圖視角。車道線的提取是提取車道線像素點和得到擬合曲線的過程,首先通過顏色分割得到二進制灰度圖,再根據(jù)像素分布直方圖確定當前幀的車道線起始基點,然后算法判斷上一幀的擬合曲線是否存在:若存在,則使用快速滑動窗口法搜索;若不存在,則出現(xiàn)漏檢狀況,重新使用滑動窗口搜索。最后,采用最小二乘法進行二次多項式曲線擬合。車道線的輸出主要采取多幀平均化,再繪制車道線,并使用逆IPM的方式將處理后的圖像與輸入幀疊加得到輸出幀。
圖1 基于滑動窗口與多幀平均的車道檢測算法
采集的視頻圖像數(shù)據(jù)包含當前車道和其他無關信息,如果直接對其進行處理,將增加檢測算法的復雜性同時降低車道檢測的效率[15]。預處理如圖2所示,(a)為感興趣區(qū)域(ROI),(b)為鳥瞰圖視角。樹木、天空等無用信息均集中在圖像的上半部分,因此只需要處理選定ROI中的路面信息即可,這在很大程度上減少了算法計算量[16]。
(a)ROI (b)鳥瞰圖
本文所用圖像分辨率均為w×h=720×1 280,在多次實驗中,發(fā)現(xiàn)選取h1=0.375h時,進行顏色分割取得的效果最好,即為圖2(a)中水平線下方部分。
由于相機拍攝可以當作針孔成像的過程,因此圖像中在現(xiàn)實世界中原本相互平行的車道線出現(xiàn)了不平行和近寬遠窄的特征。若直接在原始圖像空間中進行車道像素點的曲線擬合,不僅會受到各種噪聲的干擾,而且必須使用高次多項式曲線來擬合車道,這無疑增加了算法的復雜度[17]。為了更好地解決這個問題,在車道檢測領域中廣泛采用逆透視變換(IPM),將相機獲取的圖像轉(zhuǎn)換成鳥瞰圖。在結構化的高速公路上,可以認為道路平坦,因此可采用固定的逆透視變換矩陣H對圖像進行處理。假設圖像坐標系下點的坐標為PI,鳥瞰圖坐標系下點的坐標為PB,則有:
PI=HPB
(1)
(2)
式中:PI=[x,y,1]T;PB=[X,Y,1]T;H中共有8個待求參數(shù),最少需要四組點對求解。本文選擇四對相對應的源點(圖2(a)中梯形的四個頂點)與目標點(圖2(b)中矩形的四個頂點)。最終鳥瞰圖結果如圖2(b)所示,圖像預處理的主要代碼見算法1。
算法1圖像預處理
def pre_process(img,M,mtx,dist):
# 圖像去畸變
img_undistort=cv2.undistort(img,mtx,dist)
# 逆透視變換
h,w=img.shape[:2]
img_unwarp=cv2.warpPerspective(img,M,(w,h),flags=cv2.INTER_LINEAR)
return image
由于在結構化高速公路上,車道線主要由黃、白線組成,使用傳統(tǒng)的梯度閾值與方向閾值聯(lián)合分割的方法,在車道線清晰,無陰影遮擋的情況下,效果較好。但是受光照,外物遮擋的影響較大,經(jīng)常發(fā)生誤檢及漏檢的情況,魯棒性較差。因此,本文采取在顏色空間進行分割的方法,提取黃、白線車道。顏色分割過程如圖3所示。
(a)原圖 (b)顏色分割后
Lab顏色模型基于人顏色的感覺,其中L表示明度,a表示從洋紅色至綠色的范圍,b表示從黃色至藍色的范圍。本文選取b通道,以歸一化閾值(190,255),提取黃色車道,結果如圖3(d)所示。HSL色彩模式是工業(yè)界的一種顏色標準,HSL分別代表色相、飽和度和明度三個顏色通道,經(jīng)過多次實驗,選取L通道,以歸一化的閾值(220,255),提取白色車道,結果如圖3(c)所示。通過式(3)可得到車道線二進制掩模,如圖3(b)所示。
img[((l_thresh==1)|(b_thresh==1)]=1
(3)
顏色分割的主要代碼見算法2。
算法2顏色分割
def segmentation(img_unwarp)
img_LThresh=hls_lthresh(img_unwarp)
img_BThresh=lab_bthresh(img_unwarp)
combined=np.zeros_like(img_BThresh)
combined[(img_LThresh==1)
|(img_BThresh==1)]=1
return combined
在進行車道線的滑動搜索之前,需要確定左右車道線的起始基點,其具體步驟如下:
對于由顏色分割得到的二進制掩模圖,將其沿橫軸方向,累加垂直方向的像素值,公式如下:
(4)
得到如圖4所示的像素分布直方圖,然后計算左右起始基點:
圖4 像素分布直方圖
(5)
式中:arg max函數(shù)用來計算Sum(x)取最大值的x坐標值;w為圖像寬度。
得到車道線的左右起始基點之后,采用縱向滑動窗口搜索的方式提取車道線像素點。為了避免其他因素所造成的二進制顏色分割圖像的干擾,選擇滑動窗口的寬度為車道線寬度的5倍,而滑動窗口高度的選取需要將車道線在鳥瞰圖中的最大斜率考慮在內(nèi),經(jīng)過多次實驗,本文選擇圖像高度的1/10作為滑動窗口的高度值。
滑動窗口搜索算法從左右車道線的兩個基點處,由下到上按矩形窗口搜索,不斷更新車道線基點,直至到達圖像的頂部為止。其具體計算步驟如下:
假設當前第i與i+1窗口的車道線基點坐標分別為(xi,yi)和(xi+1,yi+1),則:
(6)
yi+1=yi-h
(7)
式中:n為第i個窗口包含像素點的個數(shù)。當n=0時,即該窗口未發(fā)現(xiàn)像素點,則下一窗口的基點x坐標值保持不變。該算法的具體效果如圖5所示,其中各個矩形為滑動窗口,左右曲線分別為左右車道線像素點。
圖5 滑動窗口搜索結果
考慮到在鳥瞰圖變換視角下,視頻圖像相鄰兩幀之間車道線的斜率,位置變化很小,因此可以利用前一幀的擬合曲線,來簡化滑動窗口搜索過程,提高計算速度。以擬合的二次曲線為中心線,寬度為滑動窗口寬度,高度為h的搜索區(qū)域,來提取車道線像素點,在該區(qū)域內(nèi)的像素點保留,反之則舍棄。最終輸出效果如圖6所示,圖中兩個較寬區(qū)域為搜索區(qū)域。
圖6 快速滑動窗口結果
對于車道線的曲線擬合問題,主要有隨機抽樣一致(RANSAC)法[18]和最小二乘法兩種算法,前者能夠克服外點的干擾,但算法的實時性較差;后者對于噪聲敏感,處理速度較快??紤]到算法的魯棒性和實時性,以及車道線的擬合效果,本文采用最小二乘法來擬合二次多項式曲線,其具體公式如下:
x=f(y)=ay2+by+c
(8)
式中:a、b、c為最小二乘法的擬合參數(shù)。算法的擬合效果如圖7所示。
圖7 曲線擬合結果
曲線擬合的主要代碼見算法3。
算法3曲線擬合
leftx=nonzerox[left_lane_inds]
lefty=nonzeroy[left_lane_inds]
rightx=nonzerox[right_lane_inds]
righty=nonzeroy[right_lane_inds]
left_fit,right_fit=(None,None)
if len(leftx)!=0:
left_fit=np.polyfit(lefty,leftx,2)
if len(rightx)!=0:
right_fit=np.polyfit(righty,rightx,2)
即使在結構化道路上,依然會出現(xiàn)車道線模糊不清、被遮擋的情況,如果算法不具備車道預測與跟蹤的功能,當出現(xiàn)漏檢、誤檢的情況時,可能會對快速行駛的車輛造成巨大的危害。因此,在車道線輸出部分中,本文采用多幀平均化的方式實現(xiàn)車道預測與跟蹤,增強算法的魯棒性。其具體的實現(xiàn)步驟如下:
在進行曲線擬合之后,首先判斷擬合曲線是否存在,若存在,則將當前幀加入幀列表;若不存在或者幀列表長度超過5,則將列表中的第一幀舍棄,即最舊的數(shù)據(jù)。然后對幀列表中存儲的擬合系數(shù)取平均值,作為當前幀的擬合曲線系數(shù)。最后畫出車道線,利用逆IPM將鳥瞰圖變換到原視角下,與輸入幀疊加得到輸出幀。車道線處理的部分代碼見算法4。
算法4車道線處理
#車道線類中處理車道線的函數(shù)
def add_fit(self,fit,inds):
if fit is not None:
#若擬合曲線存在
self.detected=True
self.px_count=np.count_nonzero(inds)
self.current_fit.append(fit)
#判斷幀列表長度
if len(self.current_fit)>5:
self.current_fit=self.current_fit[
len(self.current_fit)-5:]
#進行平均化處理
self.best_fit=np.average(self.current_fit,axis=0)
else:
#未檢測到車道線
self.detected=False
if len(self.current_fit)>0:
#丟棄最舊的擬合系數(shù)
self.current_fit=self.current_fit[
len(self.current_fit)-1:]
if len(self.current_fit)>0:
self.best_fit=np.average(self.current_fit,axis=0)
為了驗證本文算法的實際效果,基于Python 3.6和PC機進行實驗。PC機的配置為:CPU為Intel Core i7-8550U 1.80 GHz,無GPU加速。本文在Udcity(優(yōu)達學城)自動駕駛數(shù)據(jù)集中的高速公路視頻數(shù)據(jù)上做實驗驗證,主要分為典型道路,污損干擾、遮擋道路兩種。在污損、遮擋道路中,主要包括太陽光光線變化、樹木、橋梁遮擋、路面車道線模糊不清的復雜場景。所用圖像為RGB圖像,均來自于視頻幀,分辨率均為w×h=720×1 280。逆透視變換矩陣H與相機在車輛上安裝位姿有關,求取矩陣H的過程其實就是求解當前相機位姿相對垂直于路面時的位姿變換,其目的就是得到盡可能平行的車道線,便于后續(xù)算法的處理?;瑒哟翱诘拇笮〉倪x擇主要取決于車道的最大斜率和經(jīng)過逆透視變換后車道像素點的寬度,經(jīng)過多次實驗,選擇滑動窗口的寬度為車道線寬度的5倍,而滑動窗口高度的選取需要將車道線在鳥瞰圖中的最大斜率考慮在內(nèi),本文選擇圖像高度的1/10作為滑動窗口的高度值,算法的檢測效果較好。若滑動窗口高度和寬度太大,則會包含更多的干擾像素點并且由于車道斜率的限制可能會導致算法失效;如果窗口高度太小,則會增加計算消耗代價而且不能帶來算法性能的提升;如果窗口寬度太小,則無法檢測出完整車道線,算法失效??紤]到高速公路等結構化道路車道的曲率變化較為平緩,以及準確性和魯棒性的要求,在算法實時處理視頻幀時,建立幀列表并選擇合適的長度來進行多幀平均處理。若幀列表的長度太大,則檢測車道輸出準確性低;反之,算法的魯棒性差,受環(huán)境干擾嚴重。
車道檢測的實驗的結果如表1和圖8所示。本文算法平均每幀檢測耗時僅為12 ms,在典型道路上的檢測正確率達到了98.7%,在存在大量污損、遮擋情況的道路上,準確率也達到了93.8%。
表1 車道線檢測結果
(a)典型車道 (b)光照變化,樹木遮擋
本文提出了一種面向結構化道路的車道檢測算法,通過實驗證明,算法具有良好的正確率、實時性和魯棒性。本文算法可以應用于高速公路等結構化道路場景之中,能夠滿足輔助或者自動駕駛系統(tǒng)對于車道檢測算法的實時性和準確性的要求,可以用于車輛的車道保持、車道預警等基本任務。該算法權衡準確性、實時性及魯棒性,可以彌補自動駕駛領域內(nèi)深度學習算法不具備實時性的缺點,在自動駕駛快速發(fā)展的當下,具有較好的應用前景。本文主要的創(chuàng)新點如下:1)在鳥瞰圖視角下進行雙通道的顏色分割,具有簡單,高效的特點;2)動態(tài)地選擇滑動窗口搜索方式,可降低算法復雜度,提高實時性;3)采用多幀平均化的方式增強算法的魯棒性,減弱漏檢、誤檢對算法的影響。