莫紫雯,王江濤,張子翔
(淮北師范大學 物理與電子信息學院,安徽淮北,235000)
隨著社會不斷地發展,汽車成為人們出行必不可少的交通工具,但每年汽車交通事故的數量也在不斷增長,而分心駕駛是導致交通事故的重要原因之一。駕駛員分散注意力進行非駕駛相關活動,如低頭看手機、轉頭聊天、發呆等,會降低對道路和周圍環境的注意力,增加發生事故的風險。因此,研究一款分心駕駛檢測系統可以及時發現駕駛員的分心行為,采取警示措施,減少交通事故的發生,提高道路安全。
基于樹莓派的分心駕駛檢測系統由樹莓派4B、樹莓派顯示屏、樹莓派攝像頭、蜂鳴器模塊組成,通過攝像頭進行實時圖像采集,將采集到的人臉特征關鍵點進行數據處理,經過計算與設定閾值進行比較判斷是否達到分心駕駛狀態。

圖1 系統總體結構圖
完成本次系統設計的硬件組成為樹莓派(Raspberry Pi)。其部分參數配置如表1 所示。

表1 系統硬件參數

圖2 本文分心駕駛系統的具體實物圖
系統的軟件主要是在樹莓派上搭建OpenCV運行環境,程序運行時啟動攝像頭,系統進行人臉識別并抓取面部關鍵點,然后通過轉換3D-2D 模型,將旋轉向量轉換為旋轉矩陣,并分解投影矩陣,對頭部姿態進行識別,與設定角度進行比較并判定是否處于分心駕駛,對數據進行預處理,實現分心駕駛的檢測與提示。
檢測方式通過實時攝像頭檢測,打開攝像頭后,完成界面和變量的初始化,然后使用基于HOG 特征的級聯分類器來檢測視頻幀中的人臉,并提取人臉關鍵點(如眼睛、鼻子、嘴巴等)的坐標[1]。然后,定義一個頭部的3D 模型,將2D 的人臉關鍵點坐標與3D 模型中對應的點建立起對應關系。通過將2D-3D 對應點作為輸入,使用PnP 算法估計得到的旋轉向量和平移向量。最后,通過將旋轉向量轉換為旋轉矩陣,并分解投影矩陣,可以計算頭部的歐拉角(如俯仰角、偏航角、滾動角)。設置低頭閾值角度為10 度,如果在連續3s 內檢測的頭部偏轉角度都大于閾值角度,則將被判定為分心駕駛;同理,設置左右偏頭閾值為10 度,如果在連續3s 內檢測的頭部偏轉角度大于10 度或小于-10度也將被判定為分心駕駛,系統將進行警報提示。

圖3 分心駕駛檢測系統軟件實現流程圖

圖4 分心駕駛檢測系統總體設計流程圖
(1)創建一個人臉檢測器detector 和一個關鍵點預測器predictor。detector 使用Dlib 的默認人臉檢測器來檢測輸入幀中的人臉,predictor 使用預訓練的模型來預測人臉關鍵點。
(2)讀取視頻流的每一幀。對于每一幀,使用人臉檢測器檢測人臉的邊界框face_rects。
(3)如果檢測到人臉,則利用關鍵點預測器獲取人臉的68 個關鍵點坐標shape,這些關鍵點包括眼睛、眉毛、鼻子、嘴巴等[2]。
(4)調用get_head_pose()函數,傳入關鍵點坐標shape,以估計頭部的旋轉角度和俯仰角度。函數返回投影后的關鍵點坐標reprojectdst 和歐拉角euler_angle。
(5)將投影后的關鍵點坐標用線段連接起來,以顯示頭部的姿態估計。
(6)將歐拉角的X、Y 和Z 分量分別賦值給變量ab 和yh,若在連續3 秒內ab 大于10 度或yh 大于10 度或yh 小于-10 度,則判定為分心駕駛。
(7)如果系統被判定為分心駕駛,顯示屏顯示提示字樣且蜂鳴器進行警報提示。
我們在使用Dlib 庫進行人臉識別時,獲取了人臉68 個特征點,并根據這些點的位置信息分別獲取左右眼面部標志的索引。在本文中,我們采用了Dlib 庫中的兩個核心函數:dlib.get frontal face detector() 和dlib.shape predictor()。前者是一種基于HOG pyramid 算法的內置人臉檢測器,能夠準確地識別出人臉區域的范圍。而后者則是針對特定區域內的特征點進行檢測和坐標輸出的函數,但需要通過文件路徑傳入一個事先練習好的模型才能工作。
在這個項目中,我們使用了一個開源的模型shape predictor 68 face,通過它可以獲取到人臉的68 個特征點位置的坐標信息。將這些坐標點連線之后,可以得到如圖所示的效果展示(紅框為HOG pyramid 檢測器的結果,綠框為predictor 函數的結果,僅連接了同一個器官的特征點)所得效果如圖5 所示。
通過數據分析,結合產品總出成和綜合售價兩個方面的綜合考慮,在毛雞只重為5.10×500g時,有相對較高的總出成和最高的綜合售價。所以,確定車間肉雞屠宰中毛雞的最佳只重為5.10×500g,對養殖端的毛雞養殖的最佳只重范圍提供一定理論依據,進而對屠宰車間的最大化價值生產提供一定的原料支持。

