1. 程式人生 > >人臉識別技術原理與工程實踐(10個月人臉識別領域實戰總結)

人臉識別技術原理與工程實踐(10個月人臉識別領域實戰總結)

1人臉識別應用場景(驗證)

我們先來看看人臉識別的幾個應用。第一個是蘋果的FACE ID,自從蘋果推出FaceID後,業界對人臉識別的應用好像信心大增,各種人臉識別的應用從此開始“野蠻生長”。

事實上,人臉識別技術在很多場景的應用確實可以提升認證效率,同時提升使用者體驗。前兩年,很多機場安檢都開始用上了人臉驗證;今年4月,很多一、二線城市的火車站也開通了“刷臉進站”的功能;北京的一些酒店開始使用人臉識別技術來做身份驗證。

 

2 人臉識別應用場景(識別)

我們再來看看幾個場景。

 

第一個是刷臉的自動售貨機。當我第一次看到這個機器的時候就有個疑問:”現在人臉識別演算法已經做到萬無一失了嗎,認錯人,扣錯錢怎麼辦?”,後來才發現,其實關鍵不在於演算法,產品設計才是最重要的。用過這個售貨機的人可能知道,第一次使用的時候,要求輸入手機號的後四位,這個看似簡單的產品設計,可以讓自動售貨機的誤識別率降低到億分之一,這樣底概率的條件下,誤識別帶來的損失完全可以忽略。同時這款自動售貨機還會提醒你,你的消費行為會繫結“芝麻信用”,想想有多少人會為了一瓶“可樂”去影響自己的徵信記錄呢?

第二個是刷臉買咖啡,進入咖啡店後,在你選好和什麼咖啡前,系統已經識別出站在點單臺前的使用者是誰,並做好點單準備;

第三個是在人臉門禁系統。小夥伴們再已不用擔心忘記帶工卡了。人臉門禁對識別速度和準確度的要求是相對較高的,裝置掛在門的側面牆也會影響體驗,增加產品設計和開發的難度。

 

3 “人臉驗證”還是“人臉識別”?

其實,前面兩頁的場景是有些區別的,不知道大家看出來了沒有。

第一個的場景,使用者實際提供了兩個資訊,一是使用者的證件資訊,比如身份證號碼,或APP賬號;另一個資訊是使用者的現場照片;這類場景的目標實際上是:讓人臉識別系統驗證現場照片是否是證件所宣稱的那個人。我們把這類場景叫著“人臉驗證”。

第二個的場景,使用者實際只提供的現場照片,需要人臉識別系統判斷照片上的人是誰。我們把這類場景叫著“人臉識別”。

“人臉驗證”拿現場人臉跟使用者所宣稱的人臉做1比1的比較,而“人臉識別”是拿現場人臉跟後臺註冊人臉庫中的所有人臉比較,是1比N的搜尋。可以看出,兩種場景的技術原理一致,但是難度不同,第二頁場景的難度普遍比第一頁高得多。

 

4 人臉識別原理

計算機是怎麼識別人臉的呢?如果我們大家是人臉識別系統的設計者,我們應用怎樣來設計這個系統?

“把人臉區域從圖片中摳出來,然後拿摳出來的人臉跟事先註冊的人臉進行比較”,沒錯,就是這樣,說起來簡單,做又是另外一回事了,這裡又有兩個新的問題:

一是,“怎樣判斷圖片中是有沒有人臉?”,“怎樣知道人臉在圖片中的具體位置呢”,這是人臉檢測要解決的問題,人臉檢測告訴我們影象中是否有人臉以及人臉的具體位置座標。

二是,“我們怎樣比較兩個人臉是不是同一個人呢?”,一個畫素一個畫素比較嗎?光照,表情不一致,人臉偏轉都將導致該方法不可行。”人是怎樣判斷兩種照片中的人臉是不是同一個人的呢?”,我們是不是通過比較兩種照片上的人,是不是高鼻樑、大眼睛、瓜子臉這樣的面部特徵來做判斷的呢? 

