我們知道人臉識別在這幾年應用的相當廣泛,目前已有人臉考勤、人臉社交、人臉支付等一系列使用場景。“人臉識別”這項“黑科技”對生活中的各個領域都產生了非常重要的影響,特別這幾年機器學習的流行,使得人臉識別在應用和準確率更是達到了一個較高的水準。
下面將帶著大家揭秘下這項黑科技的原理。
人臉識別流程:
人臉識別是由以下步驟組成
利用HOG算法找出所有人臉。
對人臉進行landmark,對齊人臉。
利用神經網絡找出人臉的特點,編碼人臉。
計算兩張人臉的歐氏距離,確定是否是同一人。
簡易流程圖如下:
第一步:找出所有面孔
很顯然在我們在人臉識別的流程中得首先找到圖片中的人臉。我們在使用手機或相機拍照時都會有人像模式,它能輕松的檢測出人臉的位置,幫助相機快速對焦。
對于找出圖片中的物體,我們統稱為 OD (Object Detection 物體檢測),物體檢測業界有很多優秀的算法和框架可以使用,對于人臉檢測我們將使用一種叫做 HOG(Histogram of Oriented Gradients 方向梯度直方圖)的算法,它能夠檢測物體的輪廓。
首先我們把圖片灰度化,因為顏色信息對于人臉檢測而言沒什么用。
我們分析每個像素以及其周圍的像素,根據明暗度畫一個箭頭,箭頭的指向代表了像素逐漸變暗的方向,如果我們重復操作每一個像素,最終像素會被箭頭取代。這些箭頭被稱為梯度(gradients),它們能顯示出圖像從明亮到黑暗流動的過程。
分析每個像素對我們來說有點不劃算,因為它太過細節化了,我們可能會迷失在像素的海洋里,我們應該從更高的角度觀察明暗的流動。
為此我們將圖像分割成16x16像素的小方塊。在每個小方塊中,計算出每個主方向有多少個梯度(有多少指向上,指向右上,指向右等)。然后用指向性最強的那個方向箭頭來代替原來那個小方塊。
最終結果,我們把原始圖像轉換成一個非常簡單的HOG表達形式,它可以很輕松的捕獲面部的基本結構。
為了在HOG圖像中找到臉部,我們需要做的是,與已知的一些HOG圖案中,匹配最相似的部分。這些HOG圖案都是重其他面部訓練數據中提取出來的。
第二步:臉部的不同姿勢
我們已經找出了圖片中的人臉,那么如何鑒別面朝不同方向的人臉呢?
對于電腦來說,朝向不同的人臉是不同的識別內容,為此我們需要適當的調整扭曲圖片中的人臉,使得眼睛和嘴總是與被檢測者重疊。
為了達到目的我們將使用一種面部特征點估計(face landmark estimation)的算法。其實還有很多算法都可以做到,但我們這次使用的是由瓦希德·卡奇米(Vahid Kazemi)和約瑟菲娜·沙利文(Josephine Sullivan)在 2014 年發明的方法。
這一算法的基本思路是找到68個人臉上普遍存在的點(稱為特征點, landmark)
? 下巴輪廓17個點 [0-16]
? 左眉毛5個點 [17-21]
? 右眉毛5個點 [22-26]
? 鼻梁4個點 [27-30]
? 鼻尖5個點 [31-35]
? 左眼6個點 [36-41]
? 右眼6個點 [42-47]
? 外嘴唇12個點 [48-59]
? 內嘴唇8個點 [60-67]
有了這68個點,我們就可以輕松的知道眼睛和嘴巴在哪兒了,后續我們將圖片進行旋轉,縮放和錯切,使得眼睛和嘴巴盡可能的靠近中心。
現在人臉基本上對齊了,這使得下一步更加準確
第三步:給臉部編碼
我們還有個核心的問題沒有解決, 那就是如何區分不同的人臉。
最簡單的方法就是把我們第二步中發現的未知人臉與我們已知的人臉作對比。當我們發現未知的面孔與一個以前標注過的面孔看起來相似的時候,就可以認定他們是同一個人。
我們人類能通過眼睛大小,頭發顏色等等信息輕松的分辨不同的兩張人臉,可是電腦怎么分辨呢?沒錯,我們得量化它們,測量出他們的不同。那要怎么做,才能得出測量人臉的最可靠的方法?以及如何測量人臉的數值呢?例如耳朵大小、鼻子長度、眼睛的顏色。
實際上,人類對于人臉這些信息很容易分辨,可是對于計算機,這些信息沒什么價值。實際上最準確的方法是讓計算機自己找出他要收集的測量值。深度學習,比人類更懂得哪些面部測量值比較重要。
所以,解決方案是訓練一個深度卷積神經網絡,訓練讓它為臉部生成128個測量值。
每次訓練要觀察三個不同的臉部圖像:
1. 加載一張已知的人的面部訓練圖像
2. 加載同一個人的另一張照片
3. 加載另外一個人的照片
然后,算法查看它自己為這三個圖片生成的測量值。再然后,稍微調整神經網絡,以確保第一張和第二張生成的測量值接近,而第二張和第三張生成的測量值略有不同。
我們要不斷的調整樣本,重復以上步驟百萬次,這確實是個巨大的挑戰,但是一旦訓練完成,它能攻輕松的找出人臉。
慶幸的是 OpenFace 上面的大神已經做完了這些,并且他們發布了幾個訓練過可以直接使用的網絡,我們可以不用部署復雜的機器學習,開箱即用,感謝開源精神。
這128個測量值是什么鬼?
其實我們不用關心,這對我們也不重要。我們關心的是,當看到同一個人的兩張不同照片時,我們的網絡需要能得到幾乎相同的數值。
第四步:從編碼中找出人的名字
最后一步實際上是最簡單的一步,我們需要做的是找到數據庫中與我們的測試圖像的測量值最接近的那個人。
如何做呢,我們利用一些現成的數學公式,計算兩個128D數值的歐氏距離
哈,這樣我們得到一個歐式距離值,系統將給它一個認為是同一個人歐氏距離的閥值,即超過這個閥值我們就認定他們是 同 (失) 一 (散) 個 (兄) 人 (弟)。
人臉識別就這樣達成啦,來來我們再回顧下流程:
使用HOG找出圖片中所有人臉的位置。
計算出人臉的68個特征點并適當的調整人臉位置,對齊人臉。
把上一步得到的面部圖像放入神經網絡,得到128個特征測量值,并保存它們。
與我們以前保存過的測量值一并計算歐氏距離,得到歐氏距離值,比較數值大小,即可得到是否同一個人。
人臉識別應用場景
人臉識別分兩大步驟,人臉檢測和人臉識別,它們應用場景也各不相同。
人臉檢測實質上是實現找出人臉,得到人臉的位置的功能,我們可以在美顏,換膚,摳圖,換臉的一些場景中使用到它。我們可以通過系統API調用相機完成對預覽針的實時渲染,那些看上去的黑科技我們也可以玩啦。
人臉識別則可以應用在會員、支付等場景,帶給用戶更酷炫的使用體驗,大家快來試試吧。
-
人臉識別
+關注
關注
76文章
4011瀏覽量
81860 -
機器學習
+關注
關注
66文章
8406瀏覽量
132566
發布評論請先 登錄
相關推薦
評論