人臉識別學習筆記一:入門篇

一、人臉識別概述
1.人臉識別的困難之處
  • 不同個人之間的區別不大:大部分人臉的結構都很相似,甚至人臉器官的結構外形都很相似。
  • 人臉的外形很不穩定:人的面部表情多變,不同的觀察角度、光照條件等都會影響人臉的視覺圖像。
2.人臉識別的典型流程
  • 人臉檢測(Face Detection):人臉檢測用於確定人臉在圖像中的大小和位置,即解決“人臉在哪裏”的問題,把真正的人臉區域從圖像中裁剪出來,便於後續的人臉特徵分析和識別。

    中星微AI刷新WIDER FACE人臉檢測世界紀錄

  • 人臉對齊(Face Alignment):同一個人在不同的圖像序列中可能呈現出不同的姿態和表情,這種情況是不利於人臉識別的。所以有必要將人臉圖像都變換到一個統一的角度和姿態,這就是人臉對齊。

    人臉對齊例子

  • 人臉特徵表示(Feature Representation):人臉特徵表示是人臉識別中最爲重要的一步,它接受的輸入是標準化的人臉圖像,通過特徵建模得到向量化的人臉特徵,最後通過分類器判別得到識別的結果。

    一個完整的人臉識別流程

二、常用數據集

LFW:5749 人的13233張人臉圖像,其中有1680人有兩張或以上的圖像。

YouTube Faces DB:面部視頻數據集,包含3425個視頻,1595個不同的人。

CASIA-FaceV5:500個人的25000張亞洲人臉圖片。

其他數據集及其下載鏈接:都是百度雲下載

三、人臉檢測算法介紹
1.基於模版匹配的算法

早期的人臉檢測算法使用了模板匹配技術,即用一個人臉模板圖像與被檢測圖像中的各個位置進行匹配,確定這個位置處是否有人臉。然後可以使用一些機器學習算法用於解決該問題,包括神經網絡,支持向量機等。以上都是針對圖像中某個區域進行人臉-非人臉二分類的判別。

這種方法的代表性成果是Rowley等人提出來的算法:用一個20*20的人臉模板圖像和被檢測圖像的各個位置進行匹配,每次在被檢測圖像上截取出一個20*20的滑動窗口,將模板和窗口進行比較,就可以檢測窗口中是否包含人臉(模型參數的響應值高就說明包含人臉)。這種方法只能解決近似正面的人臉檢測問題,在其他角度的人臉檢測效果並不好。

基於模版匹配的人臉檢測算法

爲了解決多角度檢測問題,Rowly等人提出來了一個新的方法:整個系統由兩個神經網絡構成,第一個網絡用於估計人臉的角度,第二個用於判斷是否爲人臉。角度估計器輸出一個旋轉角度,然後用整個角度對檢測窗進行旋轉,然後用第二個網絡對旋轉後的圖像進行判斷,確定是否爲人臉。

多角度檢測的系統結構

Rowley的方法有不錯的精度,由於分類器的設計相對複雜而且採用的是密集滑動窗口進行採樣分類導致其速度太慢。

2.基於AdaBoost框架的算法

boost算法是基於PAC學習理論(Probably Approximately Correct,概率近似正確)而建立的一套集成學習算法。其根本思想在於通過多個簡單的弱分類器,構建出準確率很高的強分類器,PAC學習理論證實了這一方法的可行性。

在2001年Viola和Jones設計了一種人臉檢測算法。它使用簡單的Haar-like特徵和級聯的AdaBoost分類器構造檢測器,檢測速度較之前的方法有2個數量級的提高,並且保持了很好的精度,這就是著名的VJ框架。VJ框架是人臉檢測歷史上第一個最具有里程碑意義的一個成果,奠定了基於AdaBoost目標檢測框架的基礎。

用級聯AdaBoost分類器進行目標檢測的思想是:用多個AdaBoost分類器合作完成對候選框的分類,這些分類器組成一個流水線,對滑動窗口中的候選框圖像進行判定,確定它是人臉還是非人臉。

在這一系列AdaBoost分類器中,前面的強分類器設計很簡單,包含的弱分類器很少,可以快速排除掉大量的不是人臉的窗口,但也可能會把一些不是人臉的圖像判定爲人臉。如果一個候選框通過了第一級分類器的篩選即被判定爲人臉,則送入下一級分類器中進行判定,以此類推。如果一個待檢測窗口通過了所有的強分類器,則認爲是人臉,否則是非人臉。

