人臉檢測

人臉檢測

       人臉檢測目的就是在一張圖中找到所有的人臉。本次分享只針對人臉檢測,不涉及到人臉識別。

 

人臉檢測幾種常用的方法:

①  早期的人臉檢測方法是利用人工提取特徵,訓練分類器,進行人臉檢測。例如opencv原始碼中自帶的人臉檢測器就是利用haar特徵進行的人臉檢測。這類方法的缺點就是在環境變化強烈的時候檢測效果不理想,例如弱光條件,人臉不全。

②  從通用的目標檢測演算法中繼承過來的人臉檢測演算法。例如利用faster-RCNN來檢測人臉。效果不錯,可以適應環境變化和人臉不全等問題,但是時間消耗很高。

③  鑑於以上兩種方法的優劣勢,就有人專門研究了人臉檢測的演算法,同時規避了以上兩種的劣勢,兼具時間和效能兩個優勢。級聯結構的卷積神經網路,例如,cascadeCNN,MTCNN。MTCNN效果要比cascadeCNN要好。

 

目前人臉檢測任務主要是有兩個方面的挑戰:

①   召回率:複雜背景下的人臉的尺度變化和光照等外部因素變化導致的人臉分類困難。

       (在CNN方法下解決此類問題一般都是通過加入此類樣本進行訓練解決問題。)

②  耗時:人臉多尺度位置定位導致的時間消耗。

 

MTCNN演算法介紹

       MTCNN(多工級聯卷積神經網路)由三個部分組成,P-Net(proposal Network),R-Net(refineNet),O-Net(outputNet)。這三個部分是相互獨立的三個網路結構,相互串聯的關係。每個階段的網路都是一個多工網路,處理的任務有三個:人臉/非人臉的判斷、人臉框迴歸、特徵點定位。

 

       流程說明:

       原始待檢測影象經過resize,生成不同尺寸的影象構建影象金字塔作為網路的輸入。

構建的影象金字塔,其層數由兩個因素決定,第一個是設定的最小人臉minSize,第二個是縮放因子factor,最小人臉表示min(w,h),論文中說明最小人臉不能小於12,給出的縮放因子0.709可以根據公式計算影象金字塔的層數

minL=org_L*(12/minsize)*factor^(n),n={0,1,2,3,…,N}

其中n就是金字塔的層數,org_L是輸入原始影象的最小邊min(W,H),minisize是人為根據應用場景設定,在保證minL大於12的情況下,所有的n就構成金字塔的層。所以minsize的值越小,n的取值範圍就越大,計算量就相應地增加,能夠檢測到的人臉越小。

 

第一階段,通過淺層的CNN(P-Net)快速生成候選視窗,該網路全部由卷積層實現,獲取到候選人臉窗和人臉窗的迴歸向量,基於人臉窗的迴歸向量對人臉窗進行校正,然後對所有人臉窗進行NMS(非極大值抑制),合併高度重疊的人臉窗。其具體過程就是通過影象金字塔生成的各種尺寸大小的圖片,每一張圖都進行一次前向傳播,在每個圖上得到的結果之後利用設定的閾值去掉一部分,剩下的根據縮放尺度還原到原圖上的座標,將所有的座標資訊彙總,然後NMS去除一部分冗餘。

       第二階段,通過一個更復雜的CNN來處理第一階段中被誤認為人臉的“人臉窗”從而精細化人臉窗,第一階段的輸出作為第二階段的輸入,第一階段最後產生了大量的bbox,將這些bbox根據縮放因子回推到原圖上之後,將他們全部resize到24×24大小,作為第二階段的輸入。第二階段經過網路之後同樣產生大量的bbox,同樣的根據閾值去掉一部分,再利用nms去掉一部分。

       第三階段,使用第二階段中最後留下來的bbox,還原到原來的圖片上之後,全部resize到48×48大小,然後輸入到第三階段,使用更為複雜的CNN進一步精細化結果並輸出人臉上的5個特徵點。

       通過三階的級聯卷積神經網路對任務進行從粗到細的處理,並提出一種新的線上困難樣本生成策略提升效能,最終輸出人臉框位置和五個特徵點位置。整個過程中會用到三次人臉窗迴歸和NMS,三個網路獨立工作。

 

關於NMS

       簡單來說,輸入一個圖片,分類器會產生多個候選框,每個候選框會有一個得分,分數就是此框是人臉的概率。

       例如這張圖,一共產生了4個候選框,每個候選框都有一個得分。右下角的框得分最低,如果我們這是NMS閾值為0.6,那麼這個框直接被幹掉,然後川普臉上還有兩個框,有一定重疊,要想去掉一個框那就得用上NMS了。一般有兩種種計算方式。IOU交/並,IOM交/max。如果比值大於閾值,那麼直接幹掉得分低的那個框。這裡手上的框沒有與其他框有交集,所以它不會被NMS幹掉。

       其實這樣傳統的NMS直接幹掉分數低的有點簡單粗暴了,有一篇論文專門針對NMS進行了改進優化,稱之為soft-nms。如果某一個框的分數較低,那麼不直接將這個框幹掉而是降低其置信度,通過高斯加權的方式再進行排除。文章中指出在常規演算法(faster-RCNN, MTCNN)中MAP值上升一個百分點。

 

文章連結: 《Improving Object Detection With One Line of Code》

Github連結: https://github.com/bharatsingh430/soft-nms

       MTCNN方法在FDDB資料庫上測試的結果是0.95。(在1000次誤檢情況下的準確率)

       但是,MTCNN仍然具有一些缺點。