我們來看一下計算機人臉識別的流程,首先是獲取輸入影象,然後檢測影象中是否有人臉,人臉的具體位置,然後判斷影象的質量,比如影象是否模糊,光照度是否足夠,然後檢測人臉偏轉的角度,旋轉人臉到一個正臉位置,再然後提取人臉特徵,比對人臉特徵,最後輸出識別結果。其中影象質量檢測和人臉對齊這兩步是可選的步驟,根據具體應用場景來決定。

 

5 人臉檢測-經典方法

我們來看看經典的人臉檢測方法。

OpenCV和Dlib是兩個常用的演算法庫。

OpenCV 中使用Haar Cascade來做人臉檢測,其實Haar Cascade可以檢測任何物件,比如人臉和臉上眼睛的位置。

DLIB中是使用方向梯度直方圖(Histogram of Oriented Gradient, HOG),即通過計算影象區域性區域的梯度方向直方圖來提取特徵,這種方法的本質在於梯度的統計資訊,而梯度主要存在於邊緣的地方。

OpenCV和DLIB各自也有他們自己的基於深度學習的人臉檢測方法,使用起來非常簡單。從這幾種方法都可以做到CPU實時或GPU實時;經典的檢測方法對正臉的檢測效果比較好,深度學習的方法適應性更強,可以檢測各種角度的人臉。

 

6 MTCNN人臉檢測

2016年提出來的MTCNN演算法是目前公認比較好的人臉檢測演算法是(Multi-task Cascaded Convolutional Networks),可以同時實現face detection和alignment,也就是人臉檢測和對齊。

這裡的對齊指的是檢測人臉眼睛、鼻子、嘴巴輪廓關鍵點LandMark。

MTCNN演算法主要包含三個子網路:P-Net (Proposal Network)、 R-Net(Refine Network)、O-Net(Output Network),這3個網路按照由粗到細的方式處理輸入照片,每個網路有3條支路用來分別做人臉分類、人臉框的迴歸和人臉關鍵點定位。

左上角,最開始對在多個尺度上對影象做了resize,構成了影象金字塔,然後這些不同尺度的影象作為P、P、O網路的輸入進行訓練,目的是為了可以檢測不同尺度的人臉。

P-Net主要用來生成候選人臉框。 R-Net主要用來去除大量的非人臉框。O-Net和R-Net有點像,在R-NET基礎上增加了landmark位置的迴歸,最終輸出包含一個或多個人臉框的位置資訊和關鍵點資訊。

 

7 人臉特徵提取-經典方法

接下來,我們來看一下人臉特徵提取。經典的人臉特徵提取方法有EigenFace和FisherFace兩種。

EigenFace的思想是把人臉從畫素空間變換到另一個空間,在另一個空間中做相似性的計算。EigenFace的空間變換方法是主成分分析PCA。這個方法90年代開始應用於人臉識別,因為主成分有人臉的形狀,所以也稱為“特徵臉”。

FisherFace是一種基於線性判別分析LDA(全稱Linear  Discriminant Analysis,)的人臉特徵提取演算法, LDA和PCA都是利用特徵值排序找到主元的過程。LDA強調的是不同人臉的差異而不是照明條件、人臉表情和方向的變化。所以,Fisherface對人臉光照、人臉姿態變化的影響更不敏感。

 

8 人臉特徵提取-深度學習法

我們再來看看深度學習法。

利用神經網路學習高度抽象的人臉特徵,然後將特徵表示為特徵向量,通過比較特徵向量之間的歐式距離來判定兩張照片是否是同一個人。

 

9人臉特徵提取-深度學習法

總體思路是把人臉識別人物當分類任務來訓練,通過在損失函式上施加約束,讓相同的人的照片提取的特徵距離儘可能近,不是同一個人的照片的提取的特徵距離儘可能的遠。

第一個Logit的地方輸出的是人臉的特徵向量,一般是128維或者512維,浮點向量。這個Logit前面是CNN分類網路,這個Logit後面的部分是通過在損失函式上施加約束來訓練模型,讓模型區分相同的人和不同的人,後面的部分只需要在訓練階段計算,推理階段是不需要的。

 