分類器級聯進行判斷的示意圖

3.基於深度學習的算法

卷積神經網絡在圖像分類問題上取得成功之後很快被用於人臉檢測問題,在精度上大幅度超越之前的AdaBoost框架,當前已經有一些高精度、高效的算法。直接用滑動窗口加捲積網絡對窗口圖像進行分類的方案計算量太大很難達到實時,使用卷積網絡進行人臉檢測的方法採用各種手段解決或者避免這個問題。

  • Cascade CNN(Cascade Convolutional Neural Networks,級聯卷積神經網絡):Cascade CNN可以認爲是傳統技術和深度網絡相結合的一個代表,和VJ人臉檢測器一樣,其包含了多個分類器,這些分類器採用級聯結構進行組織,然而不同的地方在於,Cascade CNN採用卷積網絡作爲每一級的分類器。

算法流程:

  1. 構建多尺度的人臉圖像金字塔,12-net將密集的掃描這整幅圖像(不同的尺寸),快速的剔除掉超過90%的檢測窗口,剩下來的檢測窗口送入12-calibration-net調整它的尺寸和位置,讓它更接近潛在的人臉圖像的附近。

  2. 採用非極大值抑制(NMS)合併高度重疊的檢測窗口,保留下來的候選檢測窗口將會被歸一化到24x24作爲24-net的輸入,這將進一步剔除掉剩下來的將近90%的檢測窗口。和之前的過程一樣,通過24-calibration-net矯正檢測窗口,並應用NMS進一步合併減少檢測窗口的數量。

  3. 將通過之前所有層級的檢測窗口對應的圖像區域歸一化到48x48送入48-net進行分類得到進一步過濾的人臉候選窗口。然後利用NMS進行窗口合併,送入48-calibration-net矯正檢測窗口作爲最後的輸出。

Cascade CNN

  • MTCNN(Multi-task Cascaded Convolutional Networks,多任務卷積神經網絡):MTCNN是多任務的一個方法,它將人臉區域檢測和人臉關鍵點檢測放在了一起。同Cascade CNN一樣也是基於cascade的框架,但是整體思路更加巧妙合理。MTCNN總體來說分爲三個部分:PNet、RNet和ONet。

    MTCNN網絡結構

算法流程:

  1. 首先按不同比例縮放照片,形成圖片的特徵金字塔作爲P-Net輸入。
  2. P-Net主要獲得了人臉區域的候選窗口和邊界框的迴歸向量。並用該邊界框做迴歸,對候選窗口進行校準,然後通過NMS來合併高度重疊的候選框。
  3. 然後將候選框輸入R-Net網絡訓練,利用邊界框的迴歸值微調候選窗體,再利用NMS去除重疊窗體。
  4. O-Net功能與R-Net作用類似,只是在去除重疊候選窗口的同時顯示五個人臉關鍵點定位。
四、人臉識別算法介紹
1.早期算法
  • 基於幾何特徵的算法:人臉由眼睛、鼻子、嘴巴、下巴等部件構成,正因爲這些部件的形狀、大小和結構上的各種差異才使得世界上每個人臉千差萬別,因此對這些部件的形狀和結構關係的幾何描述,可以做爲人臉識別的重要特徵。幾何特徵最早是用於人臉側面輪廓的描述與識別,首先根據側面輪廓曲線確定若干顯著點,並由這些顯著點導出一組用於識別的特徵度量如距離、角度等。但是這類方法的精度一般都比較差。
  • 基於模板匹配的算法:從數據庫當中提取人臉模板,接着採取一定模板匹配策略,使抓取人臉圖像與從模板庫提取圖片相匹配,由相關性的高低和所匹配的模板大小確定人臉大小以及位置信息。
  • 子空間算法:子空間算法將人臉圖像當成一個高維的向量,將向量投影到低維空間中,投影之後得到的低維向量達到對不同的人具有良好的區分度。子空間算法的典型代表是PCA(Principal Component Analysis,主成分分析)和LDA(Linear Discriminant Analysis,線性判別分析)。PCA的核心思想是在進行投影之後儘量多的保留原始數據的主要信息,降低數據的冗餘信息,以利於後續的識別。LDA的核心思想是最大化類間差異,最小化類內差異,即保證同一個人的不同人臉圖像在投影之後聚集在一起,不同人的人臉圖像在投影之後被用一個大的間距分開。PCA和LDA最後都歸結於求解矩陣的特徵值和特徵向量。PCA和LDA都是線性降維技術,但人臉在高維空間中的分佈是非線性的,因此可以使用非線性降維算法,典型的代表是流形學習和核(kernel)技術。流形學習假設向量點在高維空間中的分佈具有某些幾何形狀,然後在保持這些幾何形狀約束的前提下將向量投影到低維空間中,這種投影是通過非線性變換完成的。
