過去十年,深度學習(DL)領域出現了許多先進的新算法和突破性的研究,并且引入了新的計算機視覺算法。
這一切始于2012年的AlexNet。AlexNet是一個深度(卷積)神經網絡,它在ImageNet數據集(擁有超過1400萬張圖片的數據集)上取得了很高的準確率。
人類是怎樣識別面部的?
或許,人類大腦中的神經元首先識別場景中的人臉(從人的體形和背景),再提取面部特征,并通過這些特征對人進行分類。我們已經在一個無限大的數據集和神經網絡上進行了訓練。
機器中的面部識別是以同樣的方式實現的。首先,我們采用面部檢測算法來檢測場景中的人臉,然后從檢測到的人臉中提取面部特征,最后使用算法對人進行分類。
面部識別系統的工作流
1.人臉檢測
人臉檢測是物體檢測的一個特化版本,特別之處在于,它只檢測一種物體,即人臉。就像計算機科學里需要權衡時間和空間,ML算法也需要在推理速度和準確性之間進行權衡。現在有很多物體檢測算法,不同算法對速度和準確性的取舍有所不同。
本文評估了如下幾個最先進的物體檢測算法:
為了構建一個強大的人臉檢測系統,我們需要準確且快速的算法,以滿足在GPU以及移動設備上實時運行的需要。
準確度
在流媒體視頻的實時推理中,人們的面部可能有不同的姿勢、遮擋和照明效果。故此,算法能在不同的光照條件和不同姿態下精確檢測人臉非常重要。
在不同的姿態和光照條件下的人臉檢測
OpenCV(Haar-ascade)
我們從OpenCV的Haar-cascade實現開始,它是一個用C語言編寫的開源圖像處理庫。
優點:由于這個庫是用C語言編寫的,所以它在實時系統中的推理速度非常快。
缺點:這個實現的問題是它無法檢測側臉,而且在不同姿態和光照條件下表現欠佳。
MTCNN
這種算法基于深度學習方法。它使用深度級聯卷積神經網絡(Deep Cascaded Convolutional Neural Networks)來檢測人臉。
優點:它比OpenCV的Haar-Cascade方法準確性更高
缺點:運行時間較長。
YOLOV3
YOLO(“You only look once”)是用于物體檢測的最先進的深度學習算法。它由許多卷積神經網絡組成,形成一個深度CNN模型(深度意味著模型架構復雜性很高)。
原始的YOLO模型可以檢測80個不同的物體類別,而且檢測精度很高,而我們只需要用該模型檢測一個物體——人臉。我們在WiderFace(包含393,703個面部標簽的圖像數據集)數據集上訓練了這個算法。
YOLO算法還有一個微型版本,即Yolo-Tiny。Yolo-Tiny需要的計算時間比較少,但卻犧牲了一些準確性。我們用相同的數據集訓練了一個Yolo-Tiny模型,其邊界框(boundary box)結果并不一致。
優點:非常準確,沒有任何缺陷。比MTCNN更快。
缺點:由于具有巨大的深度神經網絡層,它需要的計算資源更多。故此,該算法在CPU或移動設備上運行地很慢。在GPU上,它的大型架構也需要耗費更多的VRAM。
SSD
SSD(Single Shot Detector)也是一個類似YOLO的深度卷積神經網絡模型。
優點:良好的準確性。它可以檢測各種姿勢、光照和遮擋。良好的推理速度。
缺點:比YOLO模型差。雖然推理速度較好,但仍不能滿足在CPU、低端GPU或移動設備上運行的要求。
BlazeFace
就像它的名字一樣,它是由谷歌發布的速度極快的人臉檢測算法。它接受128x128維的圖像輸入,推理時間是亞毫秒級,已優化到可以在手機中使用。它速度這么快的原因是:
優點:非常好的推理速度,且人臉檢測的準確率高。
缺點:這個模型的優化目標是對手機攝像頭獲取的圖像進行人臉檢測,故此它預期人臉會覆蓋圖像中的大部分區域,而當人臉尺寸較小時,它的識別效果就是很好。所以,當對閉路電視攝像機獲取的(CCTV,Closed Circuit Tele Vision)圖像進行人臉檢測時,它表現得并不理想。
Faceboxes
Faceboxes是我們使用的最新的人臉檢測算法。與BlazeFace類似,它是一個小型的深度卷積神經網絡,只為檢測一種類別——人臉而設計。它的推理時間可滿足CPU上的實時檢測需求。它的準確度可以與Yolo人臉檢測算法相媲美,而且,不管圖像中的人臉較大還是較小,它都可以精確地檢測。
優點:推理速度快,準確性好。
缺點:評估仍在進行中。
2.特征提取
在檢測到圖像中的人臉后,我們對人臉進行裁剪,并將其送入特征提取算法,該算法創建面部嵌入(face-embeddings)——一個代表人臉特征的多維(主要是128或512維)向量。我們使用FaceNet算法來創建面部嵌入。
嵌入向量代表一個人的面部特征。故此,同一個人的兩個不同圖像的嵌入向量之間的距離比較接近,而不同人的嵌入向量之間的距離比較遠。其中,兩個向量之間的距離采用的是歐氏距離。
3.面部分類
在得到面部嵌入向量后,我們訓練了一種分類算法,即K-近鄰(K-nearest neighbor,KNN)算法,根據一個人的嵌入向量對其進行分類。
假設在一個組織中,有1000名員工。我們創建了所有員工的面部嵌入,并使用嵌入向量訓練分類算法。該算法以面部嵌入向量作為輸入,以人的名字作為輸出返回。
在把圖片放到網上前,用戶可以采用過濾器修改圖片中的特定像素。人眼無法察覺這些變化,但它會讓面部識別算法覺得很困惑。——ThalesGroup
眼下,面部識別算法已經取得了巨大的進步。但這僅僅是技術革命的開始。可以想象一下,未來面部識別算法和聊天機器人技術的聯合起來是多么強大。