10 人臉特徵提取-Metric Learning

基於深度學習的人臉特徵提取方法主要有兩類,一類Metric Learning,另一個是Additive Margin,這兩類方法的底層原理都是一樣的,就是“通過訓練網路,讓相同人的特徵距離儘可能近,不同人的特徵距離儘可能的遠”。

孿生網路和Triplet都屬於 Metric Learning這類方法。左邊孿生網路顧名思義,就是有兩個網路,一個網路訓練讓相同的人之間的距離儘可能的近,另一個網路讓不同人之間的距離儘可能遠。

右邊Triplet網路是對孿生網路的改進,將樣本組織為錨點、正樣本、負樣本的元組,通過訓練網路讓錨點與正樣本之間的距離儘可能的近,錨點與負樣本之間的距離儘可能的遠,並且至少遠於一個閥值阿爾法。

 

11 人臉特徵提取-Additive Margin

Additive Margin這類方法主要是在分類模型的基礎,通過控制損失函式來達到“讓相同人的特徵距離儘可能近,讓不同人的特徵距離儘可能遠”的目標。

前面介紹的Metric Learning的方法最大的問題在於:需要重新組織樣本,模型最終能否收斂很大程度上取決於取樣是不是合理。基於Additive Margin的方法則不需要這一步,完全將人臉特徵提取當做分類任務來訓練,引數的設定也不需要太多trick,Additive Margin的方法大都是在損失函式上做文章。

最近幾年,這個類方法研究的比較多,上面這個圖中的softmax,Sphereface,Cosface,ArcFace都是Additive Margin方法,可以看出它都是通過改進損失函式,來實現“讓相同人的特徵距離儘可能近,讓不同人的特徵距離儘可能遠”這個目標。

上面這個圖中,顏色相同的點表示一個人,不同的點表示不同的人,這個圖的展示比較形象,可以看出最後一個超球體的效果非常不錯。

Additive Margin正在成為主流, InsightFace也屬於這一類,損失函式正是這個ArcFace。

大家可用思考一下,為什麼分類方法不能直接用於人臉識別?這裡不做詳細討論了。

 

12 人臉特徵提取-效果評估

我們再來看一下怎樣評估人臉特徵提取演算法的效果。

主要是通過召回率和虛警率兩個指標來衡量。應用場景不同,這個兩個指標的設定也不同,一般情況下,在實踐中我們都要求在虛警率小於某個值(比如萬分之一)的條件下,召回率達到某個值(比如99%)。很多產品宣稱的識別準確率達到多少多少,很大可能是在公開資料集比如LFW上的測試結果。

公開的訓練資料集比較推薦的有:MS1MV2,這個資料集微軟前段事件已經宣佈撤回不再提供下載,這個資料集大概有85000個不同的人的380萬張照片。另一個數據集是GLINT_ASIA,有9萬多人的280萬張照片。

 

13 工程實踐的挑戰及經驗分享

很多人都認為人臉識別應用,演算法包打天下,事實並非如此,即使是最好的識別演算法也扛不住像影象質量差。影象質量差、姿勢變化、面部形狀/紋理隨著時間推移的變化、遮擋這些問題,是我們在工程實踐中面臨的挑戰。

當然,大多數問題工程上我們有應對方法。比如影象模糊,光照不足,我們可以先檢測影象是否模糊,關照是否不足,質量不過關,就不把影象送給識別演算法。

再比如,用他人照片或視訊來欺騙人臉識別系統,目前已經有多種活體檢測方法來檢測並防止這種情況。

經過一段時間在人臉識別領域的摸爬滾打,個人認為影響使用者體驗的關鍵因素是識別快、識別準,識別快主要靠產品設計,識別準主要靠演算法。

拿人臉門禁來舉個例子,產品設計上可以在前端採集照片的時候過濾掉模糊、無人臉的照片,避免無效識別,同時前端在採集照片的時候,可以同時採集多張併發傳給後臺,做併發識別,這些方法都可以大大提升識別通過的速度,提升使用者體