人臉算法系列:MTCNN人臉檢測詳解

點擊上方“AI算法與圖像處理”,選擇加"星標"或“置頂”

重磅乾貨,第一時間送達

大家好,從今天起我要開始更新人臉識別系列的文章了。爲了提升自己水平,輸入更優質的內容,我報了一個培訓班,人臉識別相關的,但是這資料是不能分享給大家的,但是我將分享培訓班課程的部分課後作業,挖掘出更多寶貴的內容與大家分享。我會儘可能多的參考大量資料,希望能給大家提供一些幫助,如果覺得有用的,幫我分享出去,謝啦!

本文的內容預覽

人臉檢測的概念

人臉檢測是一種在多種應用中使用的計算機技術,可以識別數字圖像中的人臉。人臉檢測還指人類在視覺場景中定位人臉的過程

人臉檢測可以視爲目標檢測的一種特殊情況。在目標檢測中,任務是查找圖像中給定類的所有對象的位置和大小。例如行人和汽車。

人臉檢測示例

在人臉檢測中應用較廣的算法就是MTCNN( Multi-task Cascaded Convolutional Networks的縮寫)。MTCNN算法是一種基於深度學習的人臉檢測和人臉對齊方法,它可以同時完成人臉檢測和人臉對齊的任務,相比於傳統的算法,它的性能更好,檢測速度更快。

本文目的不是爲了強調MTCNN模型的訓練,而是如何使用MTCNN提取人臉區域和特徵點,爲後續例如人臉識別和人臉圖片預處理做鋪墊。

接下來介紹MTCNN的使用,讓大家對其有一個直觀的感受,再深入瞭解其原理。

MTCNN的使用

Paper地址:https://kpzhang93.github.io/MTCNN_face_detection_alignment/ 

github鏈接:https://github.com/kpzhang93/MTCNN_face_detection_alignment

其他版本:https://github.com/AITTSMD/MTCNN-Tensorflow

作者是基於caffe實現的,因爲本人配置了多次,都失敗了,因此嘗試了其他框架的,採用mxnet框架,當然也附上了pytorch版本的。

本次使用的項目鏈接:https://github.com/YYuanAnyVision/mxnet_mtcnn_face_detection

其他參考:

pytorch版本:https://github.com/TropComplique/mtcnn-pytorch


第一步:將項目克隆下來

git clone https://github.com/YYuanAnyVision/mxnet_mtcnn_face_detection

當然很有可能會中途失敗,我自己也是嘗試多次都沒搞定,又慢又老是不行。不過之前分享過一個妙招,如果看過的小夥伴一定知道如何解決。

這裏附上文章鏈接:

完美解決Github上下載項目失敗或速度太慢的問題

第二步:配置好所需的環境

mxnet的安裝非常容易,這裏以我的電腦爲例安裝GPU版本的mxnet

只需一行代碼即可完成安裝,首先查詢自己所安裝cuda的版本,並輸入對應的指令即可

# 例如我的電腦是cuda 9.0的
pip install mxnet-cu90

這裏有補充說明https://pypi.org/project/mxnet-cu90/,更多內容可以百度搜索解決。

第三步:運行代碼

該項目已經有預訓練模型了,直接運行main.py即可。

但是你一運行,就會發現 哦豁,報錯了。

這是因爲該項目是用python2寫的,所以存在一些需要修改的地方。

問題一:ImportError: cannot import name 'izip' (報錯文件 mtcnn_detector.py)

解決方案:python3中的zip就相當於 python2 itertools裏的izip

因此,只需要做以下修改即可,在mtcnn_detector.py將報錯的from itertools import izip註釋掉,下面加一行試試看。

具體操作,在main.py中找到  from itertools import izip,並修改成下面即可。

#from itertools import izip
izip = zip

解決了之後在運行一次main.py

臥槽,又不行了

問題2:TypeError: 'float' object cannot be interpreted as an integer

類型錯誤:“float”對象不能解釋爲整數

解決方法:將報錯的地方存在的  “/” 都修改成 “//” 即可,同類報錯,相同的解決方法。

python2和python3中運算符的區別。

python3中 / 運算的結果是含有浮點數的。而python2中/是等價於python3中的 // ,python3中// 表示向下取整的除法。