2.人工特徵+分類器

第二階段的人臉識別算法普遍採用了人工特徵 + 分類器的思路。分類器有成熟的方案,如神經網絡,支持向量機,貝葉斯等。這裏的關鍵是人工特徵的設計,它要能有效的區分不同的人。

描述圖像的很多特徵都先後被用於人臉識別問題,包括HOG(Histogram of oriented gradient,方向梯度直方圖)、SIFT(Scale-invariant Feature Transform,尺度不變特徵轉換 )、LBP(Local Binary Patterns,局部二值模式)等。它們中的典型代表是LBP特徵,這種特徵簡單卻有效。LBP特徵計算起來非常簡單,部分解決了光照敏感問題,但還是存在姿態和表情的問題。

聯合貝葉斯是對貝葉斯人臉的改進方法,選用LBP和LE作爲基礎特徵,將人臉圖像的差異表示爲相同人因姿態、表情等導致的差異以及不同人間的差異兩個因素,用潛在變量組成的協方差,建立兩張人臉的關聯。文章的創新點在於將兩個人臉表示進行聯合建模,在人臉聯合建模的時候,又使用了人臉的先驗知識,將兩張人臉的建模問題變爲單張人臉圖片的統計計算,更好的驗證人臉的相關性,該方法在LFW上取得了92.4%的準確率。

人工特徵的巔峯之作是出自2013年MSRA的"Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification" ,這是一篇關於如何使用高維度特徵在人臉驗證中的文章。作者主要以LBP爲例子,論述了高維特徵和驗證性能存在着正相關的關係,即人臉維度越高,驗證的準確度就越高。

MSRA"Feature Master"

3.基於深度學習的算法

第三個階段是基於深度學習的方法,自2012年深度學習在ILSVRC-2012大放異彩後,很多研究者都在嘗試將其應用在自己的方向,這極大的推動了深度學習的發展。卷積神經網絡在圖像分類中顯示出了巨大的威力,通過學習得到的卷積核明顯優於人工設計的特徵+分類器的方案。在人臉識別的研究者利用卷積神經網絡(CNN)對海量的人臉圖片進行學習,然後對輸入圖像提取出對區分不同人的臉有用的特徵向量,替代人工設計的特徵。

在前期,研究人員在網絡結構、輸入數據的設計等方面嘗試了各種方案,然後送入卷積神經網絡進行經典的目標分類模型訓練;在後期,主要的改進集中在損失函數上,即迫使卷積網絡學習得到對分辨不同的人更有效的特徵,這時候人臉識別領域徹底被深度學習改造了!

DeepFace由Facebook提出,是深度卷積神經網絡在人臉識別領域的奠基之作,文中使用了3D模型來做人臉對齊任務,深度卷積神經網絡針對對齊後的人臉Patch進行多類的分類學習,使用的是經典的交叉熵損失函數進行問題優化,最後通過特徵嵌入得到固定長度的人臉特徵向量。Backbone網絡使用了多層局部卷積結構,原因是希望網絡的不同卷積核能學習人臉不同區域的特徵,但會導致參數量增大,要求數據量很大,回過頭去看該策略並不是十分必要。

DeepFace在LFW上取得了97.35%的準確率,已經接近了人類的水平。相比於1997年那篇基於卷積神經網絡的40個人400張圖的數據規模,Facebook蒐集了4000個人400萬張圖片進行模型訓練。

DeepFace

之後Google推出FaceNet,使用三元組損失函數(Triplet Loss)代替常用的Softmax交叉熵損失函數,在一個超球空間上進行優化使類內距離更緊湊,類間距離更遠,最後得到了一個緊湊的128維人臉特徵,其網絡使用GoogLeNet的Inception模型,模型參數量較小,精度更高,在LFW上取得了99.63%的準確率,這種損失函數的思想也可以追溯到早期的LDA算法。

FaceNet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章