柏俊波,周濤琪,柏俊杰
(1.上海易咖智車科技有限公司,上海 嘉定 201800;2.重慶科技學院電氣工程學院,重慶 400010)
司機在疲勞狀態下駕駛汽車將極大增加發生交通事故的風險。統計顯示,2020 年全年中國交通事故發生數量為1 313 606起,事故造成61 703死亡,250 723人受傷,帶來的經濟損失[1]超過244 000 萬元人民幣。由疲勞駕駛導致的交通事故數量占事故總量[2]的25%以上,事故死亡率達到83%。因此,出于對駕駛員及行人安全、社會和諧穩定、國家經濟發展等一系列問題的考慮,準確有效的疲勞駕駛檢測系統的研發已經成為當前交通安全領域的研究重點。當前針對疲勞駕駛的檢測方法主要包含三類:基于司機生理參數的檢測方法、基于車輛行為的檢測方法和基于司機面部特征的檢測方法[3]。
基于司機生理參數的疲勞駕駛檢測方法主要通過腦電、心電等信號對疲勞狀態進行評價,此類方法對生理信號的分類效果較好,疲勞檢測精度較高,但是信號采集和分析設備體積過大,需要司機全程佩戴,容易影響司機正常駕車行為[4-5]。
為了克服基于生理參數的疲勞駕駛檢測方法具有侵入性的問題,一部分學者通過車輛行為判斷司機疲勞狀態。此類方法通過方向盤數據、車道偏移量等特征對司機疲勞狀態做出間接評價。基于車輛行為的疲勞駕駛檢測方法對司機干擾較小,但不能直接反映司機的真實狀態,檢測精度不高,同時,此類方法具有滯后性,實時性不好[6-7]。
相比于以上兩類方法,基于司機面部特征的疲勞駕駛檢測方法具備非接觸、效果好等優勢,通過相機實時采集司機面部特征,可以對司機狀態進行直接的客觀評價。傳統的基于駕駛員面部特征的檢測方法檢測效果較好,但需要借助大量圖像處理算法和機器學習算法,大量且復雜的算法會影響檢測系統的實時性,導致大多數此類方法需要借助PC 機才能完成疲勞狀態的判斷及預警,不利于在駕駛室環境大量部署和推廣[8-10]。
算法復雜、設備龐大制約著機器視覺算法在疲勞駕駛檢測領域的發展,為了解決這一問題,部分學者嘗試基于嵌入式設備實現司機狀態的實時監測。文獻[11]在汽車儀表盤內安裝微型紅外攝像機,將拍攝到的駕駛員面部特征利用包含FPGA 的嵌入式設備進行處理,用以對駕駛員的精神狀態進行評估,系統能夠在720.576 ms 的時間內處理16×7 幀實時檢測畫面,檢測效率大大提升。文獻[12]基于FPGA 平臺,開發出基于Sobel 邊緣檢測算子和差分法相結合的疲勞駕駛檢測系統,系統通過識別人眼輪廓,計算眨眼頻率對駕駛員疲勞狀態進行檢測,系統結構采用流水線設計,大幅提升了疲勞駕駛檢測速度。
綜上所述,為了提高疲勞駕駛檢測系統的集成度和實時性,同時面向狹小、復雜的駕駛環境,本文基于FPGA硬件平臺,設計了一種通過司機眨眼頻率判斷其是否疲勞的檢測方法,該方法具有響應速度快、檢測精度高、體積小等特點,滿足昏暗、顛簸等復雜情形下的檢測要求。
眨眼率常被作為評價司機疲勞駕駛的重要指標之一,因此,在復雜的駕駛環境正確計算司機眨眼頻率是本文的研究重點。本文首先改進YCbCr 人臉檢測算法,提高人臉區域分割精確度;再在人臉范圍之內跟蹤司機雙眼位置;最后利用幀差法檢測眨眼動作并計算眨眼頻率。算法設計流程如圖1 所示。

