總結兩點,第一,認出同一個人,不管你的狀態怎麼變,都能知道你就是你。第二、區分不同的人,可能這兩個人長得很像,或是兩個人都化妝了,但不管狀態怎麼變化,人臉辨識都能知道這是兩個不同的人。
人臉辨識本身是作為生物辨識技術的一種,主要是提供身分認證的手段,從精確度來講,人臉辨識並不是最高的。人臉辨識受到許多其他條件的影響,比如說光照。人臉辨識的好處在於一般不需要使用者做太多的配合,現在各個地方的監視器,包括電腦的攝影機、手機各種視訊輸入設備,照相設備已經非常非常的普及,用這種可見光的設備就可以做人臉辨識。所以在引入人臉辨識的時候可能新增加的投資是非常少的,這是它的優點。
人臉辨識的核心流程,所謂核心流程就是不管在什麼樣的人臉辨識系統裡面基本上都有這個流程。首先人臉偵測,第二步做人臉對齊,第三步做特徵提取,這是對每一張照片都要做的這三步,當要去做比對的時候就把提取的特徵做比對,然後確定這兩個臉是不是屬於同一個人。
人臉偵測即判斷一個大的場景中是否有人臉,並且要找到這個人臉的位置把它切出來。它是屬於物體偵測技術的一種,也是整個人臉感知任務的基礎。人臉偵測的基本方法就是在圖象金字塔上滑動窗口,並用分類器選擇候選窗口,並用迴歸模型進行位置修正。
上面畫的三個窗口,一個是0.3倍、0.6倍、1.0倍,當人臉位置不定,大小無法辨識時可採用此技術,讓這個圖本身變得大小不同,而滑動視窗的大小相同。深度網路一般輸入的圖像大小是固定的,那麼前面的滑動視窗基本上也是固定的。為了讓固定的滑動視窗能夠覆蓋不同的範圍的話,就對整個圖的大小進行縮放,取不同的比例。這邊畫0.3、0.6、1.0只是舉例,實際用的時候還可以有很多其他不同的倍數。
分類器是指看滑動視窗每一個滑到的位置去判斷是否是人臉,因為滑動視窗滑動到的位置有可能不包含整個人臉,或者說它比整個人臉大一點。為了找到的人臉能夠更精確,把滑動視窗放到迴歸模型裡,即可幫助修正人臉偵測的精確度。
輸入的是滑動窗口,輸出時如果裡面有人臉,應該向哪邊修正,以及它需要修正多少,所以Δx, Δy, Δw, Δh,就是它的座標以及它的寬與高大概修正多少。有了修正的量和用分類器確定它是人臉的窗口以後,把這兩個結合在一起,就能得到一個比較精確的人臉位置。
以上是人臉偵測的流程,同時也可適用於其他的物體偵測
#不管什麼樣的模型都是分速度和精度兩個方面
(1)速度是指定分辨率下的檢測速度
之所以指定分辨率,是因為滑動視窗每滑到一個位置都要做一次分類和回歸的判斷,所以當圖越大,需要做檢測判斷的視窗數可能就越多,整個人臉檢測花的時間就越長。
因此評價一個演算法或模型的好壞,就得在固定的解析度下面去看它的偵測速度到底是多少。一般來說這個偵測速度會是什麼樣的數值,可能就是做一張圖的人臉偵測所花費的時間,比如說100毫秒、200毫秒還是50毫秒、30毫秒之類的。
另外一種表示速度的方法就是多少fps,現在一般的網路攝影機往往是25fps或30fps,意思是每秒鐘能處理多少張圖,用fps的好處可以判斷人臉偵測是否可以做到即時偵測,只要人臉偵測的fps數大於相機的fps數就能夠做到即時,否則就做不到。
(2)速度是否受統一個畫面中的人臉數影響
從我們實際操作來說,大部分來說是不受影響的,因為主要是受滑動視窗的次數影響,命中的次數倒不是特別重,但稍微有那麼一點影響。
精準度,基本上用召回率、誤檢率、ROC曲線這些來判定。召回率即指這張照片是人臉,真正的模型判斷出來是人臉這個比例,誤檢率、負樣本錯誤率即指這張照片不是人臉,但是誤判斷成人臉的比例。
ACC精度
ACC計算方法是正確的樣本數除以總的樣本數,比如說拿一萬張照片去做人臉檢測,這一萬張照片裡面有的是有人臉的,有的是沒有人臉的。然後判斷對的比例是多少。
但是這個精確度有一個問題,如果用它去判斷,它對於正負樣本的比例是完全無關的,即他不關心在正樣本裡面正確率是多少,在負樣本裡面正確率是多少,只關心總的。當此模型精確度是90%時,別人不知道在正負樣本上面差異是多少。包括分類,包括迴歸,一般來說分類模型,會先用一個迴歸得到一個所謂置信度,置信度大於多少數值時認為他是,然後置信度小於同一個數值時認為他不是。
ACC統計模型是可調節的,即調整置信度,精度就會改變。
所以ACC值本身受樣本的比例影響很大,所以用它來表徵一個模型的好壞的話有點問題,當測試指標說達到了百分之九十九點幾,單看這個值,是比較容易受騙或說這個統計是有偏的。為了解決這個問題,一般現在會用一個叫做ROC的曲線來表徵這個模型的精確度
ROC受試者工作特徵曲線
橫座標:FPR(False Positive Rate)即負樣本錯誤率
縱座標:TPR(True Positive Rate)即正樣本正確率
可以區分演算法在正樣本和負樣本上的效能,且曲線形狀與正負樣本比例無關。
ROC(Receiver Operating Characteristic)曲線就是把橫座標、縱座標用這個負樣本錯誤率和正樣本正確率兩個標出來,這樣的話同一個模型在這個圖上面看到的不是一個點,或者說不是單一的數據,而是一條線。這條線即置信度的閾值,你調的越高就越嚴格,越低就越不嚴格。在這個上面的話就能反應出這個置信度的閾值的變化對它的影響。
以後大家最好不要直接問說你的精確度是多少,而是看ROC曲線,這樣比較容易判斷模型的能力到底怎麼樣。
人臉對齊的目的使人臉紋理盡可能調整到標準位置,降低人臉辨識器的難度。
為了用人為的方式降低它的難度,就可以先把它做對齊,就是讓檢測到這個人的眼睛、鼻子、嘴巴全部歸到同一個位置去,這樣的話模型在比對的時候,就只要找同樣位置附近,互相是不是相同還是相近,還是有很大不同。所以就是會做對齊的這麼一步,這一步的話,我們現在常用的做法就是二維的做法,就是到這個圖裡面去找到關鍵特徵點,一般現在就是五點的、十九點的,六十幾個點,八十幾個點的各種都有。但人臉辨識的話五個基本上就夠了。
這五個點之外的其他點的圖象,可以認為它是做一個類似於插值的運算,然後把它貼到那個位置去,做完了以後,就可以送到後面的人臉辨識器裡面去做辨識了。這是一般的做法,還有更前沿的做法,有的研究機構在使用所謂的3D人臉對齊,就是我告訴你說一張正臉是什麼樣子的,比如旋轉45度的時候長什麼樣子,那麼用這種圖給他訓練過了以後,他就知道我看到一張向左右旋轉了45度這張圖,大概轉正了以後有很大可能性是什麼樣子的,這個模型能去猜。
以前的傳統方法是所謂的局部紋理模型,全域紋理模型,形狀回歸模型之類的這些都有。現在比較流行的就是用深度的捲積神經網路或是循環神經網絡,或是3DMM參數的捲積神經網路。所謂3DMM參數的話就是有三維的資訊在裡面,然後有級聯的深度神經網路。
級聯的深度神經網絡,即拿到人臉,首先要推測五個點的位置,如果用一個單一的模型一次就要做到這一點的話,這個模型會需要很複雜。
但是怎麼能夠降低這個模型的複雜程度呢?
即做多次輸入,第一次輸入這個網絡以後先做一次推測,這個推測是一個可接受的不那麼精確的推測,大概知道人臉的五個點在哪裡。然後把這五個點和那張原圖放到第二個網絡裡面去,得到大概的修正量,有了一個基礎五個點以後再求修正量的話會比直接從原圖上面找精確的五個點要稍微容易一些。所以用這種逐步求精的方式用多個網路級聯在一起就能夠做到一個速度跟精度的比較好的平衡,實際現在做的時候基本上用兩層就大概差不多了。
NRMSE(Normalized Root Mean Square Error)即歸一化均方根誤差
用於衡量各個特徵點座標與標註座標的差距。
為了能夠讓不同大小的人臉也能夠放在一起互相比較,採用統計學上叫做歸一化均方根誤差。舉個栗子:我們在紙上畫五個點,然後讓機器來說這五個點的相互距離,所給的數值越接近真實距離,則表示預測越精準。一般來說預測的數值一定會有些偏差,那麼要怎麼表達這個精度值呢?我們通常會用距離的平均值或均方根值來表示。然而問題來了,相同的機器預測不同大小的影像,精度值會顯得不同,因為越大的圖誤差的絕對值會越高。換到不同大小的人臉道理也是一樣。因此,我們的解決方法是把人臉本來的尺寸數值考慮進去,一般分母是人的雙眼距離或人臉的對角線距離,再用距離差值除以雙眼之間的距離,或是除以人臉的對角線,這樣的話就可以得到一個基本上不隨著人臉大小而變化的一個值,用它來評測。
(1)目的:即判斷已經對齊好的兩張人臉,是否屬於同一個人
(2)困難:同一個人臉在不同狀況下會呈現不同的狀態,比如說特別受光照、煙霧、化妝等等的影響。第二個是映射到二維照片上的不同參數造成的,所謂映射到二維參數上就是說本來人臉長這樣,拍攝設備去拍的時候,跟他呈現的角度,離他的距離,對焦是否準確,拍攝視角等等光線累積這個都有影響,會讓同一個人臉產生不同的狀態。第三就是年齡和整容的影響。
(1)傳統方法
1、由人工去抽取一些特徵HOG、SIFT、小波轉換等,抽取的這種特徵一般來說可能是要固定參數,也就是不需要訓練,不需要學習,使用一套固定的演算法,再比較這個特徵。
(2)深度方法
主流的方法就是深度的方法,即深度卷積神經網絡,這個網絡一般來說是用DCNN去代替前面的那些特徵抽取方法,也就是把一張圖上面,一個人臉上面的一些各個不同的特徵弄出來,DCNN裡面有很多參數,這個參數是學出來的,不是人告訴他的,學出來的話相當於能比人總結出來的這些會更好。
然後得到的一組特徵一般現在的維度可能是128維、256維或512維、1024維,然後做對比. 判斷特徵向量之間的距離,一般使用歐氏距離或餘弦相似度。
人臉比對的評估指標同樣分為速度與精確度,速度包含單張人臉特徵向量計算時間與比對速度。精確度包括ACC和ROC。由於前面已介紹過,這裡著重介紹一下比對速度。
普通比對是一個簡單的運算,是做兩個點的距離,可能只需要去做一次內積,就是兩個向量的內積,但當人臉辨識遇到1:N比較時,當那個N庫很大的時候,拿到一張照片要去N庫裡面做搜尋的時候,搜尋的次數會非常多,例如N庫一百萬,可能要搜尋一百萬次,一百萬次的話就相當於要做一百萬次的比對,這個時候的話對於總時間還是有要求的,所以就會有各種各樣的技術對這種比對進行加速。
主要有人臉追蹤、品質評估、活體辨識。
● 人臉追蹤
在監控等影片人臉辨識的場景下,如果對走過的同一個人的每一幀都執行整套人臉辨識流程,不僅浪費計算資源,而且有可能因為一些低品質的幀造成誤識別,所以有必要判斷哪些人臉是屬於同一個人的。並挑選出合適的照片做識別,大大提升模型的整體性能。
現在不只人臉追踪,還有各種各樣不同的物體追蹤或是車輛追蹤等等,都會使用到追蹤演算法,此類演算法不依賴或不會一直依賴偵測。例如在最開始偵測到一個物體後,接下來就完全不偵測了,只透過追蹤演算法去做。同時為了做到非常高精度,為了做到不遺失,每一次的追蹤花的時間是比較多的。
為防止追蹤到的人臉和人臉辨識器範圍不吻合,一般來說還是會拿人臉偵測器做一次偵測,這種偵測方法是依賴人臉偵測做的比較輕量化的追踪,在某些場景下,可以做到一個速度和質量上面的一個平衡。
這種檢測方法叫做Tracking by Detection,即每一幀仍然去做人臉檢測,檢測到人臉以後,根據每一個人臉的四個值,即他的座標位置,他的寬、高,去比較前後兩幀的人臉的位置和大小,大概可以推測出這兩個人臉到底是不是屬於同一個移動物體。
● 可選的間隔全畫面偵測
是指當去做Tracking by Detection的時候,前後兩幀,一種做法是都做全畫面的偵測,所謂全畫面偵測即把全畫面全部掃一遍,但是此方法耗時嚴重,因此有時會採用另一種方法,間隔幾幀做一次全畫面,一般預測一個下一幀,位置變化不會太多,只要把前一幀的位置上下左右稍微擴大一點,再去檢測一次,往往大概率機會是可以檢測到,大多數的幀可以跳。
為什麼一定要間隔幾個畫面再做一次全畫面偵測呢?
是為防止有新的物體進來,如果只根據前一個物體的位置來找的話,可能有新的物體進來的時候就沒檢測到,防止這種情況的話可以隔個五幀、十幀再去做一次全畫面檢測。
● 人臉品質評估
由於人臉辨識器訓練資料等的限制,不可能對所有狀態下的人臉表現都很好,品質評估會判斷偵測出來的人臉與辨識器特性的吻合程度,只選取吻合度高的人臉送去做識別,提升系統的整體性能。
① 人臉的大小,選用太小的臉做辨識效果會大打折扣。
② 人臉姿態,就是指三個軸方向的旋轉角度,一般來說跟辨識器訓練用的資料有關。如果訓練的時候大部分用的是姿態不太大的人臉的話,在真正做識別的時候也最好不要挑那種偏轉很大的,否則會不適用。
③ 模糊程度,此要素很重要,如果照片已經遺失掉資訊了,再做識別會存在問題。
④ 遮擋,如果眼睛、鼻子等被蓋住了,這塊的特徵就無法拿到,或者說拿到的是錯的,是一個遮擋物的特徵,對後面的識別有影響。如果你能判斷出來是被遮蔽的,然後棄用,或做一些特殊處理,例如不把它放到辨識模型裡面去。
● 活體辨識
這是所有的人臉辨識系統都會遇到的問題,只辨識人臉的話,照片也可以蒙混過關。為了讓系統不被攻擊就會去做一些判斷,這個到底是一個真臉還是假臉。
基本上目前的方法大概有三種:
① 傳統的動態識別,很多銀行的取款機會有這種要求用戶做一些配合,例如讓用戶眨眼、轉頭,以此來判斷用戶是不是根據眨眼、轉頭做了同樣的配合。因此動態辨識有一個問題,就是需要使用者的配合較多,這樣使用者使用體驗會有點不好。
② 靜態識別,即不根據動作來判斷,只是根據這個照片本身來判斷是否是真實人臉,還是一個假臉。它的根據是一般現在用的攻擊的手段,是比較方便的,例如拿手機,或者是拿一個顯示屏,就用屏幕做攻擊。
這種螢幕的發光能力跟實際的光照條件下面人臉的發光能力是不一樣的,例如顯示器有1600萬髮色數,是無法做到可見光的發光能力,即全部是連續的所有的波段都能發出來。因此再對這種螢幕做拍攝時,和真正自然環境下面的一次成像對比,人眼也能看出來會有一些變化,會有一些不自然。透過這種不自然放到一個模型裡面訓練過以後,還是可以根據這種細微的差別判斷出來到底是不是真臉。
③ 立體識別,如果用兩個攝影機或一個有深度資訊的攝影機,就能知道拍到的各個點離攝影機的距離是多少,相當於對人物做3D成像,這樣用一個螢幕去拍攝,螢幕肯定是個平面,意識到是一個平面的,平面的肯定不是一個真的人。這個就是用立體的辨識方式去排除平面人臉。
先做一個分類,從對比形式來看,有1:1的辨識系統,1:N的辨識系統;從對比的物件來看,有照片的比對系統以及視訊的比對系統;以部署形式的話,有私有部署,有雲部署或行動裝置部署。
照片1:1的辨識系統
1:1的辨識系統最簡單,拿兩張照片,每一張照片去產生一個特徵向量,然後去比一下這兩個特徵向量是不是同一個人,就可以辨識了。
照片1:N的辨識系統
1:N的辨識系統,即判斷照片素材不在一個樣本庫裡。此樣本庫是預先準備好的,可能會有白名單或黑名單,裡面有每個人的一張照片,拿這張照片產生了一系列的特徵向量。這個作為一個樣本庫,用上傳的照片跟樣本庫裡面的所有的特徵去比,看跟哪個最像,就認為他是這個人,這個是1:N的識別系統。
影片1:1的辨識系統
影片1:1辨識系統,和照片的1:1系統類似,但是比對的物件不是照片,而是視訊串流。拿到視訊串流以後會做檢測,做追踪,做品質評估,等拿到合適的照片以後才去做比對。
影片1:N的辨識系統
影片1:N適合系統與1:N照片的系統類似,只不過拿來做識別的是視訊串流,同樣也是要做檢測、追蹤、品質評估。
一般所謂系統構成不一定是人臉辨識系統,各種AI系統大概都會如此。首先是運算資源層,在CPU或GPU上運行,在GPU上運行可能還有CUDA,CUDN等的支援。
其次是運算工具層,包含深度學習前向網路運算庫、矩陣運算庫和圖象處理工具庫。由於不可能每一個做演算法的人都自己去寫資料運算,因此都會用一些已有的資料運算函式庫,例如TensorFlow或MXNET或Caffe等都會提供,或是自己寫一套也是可以。
以上是萬字長文,科普人臉辨識演算法及系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!