功能描述:
在深度學習出現后,人臉識別技術才真正有了可用性。這是因為之前的機器學習技術中,難以從圖片中取出合適的特征值。輪廓?顏色?眼睛?如此多的面孔,且隨著年紀、光線、拍攝角度、氣色、表情、化妝、佩飾掛件等等的不同,同一個人的面孔照片在照片象素層面上差別很大,憑借專家們的經驗與試錯難以取出準確率較高的特征值,自然也沒法對這些特征值進一步分類。深度學習的最大優勢在于由訓練算法自行調整參數權重,構造出一個準確率較高的f(x)函數,給定一張照片則可以獲取到特征值,進而再歸類。本文中筆者試圖用通俗的語言探討人臉識別技術,首先概述人臉識別技術,接著探討深度學習有效的原因以及梯度下降為什么可以訓練出合適的權重參數,最后描述基于CNN卷積神經網絡的人臉識別。
一、人臉識別技術概述
人臉識別技術大致由人臉檢測和人臉識別兩個環節組成。
之所以要有人臉檢測,不光是為了檢測出照片上是否有人臉,更重要的是把照片中人臉無關的部分刪掉,否則整張照片的像素都傳給f(x)識別函數肯定就不可用了。人臉檢測不一定會使用深度學習技術,因為這里的技術要求相對低一些,只需要知道有沒有人臉以及人臉在照片中的大致位置即可。一般我們考慮使用opencv、dlib等開源庫的人臉檢測功能(基于專家經驗的傳統特征值方法計算量少從而速度更快),也可以使用基于深度學習實現的技術如mtcnn(在神經網絡較深較寬時運算量大從而慢一些)。
在人臉檢測環節中,我們主要關注檢測率、漏檢率、誤檢率三個指標,其中:
檢測率:存在人臉并且被檢測出的圖像在所有存在人臉圖像中的比例;
漏檢率:存在人臉但是沒有檢測出的圖像在所有存在人臉圖像中的比例;
誤檢率:不存在人臉但是檢測出存在人臉的圖像在所有不存在人臉圖像中的比例。
當然,檢測速度也很重要。本文不對人臉檢測做進一步描述。
在人臉識別環節,其應用場景一般分為1:1和1:N。
1:1就是判斷兩張照片是否為同一個人,通常應用在人證匹配上,例如身份證與實時抓拍照是否為同一個人,常見于各種營業廳以及后面介紹的1:N場景中的注冊環節。而1:N應用場景,則是首先執行注冊環節,給定N個輸入包括人臉照片以及其ID標識,再執行識別環節,給定人臉照片作為輸入,輸出則是注冊環節中的某個ID標識或者不在注冊照片中。可見,從概率角度上來看,前者相對簡單許多,且由于證件照通常與當下照片年代間隔時間不定,所以通常我們設定的相似度閾值都是比較低的,以此獲得比較好的通過率,容忍稍高的誤識別率。
而后者1:N,隨著N的變大誤識別率會升高,識別時間也會增長,所以相似度閾值通常都設定得較高,通過率會下降。這里簡單解釋下上面的幾個名詞:誤識別率就是照片其實是A的卻識別為B的比率;通過率就是照片確實是A的,但可能每5張A的照片才能識別出4張是A其通過率就為80%;相似度閾值是因為對特征值進行分類是概率行為,除非輸入的兩張照片其實是同一個文件,否則任何兩張照片之間都有一個相似度,設定好相似度閾值后唯有兩張照片的相似度超過閾值,才認為是同一個人。所以,單純的評價某個人臉識別算法的準確率沒有意義,我們最需要弄清楚的是誤識別率小于某個值時(例如0.1%)的通過率。不管1:1還是1:N,其底層技術是相同的,只是難度不同而已。
取出人臉特征值是最難的,那么深度學習是如何取特征值的?
假定我們給出的人臉照片是100*100像素大小,由于每個像素有RGB三個通道,每個像素通道由0-255范圍的字節表示,則共有3個100*100的矩陣計3萬個字節作為輸入數據。深度學習實際上就是生成一個近似函數,把上面的輸入值轉化為可以用作特征分類的特征值。那么,特征值可以是一個數字嗎?當然不行,一個數字(或者叫標量)是無法有效表示出特征的。通常我們用多個數值組成的向量表示特征值,向量的維度即其中的數值個數。特征向量的維度并非越大越好,google的facenet項目(參見https://arxiv.org/abs/1503.03832論文)做過的測試結果顯示,128個數值組成的特征向量結果最好,如下圖所示:
那么,現在問題就轉化為怎么把3*100*100的矩陣轉化為128維的向量,且這個向量能夠準確的區分出不同的人臉?
假定照片為x,特征值為y,也就是說存在一個函數f(x)=y可以完美的找出照片的人臉特征值。現在我們有一個f*(x)近似函數,其中它有參數w(或者叫權重w)可以設置,例如寫成f*(x;w),若有訓練集x及其id標識y,設初始參數p1后,那么每次f*(x;w)得到的y`與實際標識y相比,若正確則通過,若錯誤則適當調整參數w,如果能夠正確的調整好參數w,f*(x;w)就會與理想中的f(x)函數足夠接近,我們就獲得了概率上足夠高準確率的f*(x;w)函數。這一過程叫做監督學習下的訓練。而計算f*(x;w)值的過程因為是正常的函數運算,我們稱為前向運算,而訓練過程中比較y`與實際標識id值y結果后,調整參數p的過程則是反過來的,稱為反向傳播。
由于我們傳遞的x入參畢竟是一張照片,照片既有對焦、光線、角度等導致的不太容易衡量的質量問題,也有本身的像素數多少問題。如果x本身含有的數據太少,即圖片非常不清晰,例如28*28像素的照片,那么誰也無法準確的分辨出是哪個人。可以想見,必然像素數越多識別也越準,但像素數越多導致的計算、傳輸、存儲消耗也越大,我們需要有根據的找到合適的閾值。下圖是facenet論文的結果,雖然只是一家之言,但google的嚴謹態度使得數據也很有參考價值。
二、深度學習技術的原理
由清晰的人臉照轉化出的象素值矩陣,應當設計出什么樣的函數f(x)轉化為特征值呢?這個問題的答案依賴于分類問題。即,先不談特征值,首先如何把照片集合按人正確的分類?這里就要先談談機器學習。機器學習認為可以從有限的訓練集樣本中把算法很好的泛化。所以,我們先找到有限的訓練集,設計好初始函數f(x;w),并已經量化好了訓練集中x->y。如果數據x是低維的、簡單的,例如只有二維,那么分類很簡單,如下圖所示:
上圖中的二維數據x只有方形和圓形兩個類別y,很好分,我們需要學習的分類函數用最簡單的f(x,y)=ax+by+c就能表示出分類直線。例如f(x,y)大于0時表示圓形,小于0時表示方形。
給定隨機數作為a,c,b的初始值,我們通過訓練數據不斷的優化參數a,b,c,把不合適的L1、L3等分類函數逐漸訓練成L2,這樣的L2去面對泛化的測試數據就可能獲得更好的效果。然而如果有多個類別,就需要多條分類直線才能分出,如下圖所示:
這其實相當于多條分類函數執行與&&、或||操作后的結果。這個時候還可能用f1>0 && f2<0 && f3>0這樣的分類函數,但如果更復雜的話,例如本身的特征不明顯也沒有匯聚在一起,這種找特征的方式就玩不轉了,如下圖所示,不同的顏色表示不同的分類,此時的訓練數據完全是非線性可分的狀態:
這個時候,我們可以通過多層函數嵌套的方法來解決,例如f(x)=f1(f2(x)),這樣f2函數可以是數條直線,而f1函數可以通過不同的權重w以及激勵函數完成與&&、或||等等操作。這里只有兩層函數,如果函數嵌套層數越多,它越能表達出復雜的分類方法,這對高維數據很有幫助。例如我們的照片毫無疑問就是這樣的輸入。所謂激勵函數就是把函數f計算出的非常大的值域轉化為[0,1]這樣較小的值域,這允許多層函數不斷的前向運算、分類。
前向運算只是把輸入交給f1(x,w1)函數,計算出的值再交給f2(y1,w2)函數,依次類推,很簡單就可以得到最終的分類值。但是,因為初始的w權重其實沒有多大意義,它得出的分類值f*(x)肯定是錯的,在訓練集上我們知道正確的值y,那么事實上我們其實是希望y-f*(x)的值最小,這樣分類就越準。這其實變成了求最小值的問題。當然,y-f*(x)只是示意,事實上我們得到的f*(x)只是落到各個分類上的概率,把這個概率與真實的分類相比較得到最小值的過程,我們稱為損失函數,其值為loss,我們的目標是把損失函數的值loss最小化。在人臉識別場景中,softmax是一個效果比較好的損失函數,我們簡單看下它是如何使用的。
比如我們有訓練數據集照片對應著cat、dog、ship三個類別,某個輸入照片經過函數f(x)=x*W+b,前向運算得到該照片屬于這3個分類的得分值。此時,這個函數被稱為得分函數,如下圖所示,假設左邊關于貓的input image是一個4維向量[56,231,24,2],而W權重是一個4*3的矩陣,那么相乘后再加上向量[1.1,3.2,-1.2]可得到在cat、 dog、ship三個類別上的得分:
從上圖示例可見,雖然輸入照片是貓,但得分上屬于狗的得分值437.9最高,但究竟比貓和船高多少呢?很難衡量!如果我們把得分值轉化為0-100的百分比概率,這就方便度量了。這里我們可以使用sigmoid函數,如下圖所示:


聯系:highspeedlogic
QQ :1224848052
微信:HuangL1121
郵箱:1224848052@qq.com
網站:http://www.mat7lab.com/
網站:http://www.hslogic.com/
微信掃一掃:
|