天天看點

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

多任務卷積神經網絡(MTCNN)實作人臉檢測與對齊是在一個網絡裡實作了人臉檢測與五點标定的模型,主要是通過CNN模型級聯實作了多任務學習網絡。整個模型分為三個階段,第一階段通過一個淺層的CNN網絡快速産生一系列的候選視窗;第二階段通過一個能力更強的CNN網絡過濾掉絕大部分非人臉候選視窗;第三階段通過一個能力更加強的網絡找到人臉上面的五個标記點;完整的MTCNN模型級聯如下:

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

該模型的特征跟HAAR級聯檢測在某些程度上有一定的相通之處,都是采用了級聯方式,都是在初期就拒絕了絕大多數的圖像區域,有效的降低了後期CNN網絡的計算量與計算時間。MTCNN模型主要貢獻在于:

第一階段

網絡是全卷積神經網絡是一個推薦網絡簡稱 P-Net, 主要功能是獲得臉部區域的視窗與邊界Box回歸,獲得的臉部區域視窗會通過BB回歸的結果進行校正,然後使用非最大壓制(NMS)合并重疊視窗。

第二階段

網絡模型稱為優化網絡R-Net,大量過濾非人臉區域候選視窗,然後繼續校正BB回歸的結果,使用NMS進行合并。

第三階段

網絡模型稱為O-Net,輸入第二階段資料進行更進一步的提取,最終輸出人臉标定的5個點位置。

網絡架構與訓練

對CNN網絡架構,論文作者發現影響網絡性能的因素主要原因有兩個:

根據上述兩個因素,作者設計網絡每層的filter個數有限,但是它增加了整個網絡的深度,這樣做的好處是可以顯著減少計算量,提升整個網絡性能,同時全部改用3x3的filter更進一步降低計算量,在卷積層與全連接配接層使用PReLU作為非線性激活函數(輸出層除外)整個網絡架構如下:

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

訓練這個網絡需要如下三任務得到收斂

訓練時候對于人臉采用交叉熵損失:

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

BB回歸損失:

對每個候選視窗,計算它與标注框之間的offset,目标是進行位置回歸,計算其平方差損失如下

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

臉部landmark位置損失:

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

總計有五個點位坐标分别為左眼、右眼、鼻子、左嘴角、右嘴角

因為每個CNN網絡完成不同的訓練任務,是以在網絡學習/訓練階段需要不同類型的訓練資料。是以在計算損失的時候需要差別對待,對待背景區域,在R-Net與O-Net中的訓練損失為0,因為它沒有包含人臉區域,通過參數beta=0來表示這種類型。總的訓練損失可以表示如下:

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

在P-Net中對人臉進行二進制分類時候就可以線上進行難樣本挖掘,在網絡前向傳播時候對每個樣本計算得到的損失進行排序(從高到低)然後選擇70%進行反向傳播,原因在于好的樣本對網絡的性能提升有限,隻有那些難樣本才能更加有效訓練,進行反向傳播之後才會更好的提升整個網絡的人臉檢測準确率。作者的對比實驗資料表明這樣做可以有效提升準确率。在訓練階段資料被分為四種類型:

其中在負樣本與部分臉之間并沒有明顯的差異鴻溝,作者選擇0.3與0.4作為區間。

正負樣本被用來實作人臉分類任務訓練

正樣本與部分臉樣本訓練BB回歸

Landmark臉用來訓練人臉五個點位置定位

整個訓練數的比例如下:

負樣本:正樣本:部分臉:landmark臉=3:1:1:2

加載網絡

人臉檢測

實時攝像頭檢測

運作示範:

本來想上傳視訊的發現上傳不了了,是以就把視訊寫成多張連續的圖像,截屏顯示各種效果,其實視訊十分流暢,效果也非常的好。

有遮擋、部分臉檢測

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

側臉檢測

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

角度俯仰臉檢測

MTCNN實時人臉檢測網絡詳解與opencv+tensorflow代碼示範

總結一下

整個模型的運作速度極快,即使在CPU上也可以完全達到實時性能,關鍵是其檢測準确率與穩定性跟HAAR/LBP的方式相比,你就會感覺HAAR/LBP的方式就是渣,完全涼啦!

視訊學習OpenCV與tensorflow開發技術

OpenCV C++ 系統化課程

繼續閱讀