一、mtcnn原理
1.mtcnn的推理流程
mtcnn包括三個階段:在第一階段,通過乙個淺層的cnn網路來快速生成檢測視窗作為第二階段的輸入。第二額極端,通過乙個更複雜的cnn網路來剔除大量非面部視窗,以達到細化候選視窗的目的。第三階段,使用乙個更強大的cnn網路來再次細化結果,並輸出5個人臉關鍵點的位置。這三個階段分別對應三個網路:p-net、r-net和o-net。
2.cnn的結構
由於cascade cnn的的效能可能受到以下限制:
因此,mtcnn減少濾波器的數量並將5×5的卷積核更改為3×3以減少計算,同時增加深度以獲得更好的效能。通過這些改進,可以在更少的執行時間內獲得更好的效能。為了公平比較,在每個組中使用相同的訓練和驗證資料。mtcnn將prelu作為卷積層和全連線層(輸出層除外)之後的非線性啟用函式。
3.訓練模型
mtcnn人臉檢測器的訓練分為三個任務(task):面部/非面部分類(face/non-face classification)、邊界框回歸(bounding box regression)和面部關鍵點定位(facial landmark localization)。
人臉分類:這是乙個二分類問題。對於每個樣本\(x_i\),使用交叉熵損失:
\[l_i^ = - (y_i^ log(p_i) + (1 - y_i^)(1-log(p_i))) \tag
\]其中\(p_i\)是樣本\(x_i\)被網路判定為人臉的概率,\(y_i^\)是樣本\(x_i\)的標籤,只有0和1這兩個取值。
邊界框回歸:對於每個候選視窗,**它與最近的樣本真實值(ground truth,在有監督學習中,ground truth通常指代樣本集中的標籤)之間的偏移量(即邊界框的左邊、頂部、高度和寬度)。這是乙個回歸問題。對於每個樣本\(x_i\),使用歐式距離來度量損失:
\[l_i^ = ||\hat_i^ - y_i^ ||_2^2 \tag
\]其中,\(\hat_i^\)是網路**的回歸結果,\(y_i^\)是樣本真實值的座標(包含四個維度:左邊、頂部、高度和寬度,因此是乙個四維向量)。
面部關鍵點定位:這也是乙個回歸問題。對於每個樣本\(x_i\),使用歐式距離來度量損失:
\[l_i^ = ||\hat_i^ - y_i^ ||_2^2 \tag
\]其中,\(\hat_i^\)是網路**的回歸結果,\(y_i^\)是第i個樣本的真實值的座標(包含五個關鍵點:是左眼,右眼,鼻子,左嘴角和右嘴角,因此是乙個十維向量)。
多源訓練(multi-source trainning):由於我們在每個cnn中使用不同的任務,所以在學習過程中有不同型別的訓練影象,如人臉、非人臉和部分對齊的人臉。在這種情況下,一些損失函式(即等式1-3)不會被用到。例如,對於背景區域的樣本,我們只計算\(l_i^\),其他兩個損失設為0。這可以直接用樣本型別指示器來實現。然後總體學習目標可以表述為:
\[min \sigma_^n \sigma_} \alpha_j \beta_i^j l_i^j \tag
\]其中n是訓練樣本的數量,\(\alpha_j\)是任務的重要性(也就是不同任務的損失函式所佔的權重)。在p-net和r-net中,\(\alpha_ = 1, \alpha_ = 0.5, \alpha_ = 0.5\);在o-net中,規定\(\alpha_ = 1, \alpha_ = 0.5, \alpha_ = 1\)來獲得更為準確的人臉關鍵點位置。\(\beta_i^j\)是樣本型別指示器,用於指示樣本的型別。j有三個取值:det、box和landmrks,\(\beta_i^j\)有0和1兩個取值。最後使用梯度下降法來訓練模型。
二、mtcnn的訓練資料
因為人臉檢測和人臉對齊是結合在一起的,所以在訓練過程中將資料標註為了四類:
注意:在部分人臉樣本和負樣本之間的iou值不存在明顯的差距,並且不同的人臉標註之間也存在差異。因此,選擇iou值相差在0.3-0.4之間的樣本作為訓練資料。其中,正樣本和負樣本作為人臉分類的訓練資料,正樣本和部分人臉樣本作為邊界框回歸的訓練資料,關鍵點人臉樣本作為面部關鍵點定位的訓練資料。並且負樣本:正樣本:部分人臉樣本:關鍵點人臉樣本=3:1:1:2。
每個網路的訓練資料集描述如下:
p-net:從wider face中隨機裁剪了幾個視窗來收集正、負、部分臉樣本。之後,從celaba中擷取面部作為關鍵點樣本。
r-net:使用框架第一部分檢測來自wider face的人臉來收集pos,neg,part樣本,同時檢測來自celeba的關鍵點樣本。
o-net:與r-net的資料收集類似,但是這次使用框架的前兩個部分來檢測臉部和收集資料。
三、一些小細節
1.影象金字塔(image pyramid)
為什麼需要影象金字塔?
由於原始影象中,存在大小不同的臉,為了在統一尺度下檢測人臉,進入網路訓練之前,就要將原始縮放至不同尺度。以增強網路對不同尺寸大小人臉的魯棒性。
如何得到影象金字塔?
縮放因子:resize_factor,每次影象縮放的比例。第一次縮放得到就是原圖\(\times resize\_factor\),第二次就是原圖\(\times resize\_factor^2\), ... ,依次類推。(這個具體根據資料集人臉大小分布來確定,基本確定在0.60-0.80之間會比較合適,設的比較大,容易延長推理時間,小了容易漏掉一些中小型人臉。**中設定的是0.6)
的最小尺寸: min_face_size,每次經過縮放後得到的應該大於min_face_size,並且最後一次縮放得到的大小應該恰好大於等於min_face_size。
經過縮放後的得到的這些不同大小的,堆疊起來的話像是金字塔,簡單稱為金字塔。注意,這些影象都是要一幅幅輸入到pnet中去得到候選的。
mtcnn演算法的訓練和推理階段,都要使用影象金字塔嗎?
對多個尺度的輸入影象做訓練,訓練是非常耗時的。因此通常只在推理階段使用影象金字塔,提高演算法的精度。訓練的時候,需要對訓練集中的每個樣本縮放到\(12\times 12\)的大小,用來訓練全卷積網路。在推理的時候,因為測試影象中人臉區域的尺度未知,所以需要使用影象金字塔技術,增加人臉區域的召回率。
2.人臉分類(face classification)
為什麼輸出是\(1\times1\times2\)的向量,如果是指示被判定為人臉為1的概率,最後乙個維度應該是1啊?
之所以有兩個值(0和1的概率),是為了方便計算交叉熵。
3.樣本型別指示器(sample type indicator)
\(\beta\)表示樣本型別,其取值只有0和1。具體的取值,和對應的資料用於哪乙個任務的訓練有關。例如負樣本韓劇只用於人臉分類的訓練,所以只有\(\beta_ = 1\),其餘均為0。
4.訓練資料(training data)
p-net使用的是\(12\times 12\)大小的,這個怎麼得到的呢?嗯,很簡單,去wider和celeba資料集隨機擷取,這個時候大家會問,隨機擷取怎麼擷取?就是字面上的意思,不過有點點技巧。首先,如果真的隨機擷取的話,如果裡面人臉只有乙個,很多都會擷取到非pos甚至非part的,所以為了得到足夠多的positives、part faces資料,真正的隨機擷取是基於實際label進行上下左右微調來擷取,進而保障positivies、part faces資料的足夠。最終會得到很多還沒有resize的,長寬不一,這個時候把他們resize為\(12\times 12\)大小的即可。
5.非極大值抑制(non-maximum suppression)
nms 主要是用於對多個候選框去除重合率大的冗餘候選框,從而保留區域內最優候選框,其過程是乙個迭代遍歷的過程。
演算法步驟如下圖所示:
cls score表示face classification的得分,b box是指bounding box。
6.並交比(intersection over union, iou)
**中指bounding box和 groud truth 的並交比,計算方式:可以將這兩個看作兩個集合,交運算的面積/並運算的面積。
7.為什麼是三個階段(three stages)
p-net 、r-net、o-net ,影象的輸入越來越大,每一層卷積核的個數越來越多,網路的深度也是越來越深。所以他們的執行速度也是越來越慢,然而其準確度卻是越來越高。
那既然o-net的準確度最高,為什麼不直接過o-net呢?或者是比o-net更深的網路呢?
這是因為,假如直接過o-net網路,執行速度會非常的慢,實際上p-net和r-net 這兩步對含人臉檢測proposal 和bounding box 做了乙個過濾,使得最後過耗時更大的o-net網路 的bounding box 比較少,從而減少了整體時間。
人臉識別學習筆記 1
人臉識別學習筆記 1 神經生理學,神經病理學,心理學,腦神經學,計算機視覺。2 計算機視覺中的基本問題 如何區分光的亮度及強度 眼睛的空間解析度 如何精確的比較和估計面積和距離 如何感知色彩 檢測和區分物體時利用的是什麼特徵 3 計算機視覺理論 影象處理,模式識別,影象理解,影象生成 廣義影象,分割...
opencv學習筆記 自己訓練人臉識別分類器
在使用opencv自帶的分類器haarcascade frontalface alt.xml進行人臉識別的基礎認識後,決定自己訓練乙個分類器看一下效果。該過程大致可分為三個階段 樣本採集 分類器訓練和運用訓練好的分類器進行人臉檢測。1 樣本的採集 在訓練前,我們需要進行正樣本及負樣本的採集。負樣本採...
學習筆記 python人臉識別4 考勤系統
作者 經除錯測試,基本可用 主要有三個功能,一是員工註冊,輸入員工號,姓名,實時採集10張人臉資料抽取人臉特徵資料儲存到資料庫 二是人臉簽到,如判斷是否是上午6 00 9 00,超過作遲到記錄,已有當天記錄則判斷重複簽到 三是記錄查詢,查詢考勤記錄。這是個單機版本的人臉考勤模型,作為學習,不錯,但要...