圖5 人臉面部68 個特征關鍵點識別圖
在這個項目中,我們使用了眼睛長寬比(EAR)來計算眼睛的狀態。當人眼睜開時,EAR會在一個值域內浮動。然而,當人眼閉上時,EAR會迅速下降,接近于零。一般情況下,我們設置同一次眨眼的連續幀數為1 到3 幀。因此,兩個閾值都需要根據實際情況進行設置。眼部抓取的6 個關鍵特征點如圖6 所示。

圖6 眼部6 個關鍵特征點識別圖

圖7 面部68 個關鍵特征點標識圖

圖8 3D 坐標系與2D 坐標系關系轉換圖
通過式(1):
計算出眼部閾值,我們通過比較當前幀與前一幀的兩只眼睛的寬高比的絕對差值,此外,下方的面部關鍵特征點標識圖展示了人臉68 個關鍵特征點的位置信息,37~42 代表左眼,43~48 代表右眼。
在該項目中,我們首先需要定義一個合適的坐標系來描述頭部的姿態。通常使用的是一個以人臉中心或眼睛中心為原點,與圖像平面垂直的坐標系。然后使用dlib.shape predictor()函數獲取人臉關鍵點,該函數使用了人臉關鍵點檢測算法,該算法基于形狀模型和回歸方法,能夠對人臉進行準確的特征點定位。通過使用訓練好的形狀模型,可以在新的人臉圖像中預測并定位出相應的關鍵點,通常會包括眼睛、鼻子和嘴巴等特征點[3]。接著通過眼睛關鍵點的均值來計算眼睛的中心點,例如左眼關鍵點的均值和右眼關鍵點的均值。使用眼睛中心點計算頭部在水平方向上的旋轉角度。
本文主要運用Dlib 包中的圖像處理庫包,其中包括基本圖像處理、形態學運算、圖像變換、特征提取等功能。人臉檢測和人臉識別是本文所設計系統中的兩個重要功能,其中人臉檢測是Dlib 庫中的人臉檢測算法基于HOG 特征和級聯分類器[4],該算法能夠快速準確地檢測出圖像中的人臉。Dlib 提供了多種人臉檢測器,其中正面人臉檢測器是最為常用的,具有高準確率和快速度。通過使用Dlib 庫提供的人臉檢測器,可以獲得人臉位置和大小等信息。Dlib 提供了基于ResNet 網絡的人臉識別器,該識別器能夠將人臉圖像轉換為一個128 維的向量表示。這個向量表示能夠很好地表征人臉的特征,不僅在同一個人的不同姿態、表情、光照等變化下保持一致,而且在不同人之間也能夠區分開來。Dlib 還提供了人臉跟蹤器,可以跟蹤一個人臉在視頻中的位置和姿態,并對其進行實時的識別。
本文中使用了dlib.get frontal face detector()函數,它的作用是在圖像或視頻中檢測出人臉的位置和邊界框。該函數使用了基于HOG 特征的級聯分類器來進行人臉檢測。
(1)HOG 特征
HOG 特征是一種基于圖像梯度方向的特征表示方法,用于描述圖像中的紋理和形狀信息。它的主要思想是將圖像劃分為小的局部區域,計算每個區域內梯度的方向和強度,并統計這些梯度方向的直方圖作為特征表示。HOG 特征在人臉檢測中非常有效,因為人臉的紋理和形狀信息可以通過梯度方向進行捕捉。
級聯分類器是一種多階段的分類器,由多個弱分類器組成。它的設計目標是在保持高檢測率的同時降低計算成本,以實現實時目標檢測。級聯分類器通過級聯的方式將輸入樣本逐步過濾,將大多數負樣本(非目標)快速排除,只保留可能是目標的區域進行進一步檢測。
在人臉檢測中,級聯分類器通常采用AdaBoost 算法來訓練弱分類器,并通過級聯的方式組合這些弱分類器。每個級聯階段包含多個弱分類器,只有當一個區域通過當前階段的所有弱分類器時,才會進入下一階段的檢測。
級聯分類器的訓練過程包括以下步驟:
(1)提取正樣本和負樣本的特征(如HOG 特征);
(2)使用AdaBoost 算法訓練弱分類器,通過選擇最佳的特征和閾值進行分類;
(3)逐級訓練級聯階段,每個階段都對前一階段中被錯誤分類的樣本進行進一步訓練;
(4)在級聯過程中,隨著階段的增加,誤報率逐漸降低,同時保持較高的檢測率。
級聯分類器的優勢在于它能夠在較短的時間內快速排除大部分負樣本,從而減少后續檢測階段的計算量,提高整體檢測速度。因此,本文系統中的dlib.get frontal face detector()函數使用了基于HOG 特征的級聯分類器來進行人臉檢測。
頭部姿態估計在很多應用中都有著重要的作用,例如人機交互、情感識別、安防監控等。它可以幫助計算機更好地理解人類的行為和意圖,從而提高人機交互的效率和自然度。
要將一個3D坐標系中的點表示為2D 坐標系中的點,需要進行一定的坐標變換。這個變換過程通常包括以下幾個步驟:
(1)將3D 坐標系中的點投影到一個平面上,得到一個2D 平面中的點;
(2)對這個2D 平面中的點進行縮放和旋轉,以適應實際場景中的尺度和方向;
(3)根據需要對2D 坐標系中的點進行平移,以調整它們在實際場景中的位置。
通過使用OpenCV 提供的solvePnP()函數,可以獲得旋轉矩陣R。
繼而通過以下公式求得歐拉角:
根據眼睛中心點的坐標差異,可以使用函數來計算旋轉角度。最后計算頭部俯仰角度,頭部的俯仰角度通常是相對于一個參考點(例如鼻子關鍵點)的頭部與該點之間的角度??梢杂嬎銋⒖键c到眼睛中心點的向量,然后計算該向量與圖像平面的夾角。
系統的實際驗證情況如圖9 所示,圖中立方體為根據頭部姿態重新建立的空間姿態立方體,將它與圖像中的標準坐標對比并將頭部的歐拉角信息顯示在幀上,最后,打印輸出頭部的歐拉角信息,并將歐拉角的X、Y 和Z 分量分別賦值給變量,當變量大于或小于設定角度范圍則將被判定出行為特征,而當此行為持續超過3s 則將被系統判斷為分心駕駛。