# 舉個例子在python3中 //
print(3/2,3//2) # 輸出 1.5, 1


歷經千辛萬苦,最終展示效果:


到這裏我們已經能夠檢測到人臉了,對於自己的圖片,只需要修改main.py中讀入的圖片路徑即可。更多自定義操作,例如批量處理和保存,可以根據自己的需求來添加。

MTCNN的原理

對於如此經典的網絡僅僅掌握其使用還是不夠的,因此接下來將詳細的說明一下其內在的原理。

圖片來源與論文原文

從上圖可以知道主要包括四個操作,三個步驟。

1、圖像金字塔

對圖片進行Resize操作,將原始圖像縮放成不同的尺度,生成圖像金字塔。然後將不同尺度的圖像送入到這三個子網絡中進行訓練,目的是爲了可以檢測到不同大小的人臉,從而實現多尺度目標檢測。

圖像金字塔是圖像中多尺度表達的一種。對於圖像金字塔的具體原理這裏不詳細展開,有興趣可以參考這篇文章:https://zhuanlan.zhihu.com/p/80362140

三個子網絡圖

2、P-Net(Proposal Network)

論文原文對P-Net的描述:該網絡結構主要獲得了人臉區域的候選框和邊界框的迴歸向量。然後基於預測邊界框迴歸向量對候選框進行矯正。在這之後,我們採用NMS來合併重疊率高的候選框。

P-Net是一個人臉區域的候選網絡,該網絡的輸入一個12x12x3的圖像,通過3層的卷積之後,判斷這個12x12的圖像中是否存在人臉,並且給出人臉框的迴歸和人臉關鍵點。

網絡的第一部分輸出是用來判斷該圖像是否存在人臉,輸出向量大小1x1x2,也就是兩個值。

網絡的第二部分給出框的精確位置,一般稱爲框迴歸。P-Net輸入的12×12的圖像塊可能並不是完美的人臉框的位置,如有的時候人臉並不正好爲方形,有可能12×12的圖像偏左或偏右,因此需要輸出當前框位置相對完美的人臉框位置的偏移。這個偏移大小爲1×1×4,即表示框左上角的橫座標的相對偏移,框左上角的縱座標的相對偏移、框的寬度的誤差、框的高度的誤差。

網絡的第三部分給出人臉的5個關鍵點的位置。5個關鍵點分別對應着左眼的位置、右眼的位置、鼻子的位置、左嘴巴的位置、右嘴巴的位置。每個關鍵點需要兩維來表示,因此輸出是向量大小爲1×1×10。


3、R-Net(Refine Network)

論文原文對P-Net的描述:P-Net的所有候選框都輸入到R-Net中,該網絡結構還是通過邊界框迴歸和NMS來去掉大量的false-positive區域。

從網絡圖可以看到,只是由於該網絡結構和P-Net網絡結構有差異,多了一個全連接層,所以會取得更好的抑制false-positive的作用。在輸入R-Net之前,都需要縮放到24x24x3,網絡的輸出與P-Net是相同的,R-Net的目的是爲了去除大量的非人臉框。

4、O-Net(Output Network)

論文原文對O-Net的描述:這個階段類似於第二階段,但是在這個階段在此階段,我們目的通過更多的監督來識別面部區域。特別是,網絡將輸出五個面部關鍵點的位置。

從網絡圖可以看到,該層比R-Net層有多了一層卷積層,所以處理的結果會更加精細。輸入的圖像大小48x48x3,輸出包括N個邊界框的座標信息,score以及關鍵點位置。

總結:

 從P-Net到R-Net,再到最後的O-Net,網絡輸入的圖像越來越大,卷積層的通道數越來越多,網絡的深度(層數)也越來越深,因此識別人臉的準確率應該也是越來越高的。

對各個網絡結果的作用理解之後,我們深入瞭解一下其所採用的損失函數。

MTCNN的損失函數

針對人臉識別問題,直接使用交叉熵代價函數,對於框迴歸和關鍵點定位,使用L2損失。最後把這三部分的損失各自乘以自身的權重累加起來,形成最後的總損失。
1、人臉識別損失函數(cross-entry loss)

2、迴歸框的損失函數 (Euclidean loss)

3、關鍵點的損失函數 (Euclidean loss)

4、總損失

具體的各個公式的含義,大家應該都明白,這裏強調一下,最後的總損失前添加了一個權重 α ,即損失函數所對應的權重是不一致的。詳細設置可以參看論文原文。

   

END

參考文獻:

https://en.wikipedia.org/wiki/Face_detection

https://fishc.com.cn/thread-108647-1-1.html

https://blog.csdn.net/qq_41185868/article/details/100942855

https://zhuanlan.zhihu.com/p/58825924

https://www.cnblogs.com/zyly/p/9703614.html

https://blog.csdn.net/qq_36782182/article/details/83624357#commentBox

https://zhuanlan.zhihu.com/p/80362140

 

 用心創作求鼓勵 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章