
MLNLP
(
機器學習演算法與自然語言處理
)社群是國內外知名自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
社群的願景 是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流,特別是初學者同學們的進步。
(
機器學習演算法與自然語言處理
)社群是國內外知名自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
轉載自 | 極市平臺
作者 | 新機器視覺
來源 | 新機器視覺
1
『人臉識別的目標』
總結兩點,第一,認出同一個人,不管你的狀態怎麼變,都能知道你就是你。第二、區分不同的人,可能這兩個人長得很像,或者兩個人都化妝了,但不管狀態怎麼變化,人臉識別都能知道這是兩個不同的人。
人臉識別本身是作為生物識別技術的一種,主要是提供身份認證的手段,從精度上來講,人臉識別並不是最高的。人臉識別受到很多其他條件的影響,比如說光照。人臉識別的好處在於一般不需要使用者做太多的配合,現在各個地方的監控攝像頭,包括電腦的攝像頭、手機各種影片輸入裝置,照相裝置已經非常非常的普及,用這種可見光的裝置就可以做人臉識別。所以在引入人臉識別的時候可能新增加的投資是非常少的,這是它的優勢。
2
『人臉識別的流程』
人臉識別的核心流程,所謂核心流程就是不管在什麼樣的人臉識別系統裡面基本上都有這個流程。首先人臉檢測,第二步做人臉對齊,第三步做特徵提取,這是對每一張照片都要做的這三步,當要去做比對的時候就把提取的特徵做比對,然後確定這兩個臉是不是屬於同一個人。

3
『人臉檢測』
人臉檢測即判斷一個大的場景中是否有人臉,並且要找到這個人臉的位置把它切出來。它是屬於物體檢測技術的一種,是整個人臉感知任務的基礎。人臉檢測的基本方法就是在圖象金字塔上滑動視窗,用分類器選擇候選視窗,用迴歸模型進行位置修正。

上面畫的三個視窗,一個是0.3倍、0.6倍、1.0倍,當人臉位置不定,大小無法識別時可採用此技術,讓這個圖本身變得大小不同,而滑動視窗的大小相同。深度網路一般輸入的圖象大小是固定的,那麼前面的滑動視窗基本上也是固定的。為了讓固定的滑動視窗能夠覆蓋不同的範圍的話,就對整個圖的大小進行縮放,取不同的比例。這邊畫0.3、0.6、1.0只是舉例,實際用的時候還可以有很多其他不同的倍數。
分類器是指看滑動視窗每一個滑到的位置去判斷是否是人臉,因為滑動視窗滑動到的位置有可能不包含整個人臉,或者說它比整個人臉大一點。為了找到的人臉能夠更加精確,把滑動視窗放到迴歸模型裡,即可幫助修正人臉檢測的精確度。
輸入的是滑動視窗,輸出時如果裡面有人臉,應該向哪邊修正,以及它需要修正多少,所以Δx, Δy, Δw, Δh,就是它的座標以及它的寬和高大概修正多少。有了修正的量和用分類器確定它是人臉的視窗以後,把這兩個結合在一起,就能得到一個比較精確的人臉位置。
以上是人臉檢測的流程,同時也可適用於其他的物體檢測
4
『人臉檢測的評價指標』
不管什麼樣的模型都是分速度和精度兩個方面
速度
(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)即正樣本正確率
可以區分演算法在正樣本和負樣本上的效能,並且曲線形狀與正負樣本比例無關。
縱座標:TPR(True Positive Rate)即正樣本正確率
可以區分演算法在正樣本和負樣本上的效能,並且曲線形狀與正負樣本比例無關。
ROC(Receiver Operating Characteristic)曲線就是把橫座標、縱座標用這個負樣本錯誤率和正樣本正確率兩個標出來,這樣的話同一個模型在這個圖上面看到的不是一個點,或者說不是一個單一的資料,而是一條線。這條線即置信度的閾值,你調的越高就越嚴格,越低就越不嚴格。在這個上面的話就能反應出這個置信度的閾值的變化對它的影響。
以後大家最好不要直接問說你的精度是多少,而是看ROC曲線,這樣更容易判斷模型的能力到底怎麼樣。
5
『人臉對齊』
人臉對齊的目的使人臉紋理儘可能調整到標準位置,降低人臉識別器的難度。