①  MTCNN的檢測速度跟待檢測人臉的數量有很大關係,當人臉數量變多之後,檢測耗時上升會非常明顯。

②  在CPU上時間消耗比較嚴重

③  側臉進行人臉對齊的時候,特徵點位置不準確。

 

       針對MTCNN的優化版本已經有很多了,例如我用過兩種

1,MTCNN-light,作者將caffemodel檔案轉成了txt,不再依賴caffe框架,只依賴openmp,在cpu平臺下執行,多執行緒處理速度不錯,但是檢測效果略有下降。

2,MTCNN-AccelerateONet,專門針對最後的ONet網路進行了加速,在GPU上加速很明顯。但是速度依然會受人臉數量的影響。

 

       MTCNN,MTCNN-light,MTCNN-Accelerate三者實驗對比

方法

輸入解析度

硬體平臺

1個人臉耗時

8人臉耗時

MTCNN

VGA

GTX1070

13ms

23ms

MTCNN-Acce

VGA

GTX1070

8ms

14ms

MTCNN-light

VGA

i5 CPU

33ms

45ms

 

方法

輸入解析度

硬體平臺

20人臉臉耗時

 

MTCNN

5184*3456

GTX1070

1.25 s

 

MTCNN-Acce

5184*3456

GTX1070

570 ms

 

MTCNN-light

5184*3456

I5CPU

3.66 s

 

         經過對比三種方法,MTCNN-light適合應用於沒有gpu的硬體平臺,在VGA解析度情況下,適當調整minSize,可以做到實時檢測。

          對比MTCNN和MTCNN-Acce,後者的時間消耗幾乎是前者的一半,在FDDB上進行測試,後者的檢測效果略差於前者。如下圖所示:

       上面兩種方法本質都是一樣的,只不過加速版在最後O-Net網路結構上面進行了修改,然後重新訓練得到一個新模型。在網路結構方面,加速版只是在原始版本上將第五個卷積層後面的dropout層去掉了,然後在前面卷積層的輸出引數上進行了縮減,前5個卷積層的num_output都減少了一半,從而減少了計算量。如下圖所示:

       dropout層在神經網路中的應用目的就是防止網路層數過多出現過擬合,根據設定的dropout_ratio引數隨機停止部分神經元工作,然後輸出多種情況下的平均值,這樣防止出現訓練過擬合。這裡的改動直接將卷積層輸出引數去掉一半,然後不要dropout,重新訓練就可以得到和原網路差不多的效果。這種方法可以值得我們借鑑。 

 

 

       由於MTCNN系列的方法耗時都對待檢測人臉數量敏感,並且在CPU上的表現不好。所以,faceBoxes這個方法就出現了。論文中說使用的方法可以很大幅度提高檢測速度,並且不受人臉數量的影響。在FDDB上準確率0.96,但是沒有人臉對齊

 

faceBoxes介紹

       faceBoxes主要包含兩個部分:RDCL和MSCL

RDCL的全名是 Rapidly Digested Convolutional Layers,主要負責快速性

MSCL的全名是 Multiple Scale Convolutional Layers,主要負責多尺度檢測

       如上圖所示,輸入一張圖,會在三個分支檢測人臉,這樣解決多尺度的問題。

       在網路的前半部分,RDCL主要是加速,快速縮小特徵圖。

①    Conv1,Pool1, Conv2 和 Pool2 的stride分別是4,2, 2 和 2。這樣整個RDCL的stride就是32,就是說原始的輸入尺寸被縮小了32次。

②   另外,通過設計合適的核尺寸來加速計算。卷積核或者池化核尺寸太大就會導致計算量增加,尺寸太小又會導致覆蓋的資訊不足,所以文章中直接選擇了7×7,5×5 , 3×3, 3×3分別對應 Conv1, Conv2 ,Pool1,Pool2 。

③   最後,由於為了減少計算量,減少了卷積核的數量。為了保證輸出維度不變,通過使用CReLU來保持輸出維度不變。

 

       關於CReLU,CReLU論文的大致意思是在神經網路中靠前的部分,引數的分佈具有很強的負相關性,隨著網路的變深,這種負相關性越來越弱。在網路的前部,網路更加傾向於同時捕捉正負相位的資訊,但是由於ReLU的特性將負響應抹掉了,這樣造成了卷積核會存在一定冗餘。

 

上圖中,紅色曲線是假設隨機高斯分佈生成的卷積核得到的相似度統計。藍色的直方圖是對所有的卷積核尋找其pair filter,按照相似度和數量畫出的。這個圖說明了隨著網路深度加深,負相關性越來越小。

       在網路的後半部分,MSCL主要是解決人臉多尺度的問題,這種方法增加了小人臉的召回率。

①  在網路的不同層進行檢測,類似於SSD。

②  採用Inception模組。由於Inception包含多個不同的卷積分支,因此可以進一步使得感受野多樣化。

       Faster-RCNN中RPN對小目標檢測效果不好,一定程度上是因為RPN中的anchor只跟卷積層後面幾層有關係,並且小目標所能對應的anchor比較少。

       最後採用增加anchor密度的方法來提高多尺度人臉的召回率

       根據計算anchor密度的方法,密度=anchor大小/stride,原始Inception3網路結構中anchor大小分別為32,64,128,stride為32,所以其密度為1,2,4。Conv3_2和Conv4_2的密度都是4。為了anchor的密度均衡,所以對密度不足的anchor進行均衡化。

論文的效果還沒有復現出來,目前github上開源的程式碼,FDDB上的檢測效果只有0.91,在cpu上的時間消耗在180ms左右,640X480解析度。