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


來源 | AI 算法與圖像處理

封圖 | CSDN 付費下載於視覺中國

本文的內容預覽

人臉檢測的概念

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

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

人臉檢測示例

在人臉檢測中應用較廣的算法就是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 izipizip = 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】

有獎征文

檢測、量化、追蹤新冠病毒,基於深度學習的自動CT圖像分析有多靠譜?百萬人學AI:CSDN重磅共建人工智能技術新生態連續兩天,8 大技術論壇,微軟超 60 個燒腦議題等你來戰Docker 開發環境的滑坡來,讓我們逐一澄清以太坊 2.0 五大誤解超 6 成程序員月薪 8000 以上,后端開發最吃香!| 中國開發者現狀報告你點的每個“在看”,我都認真當成了AI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM