讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 3.1 DPM人臉檢測算法 >

3.1 DPM人臉檢測算法

該人臉檢測算法使用的檢測模型為dpm-baseline[1],本書稱之為DPM人臉檢測算法。它可以檢測多角度的人臉,是M.Mathias等人在2014年提出的[2]。和一些比較成熟的算法相比,DPM人臉檢測算法的檢測效果和它們相當,甚至可以取得更好的結果,主要原因在於:其選擇了合適的訓練數據,以及發現了非極大值抑制的重要性。M.Mathias等人公開了訓練好的人臉檢測模型——dpm-baseline,並提供了開源的代碼。本書就是使用他們提供的開源模型和源代碼進行人臉檢測的。

3.1.1 DPM人臉檢測算法的使用

本書實現的DPM人臉檢測算法是基於MATLAB語言實現的,對應的項目名稱為dpmMATLAB。該項目內包含了DPM算法運行所需的全部文件,分為兩部分,即dpm_face_detector和voc-dpm-master[3]。dpm_face_detector中存放了人臉檢測模型[1]、主要程序[4]和測試圖片;voc-dpm-master中存放了程序運行中需要調用的函數。

在運行程序之前,還需要一些配置,具體如下:

(1)首先打開MATLAB,切換到主函數detect_faces.m所在的目錄。

(2)單擊home→Set Path→Add to Path with Subfolders,選擇voc-dpm-master文件夾,如圖3-1所示,最後單擊「保存」按鈕並關閉。

(3)本書程序是在Windows 64位操作系統和MATLAB 2012b下運行的。如果讀者的運行環境和本實驗一致,則配置完成。如果讀者使用的是32位操作系統或者在文獻[3]中下載voc-dpm-master,則使用dpmMATLABchange文件夾下的.cc文件,替換掉voc-dpm-master中對應的文件,並使用「mex–O xx.cc」對這類.cc文件進行編譯。編譯成功後,則配置完成。

圖3-1 Add to Path with Subfolders對話框

待檢測圖片在dataoriginal_image文件夾下。

檢測結果在dataface_detection_results文件夾下。

讀者可根據實際情況,在detect_faces.m文件中,修改存放檢測圖片和檢測結果的路徑,如下:

選擇好路徑後,運行主函數detect_faces.m,即可使用DPM人臉檢測算法進行人臉檢測。

3.1.2 DPM人臉檢測算法的原理

該算法使用可變形部件模型(Deformable Part Model)目標檢測框架[5],包含一個訓練好的、可以檢測多角度人臉的模型dpm-baseline.mat,對輸入的檢測圖片在檢測模型上進行處理後,得到若干個檢測框,初步得到的檢測框經過NMS處理,即可得到最終人臉檢測結果。作者在文中提到,該算法檢測質量好的主要原因是選擇了合適的訓練數據和發現了非極大值抑制的重要性[2]。

1.dpm-baseline模型的訓練數據

該模型從AFLW數據集收集了15 106個樣本數據進行訓練,分為三類:6752個正面臉樣本(臉部上下偏移±20°),5810個側面臉樣本(臉部左右偏移20°~60°),2544個側面臉樣本(臉部左右偏移60°~100°),分別訓練成3個組件(Component)。通過翻轉,3個組件變為6個組件,每個組件有一個根模板和8個部件,如圖3-2所示,該圖來源於文獻[2]。除初始化組件外,所有訓練參數都使用默認值。

圖3-2 dpm-baseline模型的6個組件

選擇的樣本質量和數量合適,是該算法檢測效果好的一個重要因素。在檢測質量方面,DPM算法選擇了多角度的人臉樣本進行訓練,訓練好的模型可以檢測多種角度的人臉。作者從精度和召回率方面評估了訓練樣本數量不同對檢測質量的影響。結果顯示,當有500個訓練樣本時,DPM的平均精度可以達到95%,增加訓練樣本個數可以在保持精度不變的情況下提高召回率。

2.非極大值抑制的重要性

非極大值抑制(Non-Maximum Suppression,NMS)的目的是保證每個檢測實例只有一個檢測框。對於同一個檢測實例,選擇得分最高的檢測框的同時,自動移除得分低的檢測框。假設我們設置重疊閾值(Overlap Thresh)為0.3,已經找到了一個得分高的檢測框A,比較檢測框B和檢測框A,如果檢測框A、B的重疊面積比總和面積(IoU)小於0.3,則認為檢測框A、B不是同一個檢測實例,保留檢測框B,否則刪除檢測框B。NMS的重疊閾值是一個影響檢測質量的重要參數。作者在論文中指出,使用不同的重疊閾值在Pascal Faces數據集上比較DPM的檢測質量,發現閾值為0.3比默認值0.5的檢測效果好,如圖3-3所示,該圖引自文獻[2]。

圖3-3 DPM在Pascal Faces數據集上使用不同重疊閾值的檢測結果

3.源代碼分析

上面從理論方面分析了DPM檢測模型和NMS的重要性,接下來我們將結合文獻[4]中的源代碼詳解如何利用dpm-baseline.mat和NMS進行人臉檢測。Code1、Code2中的程序均來自文獻[4]。

Code1:主函數 detect_faces.m

通過對detect_faces.m的分析,讀者對DPM人臉檢測過程會有一個大概的瞭解。接下來,我們分析一下process_face.m的主要代碼。

Code2:process_face.m

由Code1中的主函數detect_faces.m可知,最終得到的人臉檢測框通過函數showsboxes_face在圖片上進行標記,但是這些檢測框區域內的圖像有的是真實的人臉,有的可能並非人臉。我們稱非人臉的檢測框為「噪聲」,因此,在showsboxes_face函數中,我們對每一張圖片得到的所有檢測框進行判斷,如果不是噪聲,則在圖片上標記出該檢測框;否則,忽略該檢測框,不標記。

關於如何去噪,這裡使用了GN Stamou和I.Pitas等人提出的方法,步驟如下:

(1)把檢測框區域對應的圖片切出來,並且把這張圖片轉換為HSV顏色空間。

(2)在HSV圖像中,如果一個像素點的0<H<0.15,且0.2<S<0.6,則稱為「像皮膚」(skin-like)。

(3)如果該區域內的skin-like個數除以該圖的總像素點個數大於1/4,則認為是真人臉,否則為假人臉。

下面是去噪算法的代碼。

Code3:out_false.m

關於該算法的更多細節,可以查看FaceDetectAlgosdpmMATLAB下的所有文件。

3.1.3 DPM人臉檢測算法的檢測結果

經測試,我們發現DPM人臉檢測算法的檢測質量很好。DPM人臉檢測算法可以檢測正臉、側臉、仰臉、平躺草地等類型的圖片,這歸功於選擇了多角度的訓練樣本。針對圖片尺寸小的情況,檢測時間短、效果好;但針對大尺寸的圖片,檢測時間長,甚至報錯。在圖3-4中,我們呈現了一些有代表性的圖片的檢測結果。

圖3-4 DPM人臉檢測算法的檢測結果