杜虓龍,余華平
(長江大學(xué)計(jì)算機(jī)科學(xué)學(xué)院,湖北荊州 434023)
隨著汽車的普及,行車安全問題逐漸進(jìn)入了大家的視野。2019 年,全國共發(fā)生道路交通事故238 351 起,造成67 759 人死亡、275 125 人受傷,直接財(cái)產(chǎn)損失9.1 億元,其中21% 是疲勞駕駛導(dǎo)致的車禍,可見疲勞駕駛是導(dǎo)致車禍的重要因素[1]。近年來,通過機(jī)器學(xué)習(xí)對駕駛?cè)诉M(jìn)行自動(dòng)判斷并且作出反應(yīng)的智能系統(tǒng)變成了研究的主流,主要研究內(nèi)容便是對駕駛?cè)说倪`規(guī)駕車行為進(jìn)行判斷,如未佩戴安全帶、開車時(shí)抽煙、接電話、注意力不集中和疲勞駕駛等問題。
目前,國內(nèi)對于該領(lǐng)域的研究主要存在于高校,國外對于違規(guī)駕駛的研究主要集中在大學(xué)與科研院所。例如美國研制的瞌睡預(yù)警系統(tǒng),該系統(tǒng)根據(jù)PECLOS 算法[2]對駕駛員進(jìn)行疲勞判斷,而PECLOS 算法如今也是最常用的疲勞檢測算法。此外,還有利用紅外獲取人類眼球特征[3],再對駕駛員的眼球狀態(tài)進(jìn)行檢測以判斷是否為疲勞駕駛方法等。這些方法的基礎(chǔ)是人面部動(dòng)作識別[4]。圖像識別[5]算法有許多,當(dāng)前面部動(dòng)作識別領(lǐng)域最常用的技術(shù)之一是卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)[6],但是傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò)存在識別速度慢、識別流暢度低等缺點(diǎn);還有YOLO3[7]算法,使用YOLO3 算法識別物體不僅速度快,準(zhǔn)確率也很高,不過對于面部識別而言并不太適合;利用腦電傳感器檢測面部動(dòng)作表情的研究[8],雖然可以實(shí)現(xiàn)高精度的面部動(dòng)作分類,但是實(shí)現(xiàn)過程相對復(fù)雜,資源消耗較高,無法快速普及。
鑒于此,本文在單一CNN 網(wǎng)絡(luò)基礎(chǔ)上,增加了一個(gè)多任務(wù)卷積神經(jīng)網(wǎng)絡(luò)(Multi-Task Convolutional Neural Net?work,MTCNN)。MTCNN 主要進(jìn)行對象的面部識別,CNN網(wǎng)絡(luò)主要進(jìn)行對象的面部動(dòng)作識別,二者結(jié)合彌補(bǔ)了識別速度與流暢度低等缺點(diǎn),并且使用簡單、資源消耗少。
卷積神經(jīng)網(wǎng)絡(luò)的觀點(diǎn)雛形由Wiesel &Hubell 于1962年提出,他們通過對生物學(xué)的研究首先提出了感受野的觀點(diǎn)[9]。1980 年,日本學(xué)者Fukushima 在感受野的基礎(chǔ)上提出了神經(jīng)認(rèn)知機(jī)觀點(diǎn),該觀點(diǎn)可以認(rèn)為是卷積神經(jīng)網(wǎng)絡(luò)的第一版。最終在1998 年,卷積神經(jīng)網(wǎng)絡(luò)的第一個(gè)網(wǎng)絡(luò),即LeNet5 網(wǎng)絡(luò)[10-13]被提出,并且成功應(yīng)用于文字手寫識別,這使得卷積神經(jīng)網(wǎng)絡(luò)在此類領(lǐng)域逐漸得以發(fā)展。
卷積神經(jīng)網(wǎng)絡(luò)主要分為4 個(gè)部分,分別為輸入層、卷積層、全連接層和輸出層[14]。網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示。

Fig.1 Network structure圖1 網(wǎng)絡(luò)結(jié)構(gòu)
由圖1 可以看出,一個(gè)待識別的圖片輸入到網(wǎng)絡(luò)中,通過第一次卷積生成了第一個(gè)特征地圖(Feature Maps),再通過池化(Pooling)和激活函數(shù)激活后進(jìn)入第二層卷積,以此類推。在卷積過程結(jié)束后會進(jìn)入到全連接過程,全連接層后便是輸出層,將懸鏈好的特征進(jìn)行輸出[15]。接下來對卷積層和全連接層進(jìn)行詳細(xì)介紹。
卷積層的工作就是將圖片中的特征提取出來。輸入的圖片會被轉(zhuǎn)化為計(jì)算機(jī)可識別的矩陣,然后卷積核(ker?nel)會對該矩陣進(jìn)行滑動(dòng)計(jì)算生成一個(gè)新的矩陣,新的矩陣便是一個(gè)特征,每一個(gè)卷積核在滑動(dòng)計(jì)算完畢后都會生成一個(gè)特征地圖,生成的每個(gè)特征地圖又會進(jìn)入下一層的卷積層與下一層的卷積核進(jìn)行卷積操作。卷積工作過程如圖2 所示。

Fig.2 Convolution working process圖2 卷積工作過程
在生成了特征地圖后還需要進(jìn)行池化和激活操作,由于特征地圖的數(shù)據(jù)較大,在處理復(fù)雜或者龐大的數(shù)據(jù)時(shí)會耗費(fèi)計(jì)算機(jī)性能,而且也會延長識別時(shí)間,對于疲勞識別這種需要快速識別類型的工作而言是致命的。因此,需要加入池化操作對特征地圖在保留關(guān)鍵特征的條件下縮小數(shù)據(jù)量。池化操作分為MaxPooling 和SamePooling,目前常用的是SamePooling。
激活函數(shù)(Activation Function)運(yùn)行時(shí)激活神經(jīng)網(wǎng)絡(luò)中某一部分神經(jīng)元,將激活信息向后傳入下一層的神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)之所以能解決非線性問題,本質(zhì)上就是激活函數(shù)加入了非線性因素,彌補(bǔ)了線性模型的表達(dá)力,將“激活的神經(jīng)元特征”通過函數(shù)保留并映射到下一層。目前,常用的激活函數(shù)為Rule 和Sigmiod 函數(shù)。
在完成池化與激活后,這一層的特征提取操作即完成。提取前后的圖片對比如圖3 所示。

Fig.3 Comparison before and after extraction圖3 提取前后對比
在將完成的特征地圖傳給下一個(gè)卷積層前,為了防止過擬合,還會進(jìn)行Droupout 操作,該操作由Droupout 函數(shù)完成。該函數(shù)的主要作用是按照一定概率抑制神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元,被抑制的神經(jīng)元輸出為0 并且不會恢復(fù),不再參與接下來的一系列訓(xùn)練操作。
在卷積操作完成后會將特征傳給全連接層,全連接層會將自己已有的神經(jīng)元與上一層傳來的神經(jīng)元相連接,判斷出每個(gè)特征所代表的元素。
在全連接層后電腦會自動(dòng)判斷輸出結(jié)果是否為真實(shí)結(jié)果,真實(shí)結(jié)果與輸出結(jié)果的差距成為損失值,若損失值過大就說明識別效果越差,這時(shí)就需要神經(jīng)網(wǎng)絡(luò)進(jìn)行反向傳播,使用梯度下降等算法對之前的權(quán)值進(jìn)行反復(fù)更新,使損失值降為最小,神經(jīng)網(wǎng)絡(luò)訓(xùn)練才算完成。
MTCNN[16-17]是由中國科學(xué)院深圳研究院在2016 年提出的專門用于人臉檢測的多任務(wù)神經(jīng)網(wǎng)絡(luò)模型。該模型主要由3 個(gè)級聯(lián)網(wǎng)絡(luò)組成,分別為可以快速生成候選框的P-Net 網(wǎng)絡(luò)、進(jìn)行候選框過濾的R-Net 網(wǎng)絡(luò)和生成最終邊界框并且標(biāo)出人臉特征點(diǎn)的O-Net 網(wǎng)絡(luò)。該模型主要運(yùn)用了圖像金字塔、非極大抑制(NMS)和邊框回歸技術(shù)(Bounding-Box Regression)。
圖片在進(jìn)入3 個(gè)級聯(lián)網(wǎng)絡(luò)前會通過圖像金字塔技術(shù)對圖片進(jìn)行尺寸重新劃分,將原圖縮放為不同的尺度,從而構(gòu)成圖像金字塔;然后將這些不同尺寸的圖片送入3 個(gè)級聯(lián)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,這是為了讓網(wǎng)絡(luò)可以檢測到不同大小的人臉而進(jìn)行的多尺度檢測。
在完成圖像金字塔后,生成的圖像會進(jìn)入MTCNN 的第一個(gè)網(wǎng)絡(luò)層,即P-Net 網(wǎng)絡(luò)層。P-Net 全稱為Proposal Network,該網(wǎng)絡(luò)也是一個(gè)全連接網(wǎng)絡(luò),對于上一步輸入的圖像,通過全卷積網(wǎng)絡(luò)(FCN)初步提取圖像特征并且給出初步的標(biāo)定邊框,這時(shí)會出現(xiàn)許多標(biāo)定邊框,因?yàn)镻-Net會通過一個(gè)人臉分類器將可能為人臉的部分都打上邊框。在該網(wǎng)絡(luò)的最后會通過Bounding-Box Regression 與NMS對剛才生成的邊框進(jìn)行初步篩查,丟棄不符合標(biāo)準(zhǔn)的標(biāo)定邊框。P-Net 網(wǎng)絡(luò)結(jié)構(gòu)如圖4 所示。
從P-Net 網(wǎng)絡(luò)輸出的標(biāo)定邊框的人臉區(qū)域會進(jìn)入下一個(gè)網(wǎng)絡(luò),即R-Net 網(wǎng)絡(luò)進(jìn)行處理。

Fig.4 P-Net network structure圖4 P-Net 網(wǎng)絡(luò)結(jié)構(gòu)
R-Net 全稱Refine Network,該層網(wǎng)絡(luò)從結(jié)構(gòu)上講就是一個(gè)基本的卷積神經(jīng)網(wǎng)絡(luò),比P-Net 多了一層全連接層,這使得對臉部特征點(diǎn)和邊框的篩選將更為嚴(yán)格。
對網(wǎng)絡(luò)中輸入的值進(jìn)行更加細(xì)化的選擇,并且舍去大部分錯(cuò)誤,該層也會利用人臉關(guān)鍵點(diǎn)定位器對人臉關(guān)鍵點(diǎn)[18]進(jìn)行定位以及邊框回歸,最后利用Bounding-Box Re?gression 與NMS 對結(jié)果作進(jìn)一步優(yōu)化,將可信度較高的人臉區(qū)域輸出給下一層網(wǎng)絡(luò),即O-Net 網(wǎng)絡(luò)。R-Net 網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu)如圖5 所示。

Fig.5 R-Net network structure圖5 R-Net 網(wǎng)絡(luò)結(jié)構(gòu)
O-Net 網(wǎng)絡(luò)的全稱為Output Network,該層網(wǎng)絡(luò)基本結(jié)構(gòu)與R-Net 網(wǎng)絡(luò)結(jié)構(gòu)相似,多了一層卷積層,網(wǎng)絡(luò)結(jié)構(gòu)更加復(fù)雜,擁有更好的性能,模型優(yōu)化也更好。在該層對輸入圖像進(jìn)行人臉判別、人臉邊框回歸以及特征點(diǎn)定位,最后在圖片中輸出人臉區(qū)域的5 個(gè)特征點(diǎn)。O-Net 網(wǎng)絡(luò)結(jié)構(gòu)如圖6 所示。

Fig.6 O-Net network structure圖6 O-Net 網(wǎng)絡(luò)結(jié)構(gòu)
將原始圖片輸入MTCNN 網(wǎng)絡(luò),讓MTCNN 網(wǎng)絡(luò)可以準(zhǔn)確地識別出人臉和關(guān)鍵點(diǎn)。然后通過檢測到的5 個(gè)關(guān)鍵點(diǎn),再根據(jù)“三庭五眼”理論將人臉的眼睛、嘴巴和耳朵分為了3 個(gè)區(qū)域,定義了左、右眼中心點(diǎn)連線與水平方向的夾角為θ,眼部區(qū)域?qū)挾葹閃,高度為H=w/2。從鼻尖點(diǎn)位C 向左右嘴角連線作垂線,記垂距為D。嘴部區(qū)域上、下沿分別取該垂線及其延長線上D/2 和3D/2 處。這樣在檢測時(shí)可將這3 個(gè)部分分開檢測,不同的區(qū)域、不同的動(dòng)作會產(chǎn)生不同的結(jié)果。
具體動(dòng)作判斷需要在CNN 網(wǎng)絡(luò)中實(shí)現(xiàn),本文通過SimpleVGGnet 網(wǎng)絡(luò)對需要判斷的動(dòng)作進(jìn)行分類訓(xùn)練。SimpleVGGnet 只有3 個(gè)卷積層、3 個(gè)池化層和2 個(gè)全連接層,卷積核的大小為5,學(xué)習(xí)率設(shè)置為0.01,EPOCHS 設(shè)置為500,保證模型完全訓(xùn)練。將網(wǎng)絡(luò)上得到的數(shù)據(jù)分為open_mouth、close_mouth、open_eye、close_eye 和smoke 5 個(gè)數(shù)據(jù)集,具體如表1 所示。

Table 1 Number of data set categories表1 數(shù)據(jù)集分類數(shù)量
可以看出,數(shù)據(jù)集的數(shù)量較大,模型對特征的提取越精確。還有25% 作為測試集,在對數(shù)據(jù)集進(jìn)行訓(xùn)練后得出模型,實(shí)施流程如圖7 所示。

Fig.7 Experiment process圖7 實(shí)施流程
系統(tǒng):Window10;處理器:Intel(R)Core(TM)i7-8750H CPU @ 2.20GHz 2.21GHz;內(nèi)存: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)絡(luò)對人臉進(jìn)行識別并對人臉關(guān)鍵點(diǎn)進(jìn)行提取,后經(jīng)過CNN 神經(jīng)網(wǎng)絡(luò)對動(dòng)作進(jìn)行分類訓(xùn)練處理,得到一個(gè)識別率較高的面部動(dòng)作識別模型。CNN 訓(xùn)練結(jié)果如圖8 所示。

Fig.8 Training result圖8 訓(xùn)練結(jié)果
測試過程中的數(shù)據(jù)變化如圖9 所示,模型最終準(zhǔn)確率達(dá)0.99,并且對于數(shù)據(jù)集的訓(xùn)練程度很高。
訓(xùn)練過程中的數(shù)據(jù)變化也符合普遍神經(jīng)網(wǎng)絡(luò)的訓(xùn)練變化,Loss 值呈下降狀態(tài)然后趨于平穩(wěn),ACC 值呈上升狀態(tài)后慢慢平穩(wěn),從數(shù)據(jù)看出模型訓(xùn)練很成功。
接下來對模型進(jìn)行測試,本次是調(diào)用攝像頭進(jìn)行實(shí)時(shí)識別,模擬開車時(shí)的真實(shí)情況,測試結(jié)果如圖10 所示。

Fig.9 Training process changes圖9 訓(xùn)練過程變化

Fig.10 Test results圖10 測試結(jié)果
從測試結(jié)果看,基于該模型可對3 個(gè)區(qū)域分別進(jìn)行識別,并且?guī)瑪?shù)在19 幀左右,相對較為流暢。圖10 的第1列是對對象嘴巴部分的分類識別,根據(jù)嘴部不同的動(dòng)作分別識別出張嘴大叫、吃東西或抽煙,第2 列為測試對象的眼睛睜閉識別,第3 列為測試對象兩只眼睛的不同動(dòng)作識別結(jié)果,能夠看出模型準(zhǔn)確識別出單個(gè)眼睛的睜閉情況。除面部動(dòng)作識別外,還對識別環(huán)境作了一些調(diào)整,前兩行模擬白天識別情況,最后一行模擬夜晚識別情況。從測試結(jié)果可以看出,模型能夠準(zhǔn)確識別對象的面部動(dòng)作,但夜晚情況下的面部動(dòng)作識別還存在一些不足。
面部識別和動(dòng)作檢測已有許多網(wǎng)絡(luò)模型,本文在對其它模型進(jìn)行研究后結(jié)合程序本身需要,先使用MTCNN 網(wǎng)絡(luò)檢測面部并且提取關(guān)鍵點(diǎn),再結(jié)合VGG 神經(jīng)網(wǎng)絡(luò)的分類訓(xùn)練方法對面部動(dòng)作識別模型進(jìn)行優(yōu)化,并且得出以下結(jié)論:①M(fèi)TCNN 雖然對面部識別效果較好但是無法識別重合圖像,若識別區(qū)域中有別的人臉出現(xiàn)會干擾測試;②可以對VGG 網(wǎng)絡(luò)進(jìn)行復(fù)雜處理,由于本次使用的是Sim?pleVGG 網(wǎng)絡(luò),性能不及完整的VGG-16 網(wǎng)絡(luò)。
本文方法對面部動(dòng)作識別表現(xiàn)較好,但依然存在一些不足,如檢測的動(dòng)作類別較少,具體只有3 類,且在檢測時(shí)畫面有明顯卡頓,這在后續(xù)研究中需繼續(xù)優(yōu)化。