杜虓龍,余華平
(長江大學計算機科學學院,湖北荊州 434023)
隨著汽車的普及,行車安全問題逐漸進入了大家的視野。2019 年,全國共發(fā)生道路交通事故238 351 起,造成67 759 人死亡、275 125 人受傷,直接財產損失9.1 億元,其中21% 是疲勞駕駛導致的車禍,可見疲勞駕駛是導致車禍的重要因素[1]。近年來,通過機器學習對駕駛人進行自動判斷并且作出反應的智能系統(tǒng)變成了研究的主流,主要研究內容便是對駕駛人的違規(guī)駕車行為進行判斷,如未佩戴安全帶、開車時抽煙、接電話、注意力不集中和疲勞駕駛等問題。
目前,國內對于該領域的研究主要存在于高校,國外對于違規(guī)駕駛的研究主要集中在大學與科研院所。例如美國研制的瞌睡預警系統(tǒng),該系統(tǒng)根據(jù)PECLOS 算法[2]對駕駛員進行疲勞判斷,而PECLOS 算法如今也是最常用的疲勞檢測算法。此外,還有利用紅外獲取人類眼球特征[3],再對駕駛員的眼球狀態(tài)進行檢測以判斷是否為疲勞駕駛方法等。這些方法的基礎是人面部動作識別[4]。圖像識別[5]算法有許多,當前面部動作識別領域最常用的技術之一是卷積神經網(wǎng)絡(Convolutional Neural Networks,CNN)[6],但是傳統(tǒng)卷積神經網(wǎng)絡存在識別速度慢、識別流暢度低等缺點;還有YOLO3[7]算法,使用YOLO3 算法識別物體不僅速度快,準確率也很高,不過對于面部識別而言并不太適合;利用腦電傳感器檢測面部動作表情的研究[8],雖然可以實現(xiàn)高精度的面部動作分類,但是實現(xiàn)過程相對復雜,資源消耗較高,無法快速普及。
鑒于此,本文在單一CNN 網(wǎng)絡基礎上,增加了一個多任務卷積神經網(wǎng)絡(Multi-Task Convolutional Neural Net?work,MTCNN)。MTCNN 主要進行對象的面部識別,CNN網(wǎng)絡主要進行對象的面部動作識別,二者結合彌補了識別速度與流暢度低等缺點,并且使用簡單、資源消耗少。
卷積神經網(wǎng)絡的觀點雛形由Wiesel &Hubell 于1962年提出,他們通過對生物學的研究首先提出了感受野的觀點[9]。1980 年,日本學者Fukushima 在感受野的基礎上提出了神經認知機觀點,該觀點可以認為是卷積神經網(wǎng)絡的第一版。最終在1998 年,卷積神經網(wǎng)絡的第一個網(wǎng)絡,即LeNet5 網(wǎng)絡[10-13]被提出,并且成功應用于文字手寫識別,這使得卷積神經網(wǎng)絡在此類領域逐漸得以發(fā)展。
卷積神經網(wǎng)絡主要分為4 個部分,分別為輸入層、卷積層、全連接層和輸出層[14]。網(wǎng)絡結構如圖1 所示。
Fig.1 Network structure圖1 網(wǎng)絡結構
由圖1 可以看出,一個待識別的圖片輸入到網(wǎng)絡中,通過第一次卷積生成了第一個特征地圖(Feature Maps),再通過池化(Pooling)和激活函數(shù)激活后進入第二層卷積,以此類推。在卷積過程結束后會進入到全連接過程,全連接層后便是輸出層,將懸鏈好的特征進行輸出[15]。接下來對卷積層和全連接層進行詳細介紹。
卷積層的工作就是將圖片中的特征提取出來。輸入的圖片會被轉化為計算機可識別的矩陣,然后卷積核(ker?nel)會對該矩陣進行滑動計算生成一個新的矩陣,新的矩陣便是一個特征,每一個卷積核在滑動計算完畢后都會生成一個特征地圖,生成的每個特征地圖又會進入下一層的卷積層與下一層的卷積核進行卷積操作。卷積工作過程如圖2 所示。
Fig.2 Convolution working process圖2 卷積工作過程
在生成了特征地圖后還需要進行池化和激活操作,由于特征地圖的數(shù)據(jù)較大,在處理復雜或者龐大的數(shù)據(jù)時會耗費計算機性能,而且也會延長識別時間,對于疲勞識別這種需要快速識別類型的工作而言是致命的。因此,需要加入池化操作對特征地圖在保留關鍵特征的條件下縮小數(shù)據(jù)量。池化操作分為MaxPooling 和SamePooling,目前常用的是SamePooling。
激活函數(shù)(Activation Function)運行時激活神經網(wǎng)絡中某一部分神經元,將激活信息向后傳入下一層的神經網(wǎng)絡。神經網(wǎng)絡之所以能解決非線性問題,本質上就是激活函數(shù)加入了非線性因素,彌補了線性模型的表達力,將“激活的神經元特征”通過函數(shù)保留并映射到下一層。目前,常用的激活函數(shù)為Rule 和Sigmiod 函數(shù)。
在完成池化與激活后,這一層的特征提取操作即完成。提取前后的圖片對比如圖3 所示。
Fig.3 Comparison before and after extraction圖3 提取前后對比
在將完成的特征地圖傳給下一個卷積層前,為了防止過擬合,還會進行Droupout 操作,該操作由Droupout 函數(shù)完成。該函數(shù)的主要作用是按照一定概率抑制神經網(wǎng)絡中的神經元,被抑制的神經元輸出為0 并且不會恢復,不再參與接下來的一系列訓練操作。
在卷積操作完成后會將特征傳給全連接層,全連接層會將自己已有的神經元與上一層傳來的神經元相連接,判斷出每個特征所代表的元素。
在全連接層后電腦會自動判斷輸出結果是否為真實結果,真實結果與輸出結果的差距成為損失值,若損失值過大就說明識別效果越差,這時就需要神經網(wǎng)絡進行反向傳播,使用梯度下降等算法對之前的權值進行反復更新,使損失值降為最小,神經網(wǎng)絡訓練才算完成。
MTCNN[16-17]是由中國科學院深圳研究院在2016 年提出的專門用于人臉檢測的多任務神經網(wǎng)絡模型。該模型主要由3 個級聯(lián)網(wǎng)絡組成,分別為可以快速生成候選框的P-Net 網(wǎng)絡、進行候選框過濾的R-Net 網(wǎng)絡和生成最終邊界框并且標出人臉特征點的O-Net 網(wǎng)絡。該模型主要運用了圖像金字塔、非極大抑制(NMS)和邊框回歸技術(Bounding-Box Regression)。
圖片在進入3 個級聯(lián)網(wǎng)絡前會通過圖像金字塔技術對圖片進行尺寸重新劃分,將原圖縮放為不同的尺度,從而構成圖像金字塔;然后將這些不同尺寸的圖片送入3 個級聯(lián)網(wǎng)絡進行訓練,這是為了讓網(wǎng)絡可以檢測到不同大小的人臉而進行的多尺度檢測。
在完成圖像金字塔后,生成的圖像會進入MTCNN 的第一個網(wǎng)絡層,即P-Net 網(wǎng)絡層。P-Net 全稱為Proposal Network,該網(wǎng)絡也是一個全連接網(wǎng)絡,對于上一步輸入的圖像,通過全卷積網(wǎng)絡(FCN)初步提取圖像特征并且給出初步的標定邊框,這時會出現(xiàn)許多標定邊框,因為P-Net會通過一個人臉分類器將可能為人臉的部分都打上邊框。在該網(wǎng)絡的最后會通過Bounding-Box Regression 與NMS對剛才生成的邊框進行初步篩查,丟棄不符合標準的標定邊框。P-Net 網(wǎng)絡結構如圖4 所示。
從P-Net 網(wǎng)絡輸出的標定邊框的人臉區(qū)域會進入下一個網(wǎng)絡,即R-Net 網(wǎng)絡進行處理。
Fig.4 P-Net network structure圖4 P-Net 網(wǎng)絡結構
R-Net 全稱Refine Network,該層網(wǎng)絡從結構上講就是一個基本的卷積神經網(wǎng)絡,比P-Net 多了一層全連接層,這使得對臉部特征點和邊框的篩選將更為嚴格。
對網(wǎng)絡中輸入的值進行更加細化的選擇,并且舍去大部分錯誤,該層也會利用人臉關鍵點定位器對人臉關鍵點[18]進行定位以及邊框回歸,最后利用Bounding-Box Re?gression 與NMS 對結果作進一步優(yōu)化,將可信度較高的人臉區(qū)域輸出給下一層網(wǎng)絡,即O-Net 網(wǎng)絡。R-Net 網(wǎng)絡的網(wǎng)絡結構如圖5 所示。
Fig.5 R-Net network structure圖5 R-Net 網(wǎng)絡結構
O-Net 網(wǎng)絡的全稱為Output Network,該層網(wǎng)絡基本結構與R-Net 網(wǎng)絡結構相似,多了一層卷積層,網(wǎng)絡結構更加復雜,擁有更好的性能,模型優(yōu)化也更好。在該層對輸入圖像進行人臉判別、人臉邊框回歸以及特征點定位,最后在圖片中輸出人臉區(qū)域的5 個特征點。O-Net 網(wǎng)絡結構如圖6 所示。
Fig.6 O-Net network structure圖6 O-Net 網(wǎng)絡結構
將原始圖片輸入MTCNN 網(wǎng)絡,讓MTCNN 網(wǎng)絡可以準確地識別出人臉和關鍵點。然后通過檢測到的5 個關鍵點,再根據(jù)“三庭五眼”理論將人臉的眼睛、嘴巴和耳朵分為了3 個區(qū)域,定義了左、右眼中心點連線與水平方向的夾角為θ,眼部區(qū)域寬度為W,高度為H=w/2。從鼻尖點位C 向左右嘴角連線作垂線,記垂距為D。嘴部區(qū)域上、下沿分別取該垂線及其延長線上D/2 和3D/2 處。這樣在檢測時可將這3 個部分分開檢測,不同的區(qū)域、不同的動作會產生不同的結果。
具體動作判斷需要在CNN 網(wǎng)絡中實現(xiàn),本文通過SimpleVGGnet 網(wǎng)絡對需要判斷的動作進行分類訓練。SimpleVGGnet 只有3 個卷積層、3 個池化層和2 個全連接層,卷積核的大小為5,學習率設置為0.01,EPOCHS 設置為500,保證模型完全訓練。將網(wǎng)絡上得到的數(shù)據(jù)分為open_mouth、close_mouth、open_eye、close_eye 和smoke 5 個數(shù)據(jù)集,具體如表1 所示。
Table 1 Number of data set categories表1 數(shù)據(jù)集分類數(shù)量
可以看出,數(shù)據(jù)集的數(shù)量較大,模型對特征的提取越精確。還有25% 作為測試集,在對數(shù)據(jù)集進行訓練后得出模型,實施流程如圖7 所示。
Fig.7 Experiment process圖7 實施流程
系統(tǒng):Window10;處理器:Intel(R)Core(TM)i7-8750H CPU @ 2.20GHz 2.21GHz;內存:32GB;GPU 型號:NVIDIA GeForce RTX 2080;Python 環(huán)境:Python3.7;Tensor?flow 和 keras 環(huán)境:Tensorflow-gpu==1.14.0,Keras==2.2.0;CUDA 版本:CUDA==9.0。
本文使用MTCNN 網(wǎng)絡對人臉進行識別并對人臉關鍵點進行提取,后經過CNN 神經網(wǎng)絡對動作進行分類訓練處理,得到一個識別率較高的面部動作識別模型。CNN 訓練結果如圖8 所示。
Fig.8 Training result圖8 訓練結果
測試過程中的數(shù)據(jù)變化如圖9 所示,模型最終準確率達0.99,并且對于數(shù)據(jù)集的訓練程度很高。
訓練過程中的數(shù)據(jù)變化也符合普遍神經網(wǎng)絡的訓練變化,Loss 值呈下降狀態(tài)然后趨于平穩(wěn),ACC 值呈上升狀態(tài)后慢慢平穩(wěn),從數(shù)據(jù)看出模型訓練很成功。
接下來對模型進行測試,本次是調用攝像頭進行實時識別,模擬開車時的真實情況,測試結果如圖10 所示。
Fig.9 Training process changes圖9 訓練過程變化
Fig.10 Test results圖10 測試結果
從測試結果看,基于該模型可對3 個區(qū)域分別進行識別,并且?guī)瑪?shù)在19 幀左右,相對較為流暢。圖10 的第1列是對對象嘴巴部分的分類識別,根據(jù)嘴部不同的動作分別識別出張嘴大叫、吃東西或抽煙,第2 列為測試對象的眼睛睜閉識別,第3 列為測試對象兩只眼睛的不同動作識別結果,能夠看出模型準確識別出單個眼睛的睜閉情況。除面部動作識別外,還對識別環(huán)境作了一些調整,前兩行模擬白天識別情況,最后一行模擬夜晚識別情況。從測試結果可以看出,模型能夠準確識別對象的面部動作,但夜晚情況下的面部動作識別還存在一些不足。
面部識別和動作檢測已有許多網(wǎng)絡模型,本文在對其它模型進行研究后結合程序本身需要,先使用MTCNN 網(wǎng)絡檢測面部并且提取關鍵點,再結合VGG 神經網(wǎng)絡的分類訓練方法對面部動作識別模型進行優(yōu)化,并且得出以下結論:①MTCNN 雖然對面部識別效果較好但是無法識別重合圖像,若識別區(qū)域中有別的人臉出現(xiàn)會干擾測試;②可以對VGG 網(wǎng)絡進行復雜處理,由于本次使用的是Sim?pleVGG 網(wǎng)絡,性能不及完整的VGG-16 網(wǎng)絡。
本文方法對面部動作識別表現(xiàn)較好,但依然存在一些不足,如檢測的動作類別較少,具體只有3 類,且在檢測時畫面有明顯卡頓,這在后續(xù)研究中需繼續(xù)優(yōu)化。