為了用人為的方式降低它的難度,就可以先把它做對齊,就是讓檢測到這個人的眼睛、鼻子、嘴巴全部歸到同一個位置去,這樣的話模型在比對的時候,就只要找同樣位置附近,互相是不是相同還是相近,還是有很大不同。所以就是會做對齊的這麼一步,這一步的話,我們現在常用的做法就是二維的做法,就是到這個圖裡面去找到關鍵特徵點,一般現在就是五點的、十九點的,六十幾個點,八十幾個點的各種都有。但人臉識別的話五個基本上就夠了。
這五個點之外的其他點的圖象,可以認為它是做一個類似於插值的運算,然後把它貼到那個位置去,做完了以後,就可以送到後面的人臉識別器裡面去做識別了。這個是一般的做法,還有更前沿的做法,有的研究機構在使用所謂的3D人臉對齊,就是我告訴你說一張正臉是什麼樣子的,比如旋轉45度的時候長什麼樣子,那麼用這種圖給他訓練過了以後,他就知道我看到一張向左右旋轉了45度這張圖,大概轉正了以後有很大可能性是什麼樣子的,這個模型能去猜。
6
『人臉特徵提取演算法』
以前的傳統方法是所謂的區域性紋理模型,全域性紋理模型,形狀迴歸模型之類的這些都有。現在比較流行的就是用深度的卷積神經網路或者迴圈神經網路,或者3DMM引數的卷積神經網路。所謂3DMM引數的話就是有三維的資訊在裡面,然後有級聯的深度神經網路。

級聯的深度神經網路,即拿到人臉,首先要推測五個點的位置,如果用一個單一的模型一次就要做到這一點的話,這個模型會需要很複雜。
但是怎麼能夠降低這個模型的複雜程度呢?
即做多次輸入,第一次輸入這個網路以後先做一次推測,這個推測是一個可接受的不那麼精確的推測,大概知道人臉的五個點在哪。然後把這五個點和那張原圖放到第二個網路裡面去,得到大概的修正量,有了一個基礎五個點以後再求修正量的話會比直接從原圖上面找精確的五個點要稍微容易一些。所以用這種逐步求精的方式用多個網路級聯在一起就能夠做到一個速度跟精度的比較好的平衡,實際現在做的時候基本上用兩層就大概差不多了。
7
『人臉特徵點提取的評價指標』
精度
為了能夠讓不同大小的人臉也能夠放在一起互相比較,採用統計學上叫做歸一化均方根誤差。

舉個栗子:我們在紙上畫五個點,然後讓機器來說這五個點的相互距離,所給出的數值越接近真實距離,則說明預測越精準。一般來說預測的數值一定會有些偏差,那麼怎麼表述這個精度值呢?我們通常就用距離的平均值或者均方根值來表達。然而問題來了,相同的機器預測不同大小的影像,精度值會顯得不同,因為越大的圖誤差的絕對值會越高。換到不同大小的人臉道理也是一樣。因此,我們的解決辦法是把人臉本來的尺寸數值考慮進去,一般分母是人的雙眼距離或者人臉的對角線距離,再用距離差值除以雙眼之間的距離,或者是除以人臉的對角線,這樣的話就可以得到一個基本上不隨著人臉大小而變化的一個值,用它來評測。
8
『人臉比對』
目的
即判斷已經對齊好的兩張人臉,是否屬於同一個人
難點
同一張人臉在不同狀況下會呈現不同的狀態,比如說特別受光照、煙霧、化妝等等的影響。第二個就是對映到二維照片上的不同引數造成的,所謂對映到二維引數上就是說本來人臉長這樣,拍攝裝置去拍的時候,跟他呈現的角度,離他的距離,對焦是否準確,拍攝視角等等光線積澱這個都有影響,會讓同一個人臉產生出不同的狀態。第三就是年齡和整容的影響。
9
『人臉比對的方法』
傳統方法
由人工去抽取一些特徵HOG、SIFT、小波變換等,抽取的這種特徵一般來說可能是要固定引數,即不需要訓練,不需要學習,使用一套固定的演算法,再對這個特徵進行比較。
深度方法
主流的方法就是深度的方法,即深度卷積神經網路,這個網路一般來說是用DCNN去代替前面的那些特徵抽取方法,即把一張圖上面,一個人臉上面的一些各個不同的特徵弄出來,DCNN裡面有很多引數,這個引數是學出來的,不是人告訴他的,學出來的話相當於能比人總結出來的這些會更好。
然後得到的一組特徵一般現在的維度可能是128維、256維或者512維、1024維,然後做對比. 判斷特徵向量之間的距離,一般使用歐氏距離或餘弦相似度。
人臉比對的評價指標同樣分為速度與精度,速度包括單張人臉特徵向量計算時間和比對速度。精度包括ACC和ROC。由於前面已介紹過,這裡著重介紹一下比對速度。
普通比對是一個簡單的運算,是做兩個點的距離,可能只需要去做一次內積,就是兩個向量的內積,但當人臉識別遇到1:N對比時,當那個N庫很大的時候,拿到一張照片要去N庫裡面做搜尋的時候,搜尋的次數會非常多,比如N庫一百萬,可能要搜尋一百萬次,一百萬次的話就相當於要做一百萬次的比對,這個時候的話對於總時間還是有要求的,所以就會有各種各樣的技術對這種比對進行加速。

