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

圖1:監考員信息展示界面

圖2:識別成功

圖3:考試列表界面

圖4:簽到情況展示界面
作者以微信小程序為前端和Flask為后端,設計出基于Tensor-Flow深度學習框架的人臉考試簽到方案,并開發出一套完整的注冊登錄和查看學生簽到情況的后臺系統。人臉考試簽到系統利用前沿的深度學習技術,在提高學校考試簽到工作效率的同時,降低了人工簽到成本,為學校實現教學信息化提供了新方案和參考依據。