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

李一二發表於2020-07-11
一、人臉識別概述
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

相關文章