柏俊波,周濤琪,柏俊杰
(1.上海易咖智車科技有限公司,上海 嘉定 201800;2.重慶科技學(xué)院電氣工程學(xué)院,重慶 400010)
司機(jī)在疲勞狀態(tài)下駕駛汽車將極大增加發(fā)生交通事故的風(fēng)險(xiǎn)。統(tǒng)計(jì)顯示,2020 年全年中國(guó)交通事故發(fā)生數(shù)量為1 313 606起,事故造成61 703死亡,250 723人受傷,帶來(lái)的經(jīng)濟(jì)損失[1]超過(guò)244 000 萬(wàn)元人民幣。由疲勞駕駛導(dǎo)致的交通事故數(shù)量占事故總量[2]的25%以上,事故死亡率達(dá)到83%。因此,出于對(duì)駕駛員及行人安全、社會(huì)和諧穩(wěn)定、國(guó)家經(jīng)濟(jì)發(fā)展等一系列問(wèn)題的考慮,準(zhǔn)確有效的疲勞駕駛檢測(cè)系統(tǒng)的研發(fā)已經(jīng)成為當(dāng)前交通安全領(lǐng)域的研究重點(diǎn)。當(dāng)前針對(duì)疲勞駕駛的檢測(cè)方法主要包含三類:基于司機(jī)生理參數(shù)的檢測(cè)方法、基于車輛行為的檢測(cè)方法和基于司機(jī)面部特征的檢測(cè)方法[3]。
基于司機(jī)生理參數(shù)的疲勞駕駛檢測(cè)方法主要通過(guò)腦電、心電等信號(hào)對(duì)疲勞狀態(tài)進(jìn)行評(píng)價(jià),此類方法對(duì)生理信號(hào)的分類效果較好,疲勞檢測(cè)精度較高,但是信號(hào)采集和分析設(shè)備體積過(guò)大,需要司機(jī)全程佩戴,容易影響司機(jī)正常駕車行為[4-5]。
為了克服基于生理參數(shù)的疲勞駕駛檢測(cè)方法具有侵入性的問(wèn)題,一部分學(xué)者通過(guò)車輛行為判斷司機(jī)疲勞狀態(tài)。此類方法通過(guò)方向盤數(shù)據(jù)、車道偏移量等特征對(duì)司機(jī)疲勞狀態(tài)做出間接評(píng)價(jià)。基于車輛行為的疲勞駕駛檢測(cè)方法對(duì)司機(jī)干擾較小,但不能直接反映司機(jī)的真實(shí)狀態(tài),檢測(cè)精度不高,同時(shí),此類方法具有滯后性,實(shí)時(shí)性不好[6-7]。
相比于以上兩類方法,基于司機(jī)面部特征的疲勞駕駛檢測(cè)方法具備非接觸、效果好等優(yōu)勢(shì),通過(guò)相機(jī)實(shí)時(shí)采集司機(jī)面部特征,可以對(duì)司機(jī)狀態(tài)進(jìn)行直接的客觀評(píng)價(jià)。傳統(tǒng)的基于駕駛員面部特征的檢測(cè)方法檢測(cè)效果較好,但需要借助大量圖像處理算法和機(jī)器學(xué)習(xí)算法,大量且復(fù)雜的算法會(huì)影響檢測(cè)系統(tǒng)的實(shí)時(shí)性,導(dǎo)致大多數(shù)此類方法需要借助PC 機(jī)才能完成疲勞狀態(tài)的判斷及預(yù)警,不利于在駕駛室環(huán)境大量部署和推廣[8-10]。
算法復(fù)雜、設(shè)備龐大制約著機(jī)器視覺算法在疲勞駕駛檢測(cè)領(lǐng)域的發(fā)展,為了解決這一問(wèn)題,部分學(xué)者嘗試基于嵌入式設(shè)備實(shí)現(xiàn)司機(jī)狀態(tài)的實(shí)時(shí)監(jiān)測(cè)。文獻(xiàn)[11]在汽車儀表盤內(nèi)安裝微型紅外攝像機(jī),將拍攝到的駕駛員面部特征利用包含F(xiàn)PGA 的嵌入式設(shè)備進(jìn)行處理,用以對(duì)駕駛員的精神狀態(tài)進(jìn)行評(píng)估,系統(tǒng)能夠在720.576 ms 的時(shí)間內(nèi)處理16×7 幀實(shí)時(shí)檢測(cè)畫面,檢測(cè)效率大大提升。文獻(xiàn)[12]基于FPGA 平臺(tái),開發(fā)出基于Sobel 邊緣檢測(cè)算子和差分法相結(jié)合的疲勞駕駛檢測(cè)系統(tǒng),系統(tǒng)通過(guò)識(shí)別人眼輪廓,計(jì)算眨眼頻率對(duì)駕駛員疲勞狀態(tài)進(jìn)行檢測(cè),系統(tǒng)結(jié)構(gòu)采用流水線設(shè)計(jì),大幅提升了疲勞駕駛檢測(cè)速度。
綜上所述,為了提高疲勞駕駛檢測(cè)系統(tǒng)的集成度和實(shí)時(shí)性,同時(shí)面向狹小、復(fù)雜的駕駛環(huán)境,本文基于FPGA硬件平臺(tái),設(shè)計(jì)了一種通過(guò)司機(jī)眨眼頻率判斷其是否疲勞的檢測(cè)方法,該方法具有響應(yīng)速度快、檢測(cè)精度高、體積小等特點(diǎn),滿足昏暗、顛簸等復(fù)雜情形下的檢測(cè)要求。
眨眼率常被作為評(píng)價(jià)司機(jī)疲勞駕駛的重要指標(biāo)之一,因此,在復(fù)雜的駕駛環(huán)境正確計(jì)算司機(jī)眨眼頻率是本文的研究重點(diǎn)。本文首先改進(jìn)YCbCr 人臉檢測(cè)算法,提高人臉區(qū)域分割精確度;再在人臉?lè)秶畠?nèi)跟蹤司機(jī)雙眼位置;最后利用幀差法檢測(cè)眨眼動(dòng)作并計(jì)算眨眼頻率。算法設(shè)計(jì)流程如圖1 所示。
圖1 算法設(shè)計(jì)流程圖
在FPGA 平臺(tái)上開發(fā)設(shè)計(jì)疲勞駕駛檢測(cè)系統(tǒng),首先要分割人臉區(qū)域,在人臉區(qū)域范圍內(nèi)進(jìn)行眼部區(qū)域分割和眨眼動(dòng)作檢測(cè)可以減小系統(tǒng)計(jì)算量,節(jié)省開發(fā)板資源。本文首先采用區(qū)域長(zhǎng)寬比改進(jìn)YCbCr 算法,框選出準(zhǔn)確、完整的人臉后,提取每一幀圖像中人臉框?qū)?yīng)的4 個(gè)像素點(diǎn)的像素坐標(biāo)值,為人眼跟蹤奠定基礎(chǔ)。
1.1.1 基于區(qū)域長(zhǎng)寬比的YCbCr 人臉區(qū)域分割算法
YCbCr 顏色空間將圖像分解為亮度信息(Y)和色度信息(Cb、Cr),根據(jù)人體膚色的色度分布規(guī)律實(shí)現(xiàn)人臉?lè)指頪13]。不同年齡和性別人群,即使人種不同,其膚色的色度分量都會(huì)集中在特定范圍之內(nèi),因此,只需要根據(jù)膚色的Cb、Cr 分量值,而不用考慮背景和環(huán)境就能很好地分割人臉區(qū)域。此外,YCbCr 算法邏輯簡(jiǎn)單,易于實(shí)現(xiàn),能夠提高FPGA 芯片對(duì)圖像的采樣率,因此,本文探究基于YCbCr 顏色空間的人臉區(qū)域分割算法,算法基本原理如式(1)所示:
式中將Y 分量的常數(shù)置0 可削弱圖像亮度的影響。統(tǒng)計(jì)人體膚色Cb、Cr 的分布規(guī)律后,將人臉的色度分量定義在式(2)和式(3)的范圍內(nèi)。
YCbCr 算法是對(duì)膚色區(qū)域的簡(jiǎn)單分割,當(dāng)圖像中出現(xiàn)非人臉膚色區(qū)域時(shí),該算法會(huì)產(chǎn)生誤檢。為了提高系統(tǒng)檢測(cè)精度,本文采用區(qū)域長(zhǎng)寬比對(duì)YCbCr 算法進(jìn)行改進(jìn),改進(jìn)的原理是計(jì)算檢測(cè)出的膚色區(qū)域最大長(zhǎng)寬比,將滿足比例要求的區(qū)域判定為人臉區(qū)域,反之,則為非人臉區(qū)域。計(jì)算100 張駕駛場(chǎng)景中人臉最大長(zhǎng)寬比(Ratio)后,本文將人臉長(zhǎng)寬比判定閾值設(shè)定為:
駕駛環(huán)境下司機(jī)面部畫面相對(duì)穩(wěn)定,通過(guò)公式(4)計(jì)算后可排除非人臉膚色區(qū)域的干擾,算法的優(yōu)化過(guò)程如圖2 所示。
圖2 YCbCr 算法優(yōu)化過(guò)程
1.1.2 人臉區(qū)域分割效果
經(jīng)過(guò)圖2 所示的處理后,人臉區(qū)域像素值為1,非人臉區(qū)域像素值為0,達(dá)到了人臉?lè)指畹哪康?。在此基礎(chǔ)上,通過(guò)搜索畫面中灰度為1 的像素坐標(biāo)點(diǎn)極值就可框選出人臉。優(yōu)化后的YCbCr 算法在實(shí)車環(huán)境下檢測(cè)人臉區(qū)域的效果如圖3 所示。
圖3 優(yōu)化后YCbCr 算法人臉檢測(cè)效果
圖4 頭部位移和雙眼中心點(diǎn)位移
圖5 人眼中心位移與頭部位移的關(guān)系
數(shù)據(jù)擬合后得到以及之間的關(guān)系如式(5)和式(6)所示:
式中:Δxe表示待測(cè)眼睛橫向位移;Δye表示待測(cè)眼睛縱向位移;Δxh表示利用幀差法計(jì)算得到的相鄰兩幀圖像的頭部橫向位移;Δyh表示利用幀差法計(jì)算得到的相鄰兩幀圖像的頭部縱向位移。通過(guò)式(5)和式(6)的運(yùn)算,檢測(cè)范圍進(jìn)一步壓縮到人眼區(qū)域,過(guò)濾了膚色區(qū)域內(nèi)的運(yùn)動(dòng)噪聲,提高了檢測(cè)精度。然而,眼睛周圍的鏡框、眉毛等微小變化會(huì)使圖像出現(xiàn)空洞,因此,在對(duì)兩張差分圖像進(jìn)行與操作時(shí),還需要對(duì)圖像進(jìn)行腐蝕膨脹操作,去除圖像中的尖銳空白點(diǎn)。
在人眼區(qū)域范圍內(nèi)通過(guò)幀差法檢測(cè)運(yùn)動(dòng)目標(biāo)的像素變化即可檢測(cè)眨眼動(dòng)作[15]。幀差法檢測(cè)眨眼動(dòng)作的優(yōu)勢(shì)在于:選取前一幀或前幾幀圖像作為標(biāo)準(zhǔn)背景圖像,將當(dāng)前幀圖像與前一幀圖像做差分運(yùn)算可以解決標(biāo)準(zhǔn)背景圖像實(shí)時(shí)更新和重建的難題。為了避免系統(tǒng)檢測(cè)過(guò)靈敏,本文采用三幀差算法,算法原理如圖6所示。
圖6 三幀差法流程
假設(shè)第k- 2、k- 1、k張圖片的圖像函數(shù)分別為Fk-2(x,y)、Fk-1(x,y)、Fk(x,y),則計(jì)算得到的差分圖函數(shù)如式(7)和式(8)所示:
式中:Dk(x,y)、Dk-1(x,y)分別為兩張差分圖像的圖像函數(shù),將兩張差分圖進(jìn)行與運(yùn)算后得到的運(yùn)動(dòng)目標(biāo)圖像函數(shù)如式(9)所示:
眨眼動(dòng)作檢測(cè)效果如圖7 所示,本文采用的眨眼動(dòng)作檢測(cè)算法將運(yùn)動(dòng)目標(biāo)的檢測(cè)區(qū)域集中在人眼周圍,不統(tǒng)計(jì)非眨眼動(dòng)作帶來(lái)的像素變化,同時(shí)過(guò)濾了頭發(fā)、眉毛等噪聲干擾,提高檢測(cè)精度的同時(shí),降低了誤檢率。
圖7 眨眼動(dòng)作檢測(cè)
華盛頓大學(xué)John A. Stren 等人在其研究中指出,正常情況下,司機(jī)眨眼頻率在12~17 之間,隨著駕駛時(shí)長(zhǎng)增加和疲勞程度的增長(zhǎng),眨眼率[16]最高達(dá)到了每分鐘40 次。本文結(jié)合文獻(xiàn)和臺(tái)灣國(guó)立中央大學(xué)NTHUDDD 疲勞數(shù)據(jù)集實(shí)測(cè)數(shù)據(jù),將眨眼頻率fe與司機(jī)狀態(tài)之間的關(guān)系用公式(10)表示:
系統(tǒng)硬件設(shè)計(jì)遵循從頂層到底層再到頂層的設(shè)計(jì)思路[17]:首先根據(jù)系統(tǒng)設(shè)計(jì)要求確定頂層設(shè)計(jì)方案,然后將頂層方案分解為PLL、ov5640_cfg、processor 等多個(gè)功能子模塊,各個(gè)子模塊功能實(shí)現(xiàn)后聯(lián)合調(diào)試運(yùn)行,最終達(dá)到設(shè)計(jì)要求。
硬件部分主要包含攝像頭配置和驅(qū)動(dòng)模塊、數(shù)據(jù)存儲(chǔ)模塊、疲勞駕駛檢測(cè)模塊以及VGA 顯示模塊,PLL 時(shí)鐘模塊產(chǎn)生4 路時(shí)鐘信號(hào)分別為各個(gè)功能模塊供電。疲勞駕駛檢測(cè)系統(tǒng)頂層設(shè)計(jì)如圖8 所示。
圖8 疲勞駕駛檢測(cè)系統(tǒng)頂層模塊設(shè)計(jì)
各個(gè)功能模塊描述如表1 所示。
圖8 中:processor 模塊是本項(xiàng)目的核心模塊,其主要功能是進(jìn)行人臉?lè)指?、圖像預(yù)處理、人眼跟蹤、眨眼動(dòng)作檢測(cè)等。其中:YCbCr 和pretreatment 模塊功能為圖像預(yù)處理和人臉?lè)指睿籦inarization 模塊功能為圖像二值化;Erosion 和Dilation 模塊是圖像形態(tài)學(xué)處理模塊,主要功能是圖像腐蝕和膨脹;Frame Difference 為幀差模塊,主要功能是檢測(cè)眨眼動(dòng)作。processor 檢測(cè)到眨眼動(dòng)作后,發(fā)送img_current/post 信號(hào)到數(shù)據(jù)存儲(chǔ)驅(qū)動(dòng)單元,完成眨眼次數(shù)的統(tǒng)計(jì)和眨眼的計(jì)算。
由于capture 輸出圖像為16 位RGB565 格式,而用于圖像處理的輸入圖像為24 位RGB888 格式,因此,需要先將RGB565 轉(zhuǎn)化為RGB888。將公式(1)中每個(gè)分量前的小數(shù)系數(shù)乘以256,然后向右位移8 位,完成乘法運(yùn)算;然后將計(jì)算得到的數(shù)據(jù)進(jìn)行相加,分別得到Y(jié)、Cb、Cr 分量數(shù)值,完成圖像由RGB888 格式到Y(jié)CbCr 格式的轉(zhuǎn)換。
統(tǒng)計(jì)符合人體膚色的色度分量并計(jì)算區(qū)域長(zhǎng)寬比Ratio1…Ration,將符合1.20 ≤Ratio ≤1.70 的膚色部分置1,其余部分置0,完成人臉區(qū)域分割。
對(duì)實(shí)時(shí)采集的圖像在(Xmin,Ymin)、(Xmin,Ymax)、(Xmax,Ymin)范圍內(nèi)做差分運(yùn)算,濾除非人臉的運(yùn)動(dòng)目標(biāo)?;贔PGA 的改進(jìn)三幀差法眨眼動(dòng)作檢測(cè)流程如圖9 所示。
圖9 基于FPGA 的改進(jìn)三幀差法眨眼動(dòng)作
基于FPGA 的幀差眨眼動(dòng)作檢測(cè)主要步驟為:
1)將當(dāng)前幀二值圖像緩存一個(gè)時(shí)鐘周期,選取人臉?lè)秶鷥?nèi)有效部分,讀取下一幀圖像二值圖,選取人臉有效部分;
2)利用式(5)和式(6)定位運(yùn)動(dòng)狀態(tài)下的人眼區(qū)域;
3)將兩幀二值圖做差分運(yùn)算,得到第一個(gè)差分圖;
4)重復(fù)步驟1)和步驟2),得到第二張差分圖;
5)將兩張差分圖進(jìn)行與運(yùn)算,最終判定是否有眨眼動(dòng)作。
本文以算法加速和提高檢測(cè)系統(tǒng)集成度為目的,采用30 s 為一個(gè)計(jì)數(shù)周期,對(duì)眨眼頻率進(jìn)行統(tǒng)計(jì)并判斷司機(jī)是否存在疲勞風(fēng)險(xiǎn)。檢測(cè)結(jié)果通過(guò)VGA 驅(qū)動(dòng)器實(shí)時(shí)打印到顯示器輸出,實(shí)現(xiàn)檢測(cè)系統(tǒng)的可視化。
如圖10 和圖11 所示,疲勞駕駛檢測(cè)實(shí)驗(yàn)分為佩戴眼鏡和不佩戴眼鏡兩種情形,系統(tǒng)實(shí)時(shí)統(tǒng)計(jì)30 s 內(nèi)的眨眼次數(shù),將“正?!鼻闆r用白色字體進(jìn)行顯示,將“疲勞”和“睡眠”用白色斜體字突出顯示。
圖10 不戴眼鏡條件下的疲勞駕駛檢測(cè)效果
圖11 佩戴眼鏡條件下的疲勞駕駛檢測(cè)效果
圖10 a)在30 s 內(nèi)眨眼次數(shù)為0,顯示數(shù)字為0,對(duì)應(yīng)疲勞狀態(tài)為“睡眠”;圖10b)顯示在30 s眨眼7次,對(duì)應(yīng)眨眼頻率為14次/min,檢測(cè)狀態(tài)為“正?!?;圖10c)顯示30 s內(nèi)眨眼13 次,對(duì)應(yīng)眨眼頻率為26 次/min,檢測(cè)狀態(tài)為“疲勞”。
圖11中為戴眼鏡狀態(tài)下的疲勞駕駛檢測(cè)效果,可以看出,戴眼鏡情況下依然能夠準(zhǔn)確檢測(cè)疲勞狀態(tài)。
本文采用硬件描述語(yǔ)言,通過(guò)Quartus Prime 開發(fā)平臺(tái),在Cyclone ⅣFPGA 芯片上完成算法的部署和疲勞駕駛狀態(tài)的判斷。硬件設(shè)計(jì)頂層模塊包含了視頻采集與存儲(chǔ)、人臉區(qū)域分割、人眼位置跟蹤、眨眼頻率統(tǒng)計(jì)和疲勞駕駛判定多個(gè)功能子模塊,充分發(fā)揮了FPGA 優(yōu)勢(shì),滿足疲勞駕駛檢測(cè)實(shí)時(shí)性要求。本文通過(guò)眨眼頻率將疲勞狀態(tài)分為正常、疲勞、睡眠三個(gè)等級(jí)進(jìn)行預(yù)警。實(shí)驗(yàn)表明,系統(tǒng)對(duì)眨眼動(dòng)作的檢測(cè)靈敏度高,系統(tǒng)在不佩戴眼鏡和佩戴眼鏡兩種場(chǎng)景下均可有效檢測(cè)疲勞駕駛狀態(tài),滿足疲勞駕駛預(yù)警的檢測(cè)要求,可有效降低駕駛員疲勞駕駛風(fēng)險(xiǎn)。