人臉比對軟體推薦「人臉識別演算法有哪些」

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

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

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

人臉檢測示例

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

本文目的不是為了強調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

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

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

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

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

MTCNN的原理

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

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

圖片來源與論文原文

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

1、圖像金字塔

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

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

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

三個子網路圖

2、P-Net(Proposal Network)

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

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

網路的第一部分輸出是用來判斷該圖像是否存在人臉,輸出向量大小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以及關鍵點位置。

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

總結

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

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

MTCNN的損失函數

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

1、人臉識別損失函數(cross-entry loss)

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

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

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

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

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

4、總損失

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

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

人臉演算法系列:MTCNN人臉檢測詳解
【end】

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/268454.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-16 13:09
下一篇 2024-12-16 13:09

相關推薦

發表回復

登錄後才能評論