Openface人臉識別的原理與過程:
https://zhuanlan.zhihu.com/p/24567586
原理可參考如下論文:
《OpenFace: A general-purpose face recognition library with mobile applications》
第一步:找出所有的面孔
我們流水線的第一步是人臉檢測。
我們的目標是找出并比較當前像素與直接圍繞它的像素的深度。然后我們要畫一個箭頭來代表圖像變暗的方向:
用梯度來代替像素這事看起來沒有明確目的,但其實背后的理由很充分。如果我們直接分析像素,同一個人明暗不同的兩張照片將具有完全不同的像素值。但是如果只考慮亮度變化方向(direction)的話,明暗圖像將會有同樣的結果。這使得問題變得更容易解決!
但是保存每個像素的梯度太過細節化了,我們最終很有可能「一葉障目不見泰山」。如果能從更高的角度上觀察基本的明暗流動,我們就可以看出圖像的基本規律,這會比之前更好。
為了做到這一點,我們將圖像分割成一些16×16像素的小方塊。在每個小方塊中,我們將計算出每個主方向上有多少個梯度(有多少指向上,指向右上,指向右等)。然后我們將用指向性最強那個方向的箭頭來代替原來的那個小方塊。
最終的結果是,我們把原始圖像轉換成了一個非常簡單的表達形式,這種表達形式可以用一種簡單的方式來捕獲面部的基本結構:
利用HOG去detector人臉
第二步為面部特征點估計(face landmark estimation)。
但這次我們會使用由瓦希德·卡奇米(Vahid Kazemi)和約瑟菲娜·沙利文(Josephine Sullivan)在2014年發明的方法ERT(集成回歸樹)
第三步:給臉部編碼
所以,解決方案是訓練一個深度卷積神經網絡(就像我們在第三章做的那樣)。但是,并不是讓它去識別圖片中的物體,這一次我們的訓練是要讓它為臉部生成128個測量值。通過訓練網絡來生成這個128個特征,使得這些特征具有如下關系:相同人的圖片距離盡可能接近,而不同人的照片距離盡可能遠。
每次訓練要觀察三個不同的臉部圖像(Triplet loss):
1.加載一張已知的人的面部訓練圖像
2.加載同一個人的另一張照片
3.加載另外一個人的照片
機器學習專業人士把每張臉的128個測量值稱為一個嵌入(embedding)。將復雜的原始數據(如圖片)縮減為可由計算機生成的一個數列的方法,在機器學習(特別是語言翻譯)中出現了很多次。我們正在使用的這種臉部提取方法是由Google的研究人員在2015年發明的,但也有許多類似方法存在。
該訓練網絡已經完成,我們只需要使用它即可生成128個特征值。
第四步:從編碼中找出人的名字
面部識別分類器:基于簡單線性SVM
總結:
1.使用HOG算法給圖片編碼,以創建圖片的簡化版本。使用這個簡化的圖像,找到其中看起來最像通用HOG面部編碼的部分。
2.通過找到臉上的主要特征點,找出臉部的姿勢。一旦我們找到這些特征點,就利用它們把圖像扭曲,使眼睛和嘴巴居中。
3.把上一步得到的面部圖像放入神經網絡中,神經網絡知道如何找到128個特征測量值。保存這128個測量值。
4.看看我們過去已經測量過的所有臉部,找出哪個人的測量值和我們要測量的面部最接近。這就是你要找的人!