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