圖9 向左轉頭時系統識別情況

圖10 向右轉頭時系統識別情況

圖11 低頭時系統識別情況
為了測試系統在實際情況下的綜合性能表現,采用了同場景下多樣本的測試,志愿者的分心次數由兩位計數人員和本文所設計的分心駕駛檢測系統共同計數,并將匯總的數據整理成表格形式。在這里選取5 名同學來模擬開車狀態進行分心檢測,試驗結果如表2 所示。

表2 檢測實驗結果
從結果可以看出,本文所設計的分心駕駛檢測系統在實際測試場景中有較高的測試精度,整體的檢測準確率達到了97.4%。其中在對低頭檢測的實驗中,由于測試時所設閾值角度范圍較小,導致了在檢測低頭時做出了動作但系統誤判成向左或向右偏頭的情況,后續對本系統的研究仍然需要對這種情況進行改進。出現了誤判的現象,但是本文設計的分心駕駛檢測系統的整體表現尚可,實際測試結果驗證了本文提出的程序的檢測系統的準確性和實時性。
本文根據實際生活中的需要設計了一款準確且高效的分心駕駛檢測預警系統,解決了駕駛員在行車過程中的無意識駕駛行為和一些已有的分心駕駛檢測系統的不足。該系統的計數原理是對OpenCV 捕捉的面部信息和頭部姿態信息進行識別分析,首先定位抓取面部信息和實時識別駕駛過程中面部關鍵點和頭部姿態相對位置變化信息,通過與預先設置的分心駕駛判定角度進行比較,可以確定當前駕駛員是否處于分心駕駛狀態。該系統具有實時采集、同步檢測判斷、分心狀態判定,存儲和實時顯示計數結果等特性,系統的實時性較佳,對硬件設備要求不高,分心駕駛狀態檢測精確度高,為后續能真正應用于駕駛員駕駛汽車的場景中提供了參考。