吳梓祺
(華南師范大學(xué) 廣東省廣州市 510555)
當(dāng)今世界信息技術(shù)日新月異,人臉檢測(cè)、人臉識(shí)別和人臉檢索等領(lǐng)域技術(shù)發(fā)展迅速,創(chuàng)造出許多人臉業(yè)務(wù)的解決方案,以及各種穩(wěn)定性好、泛化能力強(qiáng)、精度較高的模型,這讓基于深度學(xué)習(xí)的人臉考試簽到系統(tǒng)的開(kāi)發(fā)成為了可能[1]。傳統(tǒng)的人工考場(chǎng)簽到方式存在效率低下和人工成本較高等諸多問(wèn)題,而這一款微信小程序人臉考試簽到系統(tǒng)可很好地解決上述問(wèn)題。首先,考生可以免去攜帶學(xué)生證的麻煩,只需把人臉圖片導(dǎo)入到系統(tǒng),便可通過(guò)系統(tǒng)的人臉簽到功能無(wú)障礙入場(chǎng)。其次,小程序比對(duì)成功并確認(rèn)后,會(huì)自動(dòng)把考生到場(chǎng)信息寫(xiě)入數(shù)據(jù)庫(kù),免去手動(dòng)錄入系統(tǒng)的麻煩。最后,監(jiān)考人員只需一臺(tái)智能手機(jī)且安裝有微信,即可在登錄確認(rèn)監(jiān)考員身份后,打開(kāi)考場(chǎng)簽到小程序進(jìn)行人臉簽到,小程序可以自動(dòng)識(shí)別學(xué)生身份,無(wú)需監(jiān)考員人工比對(duì)。
由此傳統(tǒng)的人工考場(chǎng)簽到方式完全可由基于深度學(xué)習(xí)進(jìn)行自動(dòng)考場(chǎng)簽到的方式所取代。使用人臉考試簽到系統(tǒng)中的人臉業(yè)務(wù)模型,不僅可提高考試簽到效率,而且節(jié)約了大量的人工成本。
前端首先要打開(kāi)微信小程序,通過(guò)手機(jī)攝像頭采集人臉圖片數(shù)據(jù),并用TensorFlow.js框架實(shí)現(xiàn)的Blaze Face輕量級(jí)人臉檢測(cè)模型進(jìn)行實(shí)時(shí)人臉檢測(cè),然后對(duì)檢測(cè)結(jié)果進(jìn)行評(píng)估分析,把符合標(biāo)準(zhǔn)的圖像發(fā)送到后端,F(xiàn)lask后端通過(guò)TensorFlow框架實(shí)現(xiàn)的高精度FaceNet人臉識(shí)別模型從人臉圖像中提取出128維特征向量,該特征向量的歐氏距離作為人臉相似度的度量標(biāo)準(zhǔn),然后通過(guò)Annoy算法快速查找于獲取人臉圖片相近的考生人臉,若相似度達(dá)到一定閾值,返回對(duì)應(yīng)學(xué)生的考試信息,最后手機(jī)確認(rèn),完成簽到。
2.2.1 前端人臉檢測(cè)技術(shù)
由于考慮到簽到速度問(wèn)題,把人臉檢測(cè)通過(guò)前端框架tensorflow.js實(shí)現(xiàn),采用BlazeFace[2]超輕量人臉檢測(cè)模型,模型大小小于400kb,推理速度達(dá)到亞毫秒級(jí)別。
2.2.2 BlazeFaceAPI代碼完善
對(duì)于BlazeFace模型,TensorFlow.js已經(jīng)給出了預(yù)訓(xùn)練模型以及對(duì)應(yīng)的API接口,只需要調(diào)用幾個(gè)函數(shù)就可以完成人臉檢測(cè)。但是在調(diào)用和解析BlazeFaceAPI源碼的過(guò)程中,作者作者發(fā)現(xiàn)源碼有以下幾點(diǎn)不足:
(1)每次啟動(dòng)程序都要調(diào)用API從網(wǎng)上獲取模型權(quán)重和結(jié)構(gòu)等數(shù)據(jù),對(duì)服務(wù)器造成不必要的負(fù)載。
(2)人臉預(yù)測(cè)框會(huì)隨著輸入圖片長(zhǎng)寬比的改變而改變。
對(duì)于以上缺陷,本文作出了以下幾點(diǎn)優(yōu)化:
(1)把API設(shè)計(jì)成第一次獲取到模型權(quán)重和結(jié)構(gòu)等數(shù)據(jù)后保存到微信小程序本地,這樣之后就可以離線(xiàn)識(shí)別了。
(2)刪除意義不明確的函數(shù),把圖片預(yù)處理封裝為一個(gè)函數(shù),對(duì)預(yù)測(cè)后結(jié)果的處理再封裝為一個(gè)函數(shù),提高代碼可讀性。
(3)刪除微信小程序無(wú)法獲取到的入?yún)㈩?lèi)型。
(4)把所有有關(guān)tensorflow.js的操作放到api內(nèi),外部調(diào)用應(yīng)該完全不涉及對(duì)tfjs的任何操作,提高代碼解耦性。
(5)對(duì)于輸入做截取正方形處理,提高人臉預(yù)測(cè)框和關(guān)鍵點(diǎn)的預(yù)測(cè)精度。
(6)修改圖片檢測(cè)結(jié)果的解碼函數(shù),讓預(yù)測(cè)框保持原來(lái)的正方形。
2.2.3 人臉檢測(cè)質(zhì)量評(píng)估
由于向后端上傳人臉圖片請(qǐng)求人臉識(shí)別服務(wù)比較消耗資源,前端需要考慮如何評(píng)估人臉檢測(cè)質(zhì)量,從而丟棄檢測(cè)質(zhì)量較差的圖片,減少請(qǐng)求次數(shù),達(dá)到減輕后端服務(wù)器壓力的目的。為實(shí)現(xiàn)高效合理的人臉檢測(cè)質(zhì)量評(píng)估機(jī)制,需要權(quán)衡程序執(zhí)行效率和評(píng)估準(zhǔn)確度,通過(guò)把消耗計(jì)算資源較大的算法放到后面,可以較好的解決該問(wèn)題。
微信小程序先通過(guò)攝像頭采集圖片并進(jìn)行人臉檢測(cè),人臉檢測(cè)模型會(huì)以數(shù)組的形式返回人臉預(yù)測(cè)框和人臉關(guān)鍵點(diǎn),程序首先判斷數(shù)組長(zhǎng)度,如果長(zhǎng)度大于一,則證明有多張人臉,如果長(zhǎng)度為零代表沒(méi)有檢測(cè)到任何人臉,若數(shù)組長(zhǎng)度為一,繼續(xù)通過(guò)預(yù)測(cè)框檢驗(yàn)人臉是否位于相機(jī)中間位置而不是位于采集圖片的角落中,還需要檢驗(yàn)預(yù)測(cè)框的大小,以避免離相機(jī)太遠(yuǎn)或太近的情況,接下來(lái)通過(guò)幀間關(guān)鍵點(diǎn)檢測(cè),確保人臉沒(méi)有大幅度位移和轉(zhuǎn)向,保證圖片的清晰度,然后根據(jù)人臉檢測(cè)框裁切出人臉圖片,最后是曝光度和清晰度檢查,值得注意的是程序會(huì)先裁切出人臉,然后再做以上兩個(gè)檢測(cè),目的是只檢查人臉部分的曝光度和清晰度,而不需要考慮背景。
2.3.1 后端人臉識(shí)別技術(shù)
FaceNet是一個(gè)通用的系統(tǒng),可以用于人臉驗(yàn)證、識(shí)別和聚類(lèi)。FaceNet采用的方法是通過(guò)卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)將圖像映射到歐幾里得空間??臻g距離直接和圖片相似度相關(guān):同一個(gè)人的不同圖像在空間距離很小,不同人的圖像在空間中有較大的距離。FaceNet使用TripletsLoss函數(shù)訓(xùn)練神經(jīng)網(wǎng)絡(luò),使得網(wǎng)絡(luò)直接輸出128維度的特征向量,向量的歐氏距離即可用于度量人臉相似度。以下是模型的架構(gòu)圖。FaceNet在LFW數(shù)據(jù)集上,準(zhǔn)確率為0.9963%,在YouTubeFacesDB數(shù)據(jù)集上,準(zhǔn)確率為0.9512[3]。
2.3.2 人臉識(shí)別模型優(yōu)化、訓(xùn)練與測(cè)試
雖然在GitHub上,davidsandberg提供了在CASIA WebFace和VGGFace2兩個(gè)大型人臉數(shù)據(jù)庫(kù)上訓(xùn)練出來(lái)的預(yù)訓(xùn)練模型,且在LFW數(shù)據(jù)集上準(zhǔn)確度分別達(dá)到0.99和0.996,但是由于訓(xùn)練集和驗(yàn)證集都是外國(guó)人臉,在預(yù)測(cè)亞洲人臉上可能會(huì)有一定的精度丟失,所以作者在亞洲人臉數(shù)據(jù)集CASIA FaceV5中嘗試了訓(xùn)練FaceNet模型,CASIA FaceV5數(shù)據(jù)集包含了來(lái)自500個(gè)人的2500張亞洲人臉圖片。
為了驗(yàn)證訓(xùn)練的成果的有效性,作者做了如下測(cè)試:分別用以上兩個(gè)模型對(duì)同一個(gè)亞洲人進(jìn)行測(cè)試,然后比較得到的歐氏距離,如果我們訓(xùn)練的模型的歐氏距離比官方的模型要小,說(shuō)明我們的訓(xùn)練是有效的。
作者找了兩張本人不同時(shí)期的照片進(jìn)行測(cè)試,運(yùn)行train/compare.py比較圖片相似度,結(jié)果發(fā)現(xiàn)作者訓(xùn)練的模型計(jì)算出歐氏距離為0.6545而官方預(yù)訓(xùn)練模型計(jì)算出歐氏距離為0.737,可見(jiàn)訓(xùn)練的成果還是不錯(cuò)的。
2.3.3 Annoy算法實(shí)現(xiàn)快速查找相近人臉
Annoy全稱(chēng)是Approximate Nearest Neighbors Oh Yeah[4],是通過(guò)建立一種二叉樹(shù)索引結(jié)構(gòu),使得查詢(xún)一個(gè)點(diǎn)的近鄰點(diǎn)的時(shí)間復(fù)雜度為O(logn)。
假設(shè)需要建立索引的點(diǎn)在二維空間中。首先隨機(jī)選擇兩個(gè)點(diǎn),以這兩個(gè)節(jié)點(diǎn)為初始中心節(jié)點(diǎn),執(zhí)行聚類(lèi)數(shù)為2的Kmeans算法,最終產(chǎn)生收斂后兩個(gè)聚類(lèi)中心點(diǎn)。在兩個(gè)聚類(lèi)中心點(diǎn)之間連一條線(xiàn)段(灰色短線(xiàn)),建立這條灰線(xiàn)的垂直平分線(xiàn)(黑色粗線(xiàn))。這條黑色粗線(xiàn)把數(shù)據(jù)空間分成兩部分。在劃分的子空間內(nèi)進(jìn)行不停的遞歸迭代繼續(xù)劃分,直到每個(gè)子空間最多只剩下K個(gè)數(shù)據(jù)節(jié)點(diǎn)。
最終原始數(shù)據(jù)會(huì)形成二叉樹(shù)結(jié)構(gòu):二叉樹(shù)底層是葉子節(jié)點(diǎn)記錄原始數(shù)據(jù)節(jié)點(diǎn),其他中間節(jié)點(diǎn)記錄的是分割超平面的信息。我們通常會(huì)建立多個(gè)二叉搜索樹(shù),來(lái)提高Annoy搜索算法的準(zhǔn)確度。
查找的過(guò)程就是不斷判斷查詢(xún)點(diǎn)位于分割超平面的哪一邊。從二叉樹(shù)索引結(jié)構(gòu)來(lái)看,就是從根節(jié)點(diǎn)不停的往葉子節(jié)點(diǎn)查詢(xún)的過(guò)程。通過(guò)對(duì)查詢(xún)點(diǎn)和每個(gè)節(jié)點(diǎn)(分割超平面相關(guān)信息)進(jìn)行相關(guān)計(jì)算來(lái)確定往這個(gè)節(jié)點(diǎn)左孩子節(jié)點(diǎn)走還是右孩子節(jié)點(diǎn)走。如果分割超平面的兩邊都很相似,那將會(huì)兩邊都查詢(xún)。直到查詢(xún)到葉子節(jié)點(diǎn),返回葉子節(jié)點(diǎn)。
成果應(yīng)用如圖1-圖4所示。
圖1:監(jiān)考員信息展示界面
圖2:識(shí)別成功
圖3:考試列表界面
圖4:簽到情況展示界面
作者以微信小程序?yàn)榍岸撕虵lask為后端,設(shè)計(jì)出基于Tensor-Flow深度學(xué)習(xí)框架的人臉考試簽到方案,并開(kāi)發(fā)出一套完整的注冊(cè)登錄和查看學(xué)生簽到情況的后臺(tái)系統(tǒng)。人臉考試簽到系統(tǒng)利用前沿的深度學(xué)習(xí)技術(shù),在提高學(xué)??荚嚭灥焦ぷ餍实耐瑫r(shí),降低了人工簽到成本,為學(xué)校實(shí)現(xiàn)教學(xué)信息化提供了新方案和參考依據(jù)。