圖1 算法設計流程圖
在FPGA 平臺上開發設計疲勞駕駛檢測系統,首先要分割人臉區域,在人臉區域范圍內進行眼部區域分割和眨眼動作檢測可以減小系統計算量,節省開發板資源。本文首先采用區域長寬比改進YCbCr 算法,框選出準確、完整的人臉后,提取每一幀圖像中人臉框對應的4 個像素點的像素坐標值,為人眼跟蹤奠定基礎。
1.1.1 基于區域長寬比的YCbCr 人臉區域分割算法
YCbCr 顏色空間將圖像分解為亮度信息(Y)和色度信息(Cb、Cr),根據人體膚色的色度分布規律實現人臉分割[13]。不同年齡和性別人群,即使人種不同,其膚色的色度分量都會集中在特定范圍之內,因此,只需要根據膚色的Cb、Cr 分量值,而不用考慮背景和環境就能很好地分割人臉區域。此外,YCbCr 算法邏輯簡單,易于實現,能夠提高FPGA 芯片對圖像的采樣率,因此,本文探究基于YCbCr 顏色空間的人臉區域分割算法,算法基本原理如式(1)所示:
式中將Y 分量的常數置0 可削弱圖像亮度的影響。統計人體膚色Cb、Cr 的分布規律后,將人臉的色度分量定義在式(2)和式(3)的范圍內。
YCbCr 算法是對膚色區域的簡單分割,當圖像中出現非人臉膚色區域時,該算法會產生誤檢。為了提高系統檢測精度,本文采用區域長寬比對YCbCr 算法進行改進,改進的原理是計算檢測出的膚色區域最大長寬比,將滿足比例要求的區域判定為人臉區域,反之,則為非人臉區域。計算100 張駕駛場景中人臉最大長寬比(Ratio)后,本文將人臉長寬比判定閾值設定為:
駕駛環境下司機面部畫面相對穩定,通過公式(4)計算后可排除非人臉膚色區域的干擾,算法的優化過程如圖2 所示。

圖2 YCbCr 算法優化過程
1.1.2 人臉區域分割效果
經過圖2 所示的處理后,人臉區域像素值為1,非人臉區域像素值為0,達到了人臉分割的目的。在此基礎上,通過搜索畫面中灰度為1 的像素坐標點極值就可框選出人臉。優化后的YCbCr 算法在實車環境下檢測人臉區域的效果如圖3 所示。

圖3 優化后YCbCr 算法人臉檢測效果

圖4 頭部位移和雙眼中心點位移

圖5 人眼中心位移與頭部位移的關系
數據擬合后得到以及之間的關系如式(5)和式(6)所示:
式中:Δxe表示待測眼睛橫向位移;Δye表示待測眼睛縱向位移;Δxh表示利用幀差法計算得到的相鄰兩幀圖像的頭部橫向位移;Δyh表示利用幀差法計算得到的相鄰兩幀圖像的頭部縱向位移。通過式(5)和式(6)的運算,檢測范圍進一步壓縮到人眼區域,過濾了膚色區域內的運動噪聲,提高了檢測精度。然而,眼睛周圍的鏡框、眉毛等微小變化會使圖像出現空洞,因此,在對兩張差分圖像進行與操作時,還需要對圖像進行腐蝕膨脹操作,去除圖像中的尖銳空白點。
在人眼區域范圍內通過幀差法檢測運動目標的像素變化即可檢測眨眼動作[15]。幀差法檢測眨眼動作的優勢在于:選取前一幀或前幾幀圖像作為標準背景圖像,將當前幀圖像與前一幀圖像做差分運算可以解決標準背景圖像實時更新和重建的難題。為了避免系統檢測過靈敏,本文采用三幀差算法,算法原理如圖6所示。

圖6 三幀差法流程
假設第k- 2、k- 1、k張圖片的圖像函數分別為Fk-2(x,y)、Fk-1(x,y)、Fk(x,y),則計算得到的差分圖函數如式(7)和式(8)所示:
式中:Dk(x,y)、Dk-1(x,y)分別為兩張差分圖像的圖像函數,將兩張差分圖進行與運算后得到的運動目標圖像函數如式(9)所示:
眨眼動作檢測效果如圖7 所示,本文采用的眨眼動作檢測算法將運動目標的檢測區域集中在人眼周圍,不統計非眨眼動作帶來的像素變化,同時過濾了頭發、眉毛等噪聲干擾,提高檢測精度的同時,降低了誤檢率。

圖7 眨眼動作檢測
華盛頓大學John A. Stren 等人在其研究中指出,正常情況下,司機眨眼頻率在12~17 之間,隨著駕駛時長增加和疲勞程度的增長,眨眼率[16]最高達到了每分鐘40 次。本文結合文獻和臺灣國立中央大學NTHUDDD 疲勞數據集實測數據,將眨眼頻率fe與司機狀態之間的關系用公式(10)表示:
系統硬件設計遵循從頂層到底層再到頂層的設計思路[17]:首先根據系統設計要求確定頂層設計方案,然后將頂層方案分解為PLL、ov5640_cfg、processor 等多個功能子模塊,各個子模塊功能實現后聯合調試運行,最終達到設計要求。
硬件部分主要包含攝像頭配置和驅動模塊、數據存儲模塊、疲勞駕駛檢測模塊以及VGA 顯示模塊,PLL 時鐘模塊產生4 路時鐘信號分別為各個功能模塊供電。疲勞駕駛檢測系統頂層設計如圖8 所示。