10
『人臉識別相關的其他演算法』
主要有人臉追蹤、質量評估、活體識別。
人臉追蹤
在監控等影片人臉識別的場景下,如果對走過的同一個人的每一幀都執行整套人臉識別流程,不僅浪費計算資源,而且有可能因為一些低質量的幀造成誤識別,所以有必要判斷哪些人臉是屬於同一個人的。並挑選出合適的照片做識別,大大提升模型的整體效能。
現在不止人臉追蹤,還有各種各樣不同的物體追蹤或者是車輛追蹤等等,都會使用到追蹤演算法,此類演算法不依賴於或不會一直依賴於檢測。例如在最開始檢測到一個物體後,接下來就完全不檢測了,只通過追蹤演算法去做。同時為了做到非常高精度,為了做到不丟失,每一次的追蹤花的時間是比較多的。
為防止追蹤到的人臉和人臉識別器範圍不吻合,一般來說還是會拿人臉檢測器做一次檢測,這種檢測方法是依賴於人臉檢測做的比較輕量化的追蹤,在某些場景下,可以做到一個速度和質量上面的一個平衡。

這種檢測方法叫做Tracking by Detection,即每一幀仍然去做人臉檢測,檢測到人臉以後,根據每一個人臉的四個值,即他的座標位置,他的寬、高,去比較前後兩幀的人臉的位置和大小,大概可以推測出這兩個人臉到底是不是屬於同一個移動物體。
可選的間隔全畫面檢測
是指當去做Tracking by Detection的時候,前後兩幀,一種做法是都做全畫面的檢測,所謂全畫面檢測即把全畫面全部掃一遍,但是此方法耗時嚴重,因此有時會採用另一種方法,間隔幾幀做一次全畫面,一般預測一個下一幀,位置變化不會太多,只要把前一幀的位置上下左右稍微擴大一點,再去檢測一次,往往大機率機會是可以檢測到,大多數的幀可以跳。
為什麼一定要間隔幾幀再做一次全畫面檢測呢?
是為防止有新的物體進來,如果只根據前一個物體的位置來找的話,可能有新的物體進來的時候就沒檢測到,防止這種情況的話可以隔個五幀、十幀再去做一次全畫面檢測。
人臉質量評估
由於人臉識別器訓練資料等的限制,不可能對所有狀態下的人臉效能都很好,質量評估會判斷檢測出來的人臉與識別器特性的吻合程度,只選取吻合程度高的人臉送去做識別,提高系統的整體效能。
人臉質量評估包含以下4要素:
-
人臉的大小,選用太小的臉做識別效果會大打折扣。
-
人臉姿態,就是指三個軸方向的旋轉角度,一般來說跟識別器訓練用的資料有關。如果訓練的時候大部分用的是姿態不太大的人臉的話,在真正做識別的時候也最好不要挑那種偏轉很大的,否則會不適用。
-
模糊程度,此要素很重要,如果照片已經丟失掉資訊了,再做識別會存在問題。
-
遮擋,如果眼睛、鼻子等被蓋住了,這塊的特徵就無法拿到,或者說拿到的是錯的,是一個遮擋物的特徵,對後面的識別有影響。如果能判斷出來是被遮擋的,然後棄用,或者做一些特殊處理,例如不把它放到識別模型裡面去。
活體識別
這是所有的人臉識別系統都會遇到的問題,只識別人臉的話,照片也可以矇混過關。為了讓系統不被攻擊就會去做一些判斷,這個到底是一個真臉還是假臉。
基本上目前的方法大概有三種:
-
傳統的動態識別,很多銀行的取款機會有這種要求使用者做一些配合,例如讓使用者眨眼、轉頭,以此來判斷使用者是不是根據眨眼、轉頭做了同樣的配合。因此動態識別存在一個問題,即需要使用者的配合較多,這樣使用者使用體驗會有點不好。
-
靜態識別,即不根據動作來判斷,只是根據這個照片本身來判斷是否是真實人臉,還是一個假臉。它的根據是一般現在用的攻擊的手段,是比較方便的,例如拿手機,或者是拿一個顯示屏,就用螢幕做攻擊。這種螢幕的發光能力跟實際的光照條件下面人臉的發光能力是不一樣的,例如顯示器有1600萬髮色數,是無法做到可見光的發光能力,即全部是連續的所有的波段都能發出來。因此當再對這種螢幕做拍攝時,和真正自然環境下面的一次成像對比,人眼也能看出來會有一些變化,會有一些不自然。透過這種不自然放到一個模型裡面訓練過以後,還是可以根據這種細微的差別判斷出來到底是不是真臉。
-
立體識別,如果用兩個攝像機或者一個帶深度資訊的攝像機,就能知道拍到的各個點離攝像機的距離是多少,相當於對人物做3D成像,這樣用一個螢幕去拍攝,螢幕肯定是個平面,意識到是一個平面的,平面的肯定不是一個真的人。這個就是用立體的識別方式去排除平面人臉。

11
『人臉識別的系統構成』
首先做一個分類,從對比形式來看,有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等都會提供,或者自己寫一套也是可以。
最後是應用演算法層,包括人臉檢測、特徵點定位、質量評估等等演算法實現,以上是大概的系統構成。
技術交流群邀請函

△長按新增小助手
掃描二維碼新增小助手微信
關於我們
