金 梅 薛靜芳 張立國 劉 強
(燕山大學電氣工程學院 秦皇島066000)
隨著社會與科技的發(fā)展,汽車越來越普及,成為了社會生產(chǎn)力發(fā)展的強勁動力,為人們出行提供了便捷。但隨著汽車普及,安全問題也隨之而來。據(jù)國家統(tǒng)計局統(tǒng)計,2019 年,全國共發(fā)生247 646 起交通事故,導致62 763 人死亡,造成直接財產(chǎn)損失134 618萬元,而由疲勞駕駛引發(fā)的事故則占20%~40%。因此,針對駕駛員疲勞度檢測系統(tǒng)的研究能產(chǎn)生巨大的經(jīng)濟效益和社會效益。但用于疲勞駕駛檢測的傳統(tǒng)順序式算法對硬件性能要求高,導致設(shè)備成本高昂。如文獻[1]提出一種基于MTCNNPFLD-LSTM 深度學習模型的疲勞駕駛檢測算法。文獻[2]采用計算機視覺的方法利用Dlib 提取面部特征點的坐標,通過計算眼睛縱橫比來實現(xiàn)瞌睡檢測。文獻[3]提出通過從用戶端攝像頭提取面部特征,計算人眼睛的開合程度、嘴部開合度、頭部偏移程度判斷疲勞的融合算法。上述文獻及文獻[4-8]所述的方法均采用順序式算法,對處理器的性能及工作頻率要求高,且若要達到較高的處理幀率,需要采用較高端的圖形處理器(graphic processing unit,GPU)或者中央處理器(central processing unit,CPU),導致成本高昂。
現(xiàn)場可編程門陣列(field programmable gate array,FPGA)得益于其低成本及并發(fā)計算的特點,在信號處理和圖像處理等領(lǐng)域發(fā)揮了重要的作用。本文通過FPGA 開發(fā)板、攝像頭搭建駕駛員疲勞監(jiān)測系統(tǒng),將傳統(tǒng)順序式算法改進為流水線算法,多個處理步驟并行執(zhí)行,充分利用FPGA 并發(fā)特點實現(xiàn)實時人臉圖像處理及眼部特征提取,并利用單位時間內(nèi)人眼閉合時間所占的比例(percentage of eyelid closure over the pupil over time,PERCLOS)判據(jù)判斷駕駛員疲勞狀態(tài)。FPGA 并發(fā)計算的特性及本文對算法的流水線改進,使得系統(tǒng)延時大幅降低,處理速度大幅提高。并且本系統(tǒng)可運行在低端FPGA 上而準確度和性能幾乎不受影響,從而大幅降低設(shè)備成本。
本文基于PERCLOS 判據(jù)的疲勞監(jiān)測流程圖如圖1 所示。
圖1 基于PERCLOS 判據(jù)的疲勞監(jiān)測流程圖
攝像頭輸出的數(shù)據(jù)為16 位RGB565 格式,數(shù)據(jù)同時流經(jīng)2 個二值化模塊,通過設(shè)定不同的閾值,配合形態(tài)學模塊,一幅圖像保留臉部細節(jié),用于后續(xù)人眼檢測及跟蹤。另一個輸出抹去臉部細節(jié)的圖像,用于后續(xù)人臉檢測。經(jīng)二值化模塊后,輸出的數(shù)據(jù)長度變?yōu)? 位。完成形態(tài)學處理后,保留細節(jié)的圖像存入同步動態(tài)隨機存儲器(synchronous dynamic random-access memory,SDRAM),與此同時,不保留細節(jié)的圖像進入人臉定位模塊,在存儲完成時,人臉定位也完成。緊接著讀取SDRAM 中的圖像,在人臉范圍尋找眼睛,并運用PERCLOS 判據(jù)判斷駕駛員是否疲勞。
流水線算法將一個算法拆分成多級算法步驟,每級占用一定的時鐘周期。每級流水線并行運行,但由于后一級的輸入是前一級的輸出,所需的處理時間為第一個數(shù)據(jù)進入第一級流水線、到第一個處理結(jié)果輸出所需的時鐘周期。
FPGA 使用流水線算法能獲得非常快的處理速度,且所需處理的數(shù)據(jù)越多,算法步驟越多,流水線程序的優(yōu)勢也越大。
攝像頭輸出16 位RGB565 格式數(shù)據(jù),因此先將RGB565 格式數(shù)據(jù)通過高位補低位的方式轉(zhuǎn)換為RGB888 格式[9],再利用RGB888 格式數(shù)據(jù)計算灰度值。RGB 轉(zhuǎn)灰度常用公式為
為了進一步提高算法的處理速度,將式(1)算法中的除法改進為移位算法。移位比除法快,所以可以將系數(shù)縮放成2 的整數(shù)冪。
所以RGB 轉(zhuǎn)灰度公式可分解為三級流水線,即提取并擴展顏色分量、計算括號內(nèi)乘法、計算加法并移位除法。每級流水線消耗一個時鐘周期。
流水線算法只能處理一維數(shù)據(jù),因此,腐蝕/膨脹操作需分解為行方向(1 ×3)與列方向(3 ×1)2個一維操作。
1.4.1 一維行形態(tài)學操作
攝像頭輸出的數(shù)據(jù)經(jīng)二值化后,數(shù)據(jù)依然是連續(xù)地從二值化模塊輸出,而進行1 ×3 的行腐蝕須同時獲取3 個像素數(shù)據(jù)。由于同一時刻只能收到1 個數(shù)據(jù),并且需要保證每個流經(jīng)形態(tài)學操作模塊的數(shù)據(jù)一個不漏全部被處理,因此不能用暫存數(shù)據(jù)再處理的方法。在此提出讓數(shù)據(jù)流經(jīng)一個3 bit 移位寄存器,并且每個時鐘周期將寄存器后兩位數(shù)據(jù)前移一位,將新讀取的二值化數(shù)據(jù)放入寄存器末位,以實現(xiàn)數(shù)據(jù)在寄存器內(nèi)流動。從二值數(shù)據(jù)進入一維形態(tài)學模塊以后的第2 個時鐘周期即可開始判斷腐蝕/膨脹結(jié)果,輸出結(jié)果落后判斷一個時鐘周期,即第3個時鐘周期開始輸出第1 個結(jié)果,意味著此種方法對一幅圖像進行行一維腐蝕/膨脹操作只相當于把圖像數(shù)據(jù)延時了2 個時鐘周期,但經(jīng)過這2 個時鐘周期的延時后,輸出的圖像已經(jīng)是經(jīng)過行形態(tài)學操作的圖像[10]。
1.4.2 一維列形態(tài)學操作
在行方向進行形態(tài)學的基礎(chǔ)上對列方向進行形態(tài)學操作,原理和行形態(tài)學類似。但由于列形態(tài)學需要同時獲取位于相鄰3 行的像素,因此至少需要緩存2 行加第3 行的第1 個像素,即需要一個1281位的寄存器。與行形態(tài)學類似,列形態(tài)學也是當像素處于中間位置時判斷該像素,即第641 個數(shù)據(jù),意味著此模塊只需要784 個時鐘周期(一行圖像持續(xù)784 個時鐘周期,其中640 個位像素時鐘周期)便可開始輸出結(jié)果,即完成一幅圖像的列形態(tài)學操作相當于把圖像數(shù)據(jù)延時了784 個時鐘周期。
通過結(jié)合行與列方向2 個一維形態(tài)學操作,實現(xiàn)了對圖像的二維形態(tài)學操作。
由于攝像頭輸出的數(shù)據(jù)會同時進行2 個閾值不同的二值化及形態(tài)學操作,分別輸出保留臉部細節(jié)和不保留臉部細節(jié)的圖像。為了節(jié)省資源,提高效率,本文優(yōu)化了算法流程,實現(xiàn)了實時判斷、投影結(jié)束立即得出人臉邊界,并且只占用少量寄存器資源。人臉定位模塊狀態(tài)轉(zhuǎn)移圖如圖2 所示。
圖2 人臉檢測模塊狀態(tài)轉(zhuǎn)移圖
與人臉定位類似,人眼定位也利用投影法,但在投影之前需要確定眼睛的大致區(qū)域。根據(jù)“三庭五眼”比例關(guān)系[11],以及人臉的最寬處一般位于眼睛與鼻子之間的區(qū)域這一規(guī)律,只需要找到人臉最寬處,就可以在人臉上邊界與最寬處之間利用投影法尋找眼睛,也能較好地避免“三庭”規(guī)律的缺陷。區(qū)域分割及人眼定位結(jié)果如圖3 所示。
圖3 人眼定位
本文系統(tǒng)采用的攝像頭輸出幀率為60 fps,即相鄰兩幀間隔約0.016 s,而人眼在這段時間內(nèi)的位移屬于微位移。因此檢測到眼睛后,后續(xù)處理將在上一幀眼睛邊界的基礎(chǔ)上擴展邊界大小,并將擴展的邊界作為下一幀檢測眼睛的邊界,如此反復迭代,實現(xiàn)跟蹤。
PERCLOS 判據(jù)[12]的P80 標準定義眼睛從最大閉合到閉合80%大小所用時間為t1,從閉合80%到20%所用時間為t2,從閉合到20%到睜開到20%所用時間為t3,從睜開20%到睜開80%所用時間為t4。則PERCLOS 指數(shù)f定義如下。
當f超過一定范圍則認為駕駛員疲勞。雖然此方法理論上能達到非常高的準確度,但在實際操作時并不常用,主要有以下2 個原因。
(1) 因為當駕駛員距離攝像頭較遠時,眼睛的最大變化量不夠大,導致無法區(qū)分這4 個階段。
(2) 此法對系統(tǒng)速度要求極高,人眨眼一次只需要0.2~0.4 s,以本文為例,處理速度為60 fps,則每次眨眼只持續(xù)了10 幀左右,閉眼過程和睜眼過程平均只持續(xù)了5 幀左右,用如此少的幀數(shù)去描述閉眼與睜眼過程,精度較低。
因此,在實際應(yīng)用時,常用一段時間內(nèi)閉眼的時間占統(tǒng)計時間的百分比判斷駕駛員的疲勞程度。即
其中tc為閉眼持續(xù)的幀數(shù),T為總統(tǒng)計時間所持續(xù)的幀數(shù)。睜閉眼狀態(tài)由眼睛長寬比判斷。
根據(jù)實際測試效果,確定當眼睛的長寬比大于4 時,認為眼睛處于閉合狀態(tài),并在此基礎(chǔ)上進行PERCLOS 值標定。
對10 名測試者每人隨機記錄5 個周期的閉眼幀數(shù)數(shù)據(jù),實驗統(tǒng)計數(shù)據(jù)如表1 所示。
表1 清醒時閉眼幀數(shù)結(jié)果
根據(jù)表1 所測結(jié)果可知,在5400 幀里,清醒時眼睛閉合幀數(shù)在1200 幀以下,疲勞時在1200 幀以上,即得出的對應(yīng)關(guān)系如下。(1)f<0.2,駕駛員清醒;(2)f>0.2,駕駛員疲勞;(3)駕駛員長時間閉眼報警時間設(shè)為2 s,持續(xù)閉眼超過2 s 則認為駕駛員極度疲勞。
測試時設(shè)定的采樣周期為30 s,攝像頭采集900幀圖像,系統(tǒng)讀取1800 次,按照標定結(jié)果,疲勞時f>0.2,即閉眼幀數(shù)計數(shù)器計數(shù)值應(yīng)大于360。
根據(jù)表2 所示測試結(jié)果,可知本系統(tǒng)的準確度約為96%(大于360 的次數(shù)除以50)。
表2 疲勞時測試結(jié)果
實驗使用verilog 語言編寫疲勞監(jiān)測系統(tǒng)的邏輯電路,并在AltraEPCE0F7C FPGA 芯片上部署,電路驅(qū)動時鐘頻率為50 MHz,攝像頭捕獲畫面的分辨率為640 ×480 像素。
以文獻[13]采用的關(guān)鍵點特征融合的方式作為對比組,與本文所敘述的PERCLOS 疲勞計量方法進行對比。實驗前預先統(tǒng)計測試視頻序列中出現(xiàn)的疲勞次數(shù),與實際檢測出的疲勞次數(shù)對比,算法對比的實驗結(jié)果如表3 所示。
表3 檢測算法對比實驗結(jié)果
實驗表明,PERCLOS 疲勞計量方法采用單一因素進行檢測,故誤檢發(fā)生不頻繁且正確率較高。面部關(guān)鍵點融合特征算法能夠檢測出較多的疲勞情況,但由于該算法涉及多個疲勞因素與判定方式,在定值判定的情況下容易發(fā)生誤檢測的情況。
將文獻[14]提出的基于轉(zhuǎn)向盤轉(zhuǎn)角的疲勞駕駛檢測方法,與本文提出的基于PERCLOS 判據(jù)的駕駛員疲勞監(jiān)測方法進行對比,利用實際道路條件下的車輛行駛數(shù)據(jù)對所建立的模型進行驗證。實驗對比結(jié)果見表4。
表4 判別模型實驗結(jié)果對比
實驗表明,本文的駕駛員疲勞檢測方案不僅在正確率上較基于轉(zhuǎn)向盤轉(zhuǎn)角的疲勞駕駛檢測方案高,在速度上也更快?;谵D(zhuǎn)向盤轉(zhuǎn)角的疲勞檢測方法導致誤判的原因主要是,在少數(shù)路況簡單的直線路段無論是在清醒狀態(tài)還是疲勞狀態(tài),短時間內(nèi)轉(zhuǎn)向盤轉(zhuǎn)角變化的幅度和頻率都較小,使得提取的靜止百分比和角度標準差失效,從而導致誤判的發(fā)生。
針對常規(guī)疲勞監(jiān)測算法處理速度慢、實時性低、硬件成本高等問題,本文提出了一種基于PERCLOS判據(jù)的駕駛員疲勞監(jiān)測系統(tǒng)。通過對常規(guī)算法進行流水線改造,保證了系統(tǒng)的高速處理,達到了實時性的要求;并且通過改進算法,使得本系統(tǒng)所占用的資源處于較低水平,這也意味著本系統(tǒng)能運行在低端FPGA 上,從而節(jié)省硬件成本。在人臉定位方案中實現(xiàn)了以較低的資源占用完成人臉定位,且實現(xiàn)了每幀圖像結(jié)束時即可得出人臉定位結(jié)果。此外,在人臉定位的基礎(chǔ)上利用人臉比例關(guān)系,將眼睛區(qū)域縮小到人臉上邊界與人臉最寬處之間的部分,從而縮小了檢測人眼的范圍,簡化了程序,并利用系統(tǒng)處理速度快這一優(yōu)勢,使用迭代法實現(xiàn)了人眼跟蹤。最后進行實驗測試以及對比實驗,測試結(jié)果表明本系統(tǒng)在保證實時性的情況下達到了95%以上的準確度。