圖8 疲勞駕駛檢測系統頂層模塊設計
各個功能模塊描述如表1 所示。
圖8 中:processor 模塊是本項目的核心模塊,其主要功能是進行人臉分割、圖像預處理、人眼跟蹤、眨眼動作檢測等。其中:YCbCr 和pretreatment 模塊功能為圖像預處理和人臉分割;binarization 模塊功能為圖像二值化;Erosion 和Dilation 模塊是圖像形態學處理模塊,主要功能是圖像腐蝕和膨脹;Frame Difference 為幀差模塊,主要功能是檢測眨眼動作。processor 檢測到眨眼動作后,發送img_current/post 信號到數據存儲驅動單元,完成眨眼次數的統計和眨眼的計算。
由于capture 輸出圖像為16 位RGB565 格式,而用于圖像處理的輸入圖像為24 位RGB888 格式,因此,需要先將RGB565 轉化為RGB888。將公式(1)中每個分量前的小數系數乘以256,然后向右位移8 位,完成乘法運算;然后將計算得到的數據進行相加,分別得到Y、Cb、Cr 分量數值,完成圖像由RGB888 格式到YCbCr 格式的轉換。
統計符合人體膚色的色度分量并計算區域長寬比Ratio1…Ration,將符合1.20 ≤Ratio ≤1.70 的膚色部分置1,其余部分置0,完成人臉區域分割。
對實時采集的圖像在(Xmin,Ymin)、(Xmin,Ymax)、(Xmax,Ymin)范圍內做差分運算,濾除非人臉的運動目標。基于FPGA 的改進三幀差法眨眼動作檢測流程如圖9 所示。

圖9 基于FPGA 的改進三幀差法眨眼動作
基于FPGA 的幀差眨眼動作檢測主要步驟為:
1)將當前幀二值圖像緩存一個時鐘周期,選取人臉范圍內有效部分,讀取下一幀圖像二值圖,選取人臉有效部分;
2)利用式(5)和式(6)定位運動狀態下的人眼區域;
3)將兩幀二值圖做差分運算,得到第一個差分圖;
4)重復步驟1)和步驟2),得到第二張差分圖;
5)將兩張差分圖進行與運算,最終判定是否有眨眼動作。
本文以算法加速和提高檢測系統集成度為目的,采用30 s 為一個計數周期,對眨眼頻率進行統計并判斷司機是否存在疲勞風險。檢測結果通過VGA 驅動器實時打印到顯示器輸出,實現檢測系統的可視化。
如圖10 和圖11 所示,疲勞駕駛檢測實驗分為佩戴眼鏡和不佩戴眼鏡兩種情形,系統實時統計30 s 內的眨眼次數,將“正常”情況用白色字體進行顯示,將“疲勞”和“睡眠”用白色斜體字突出顯示。

圖10 不戴眼鏡條件下的疲勞駕駛檢測效果

圖11 佩戴眼鏡條件下的疲勞駕駛檢測效果
圖10 a)在30 s 內眨眼次數為0,顯示數字為0,對應疲勞狀態為“睡眠”;圖10b)顯示在30 s眨眼7次,對應眨眼頻率為14次/min,檢測狀態為“正常”;圖10c)顯示30 s內眨眼13 次,對應眨眼頻率為26 次/min,檢測狀態為“疲勞”。
圖11中為戴眼鏡狀態下的疲勞駕駛檢測效果,可以看出,戴眼鏡情況下依然能夠準確檢測疲勞狀態。
本文采用硬件描述語言,通過Quartus Prime 開發平臺,在Cyclone ⅣFPGA 芯片上完成算法的部署和疲勞駕駛狀態的判斷。硬件設計頂層模塊包含了視頻采集與存儲、人臉區域分割、人眼位置跟蹤、眨眼頻率統計和疲勞駕駛判定多個功能子模塊,充分發揮了FPGA 優勢,滿足疲勞駕駛檢測實時性要求。本文通過眨眼頻率將疲勞狀態分為正常、疲勞、睡眠三個等級進行預警。實驗表明,系統對眨眼動作的檢測靈敏度高,系統在不佩戴眼鏡和佩戴眼鏡兩種場景下均可有效檢測疲勞駕駛狀態,滿足疲勞駕駛預警的檢測要求,可有效降低駕駛員疲勞駕駛風險。