1. 程式人生 > >FaceNet算法-理論學習篇

FaceNet算法-理論學習篇

傳統 小尺寸 project tps lib 學習篇 tput pat 1.5

FaceNet算法-理論學習篇

@WP20190228

==============目 錄============

一、LFW數據集簡介

二、FaceNet算法簡介

  FaceNet算法=MTCNN模型+FaceNet模型

三、FaceNet算法理論

  3.1 MTCNN人臉檢測與對齊模型

  3.2 FaceNet人臉比對模型

四、FaceNet的基本使用

  4.1 FaceNet環境安裝

  4.2 使用1-評估預訓練模型的準確率

    4.2.1 處理數據集(對齊數據集)

    4.2.2 解壓下載已訓練模型

    4.2.2 評估模型準確率

  4.3 使用

4-FaceNet測試人臉比對效果

  4.4 使用2-MTCNN進行人臉檢測

  4.5 使用3-訓練自己的FaceNet模型

五、主要函數作用說明

六、其他

==============正 文============

前言

與傳統的生物識別技術相比,人臉識別具有更為簡便、準確、經濟及可擴展性良好等眾多優勢,可廣泛應用於安全驗證、監控、控制等各個方面。

一,人臉相關的任務有以下幾種:

  1.人臉檢測(將圖片中包含的人臉進行初步定位,以及關鍵點如眼睛、鼻子、嘴巴等更精細的定位,文章封面即為典型人臉檢測結果);

  2.人臉跟蹤(視頻中跟蹤人臉位置變化);

  3.人臉驗證(輸入兩張人臉,判定是否屬於同一人);

  4.人臉識別(輸入一張人臉,判斷其屬於人臉數據庫全部記錄中具體哪一人);

  5.人臉聚類(輸入一批人臉,將屬於同一人的自動歸為一類);

二,嚴格定義上的人臉識別分為四個步驟:

  ①人臉檢測:從圖片中準確定位到人臉

  ②人臉矯正(對齊): 檢測到的人臉,可能角度不是很正,需要使其對齊

  ③對矯正後的人臉進行特征提取

  ④對兩張人臉圖像的特征向量進行對比,計算相似度

一、LFW數據集介紹

1. LFW數據集是由美國馬薩諸塞大學阿姆斯特分校計算機視覺實驗室整理的人臉檢測數據集,是評估人臉識別算法效果的公開測試數據集,全稱為帶標簽的自然人臉數據庫(

Labeled Faces in the Wild);

2. LFW數據庫內每張圖片命名方式為“lfw/name/name_xxxx.jpg”,這裏“xxxx”是前面補零的四位圖片編號。例如,前美國總統喬治•W•布什的第10張圖片為“lfw/George_W_Bush/George_W_Bush_0010.jpg”。

3. LFW數據庫 總共有 13233 JPEG 格式圖片,屬於 5749 個不同人。每張圖片尺寸都是 250x250

4. 原圖像大小為250*250, 後續會將待檢測所使用的數據集校準為和預訓練模型所使用的數據集大小一致(160*160),轉換後的數據集存儲在lfw_160文件夾內;

二、FaceNet算法簡介

1.論文FaceNet: A Unified Embedding for Face Recognition and Clustering》。

2.FaceNet算法的提出:Google工程師Florian SchroffDmitry KalenichenkoJames Philbin提出的人臉識別模型,發表於CVPR 2015

3.FaceNet論文實驗結果:主要是利用相同人臉在不同角度等姿態的照片下有高內聚性、不同人臉有低耦合性,提出的一種人臉識別方法,在LFW數據集上準確度達到99.63%,在 youtube人臉數據集上準確度 95.12%,比以往準確度提升了將近30%

4.FaceNet的特點:沒有用傳統的softmax的方式去進行分類學習,而是抽取其中某一層作為特征,學習一個從圖像到歐式空間的編碼方法,然後基於這個編碼再做人臉識別、人臉驗證和人臉聚類等。

5.FaceNet的理論思想:是把人臉圖像映射到一個多維空間,通過空間距離表示人臉的相似度。同一個人臉圖像的空間距離比較小,不同人臉圖像的空間距離比較大,這樣通過人臉圖像的空間映射就可以實現人臉識別。即,通過CNN將人臉映射到歐式空間的特征向量上,計算不同圖片人臉特征的距離。通過相同人臉的距離總是小於不同人臉的距離,這一先驗知識訓練網絡,進而可以直接對比2個人臉經過它的網絡映射之後的歐式距離,判斷是否為同一人。

6.FaceNet測試使用:因為FaceNet只需要計算人臉特征,然後計算距離使用閾值即可判定兩張人臉照片是否屬於相同的個體,所以在使用FaceNet時可以使用已經訓練好的模型,也可以自己訓練模型,最後根據兩幅人像的歐幾裏得距離去判斷兩個人像的相似程度:兩個人像之間的歐幾裏得距離越近,說明它們越相似。從初級應用的角度來看,已經訓練好的模型已經足夠強大,我們只需將一個基準圖片與待分類圖片通過FaceNet模型比較歐幾裏得距離,即可完成人臉識別任務。

6.FaceNet人臉比對的判斷:該算法主要用於驗證人臉是否為同一個人,通過人臉識別這個人是誰完成人臉比對。判斷依據是兩幅人像的歐幾裏得距離,如給定一個閾值a=1,那麽:當特征距離等於0的時候,認為是同一張圖片(同一個人);當特征距離小於1的時候,認為是同一個人;特征距離大於1的時候,認為不是同一個人。

7.FaceNet數據集(1)訓練數據,包括10575個人,共453453張圖片,可以從http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html 下載。(2)驗證數據集包含13000張圖片,可以從http://vis-www.cs.umass.edu/lfw/ 地方下載,大約180M。訓練數據中,目錄名是人名,目錄下的文件是對應人的照片。

8.FaceNet算法常用實現任務:人臉識別。人臉識別包括:人臉檢測和人臉識別。其中,人臉檢測方法很多,如DilbOpenCVOpenFace人臉檢測等等,這裏使用MTCNN進行人臉檢測,一方面是因為其檢測精度確實不錯;另一方面facenet工程中,已經提供了用於人臉檢測的mtcnn接口,在facenet工程中的位置是align/detect_face.py。所以,FaceNet包含(1)MTCNN模型---人臉檢測與人臉對齊;(2)FaceNet模型---人臉比對

總結:FaceNet算法 = MTCNN模型 + FaceNet模型

三、FaceNet算法理論

參考個人覺得比較好的博客《如何應用MTCNNFaceNet模型實現人臉檢測及識別》和《利用MTCNNfacenet實現人臉檢測和人臉識別》,非常感謝博主。

(註:http://www.uml.org.cn/ai/201806124.asp 和 https://blog.csdn.net/guyuealian/article/details/84896733 )

3.1 MTCNN人臉檢測與對齊模型

(1)MTCNN的簡介:

MTCNN全稱: Multi-task convolutional neural network(多任務卷積神經網絡),是一種Multi-task的人臉檢測框架,將人臉區域檢測與人臉關鍵點檢測放在了一起,基於cascade框架。

論文原名: Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》,發表在arXiv上,是20164月份的文章。論文使用3CNN級聯的方式,總體可分為PNetRNet、和ONet三層網絡結構。

MTCNN可實現兩個任務: 人臉檢測與人臉關鍵點檢測, 由三個級聯的輕量級CNN完成:PNetRNetOnet。圖像數據先後經這三個網絡的處理,最終輸出人臉檢測和關鍵點檢測結果。本算法從三個方面對CNN檢測器進行訓練:人臉分類(人臉、非人臉的分類)、邊界框回歸、地標定位(關鍵點定位)。

(https://github.com/kpzhang93/MTCNN_face_detection_alignment)

開源資源:

論文鏈接:https://arxiv.org/ftp/arxiv/papers/1604/1604.02878.pdf 

Github鏈接(tf版本)https://github.com/AITTSMD/MTCNN-Tensorflow

論文中使用的兩個公開數據集:

Wider(http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/ )它有以下幾個特點:

1) 人臉檢測基準數據集

2) 包含32203個圖像和393703個人臉圖像

3) 尺度,姿勢,閉塞,表達,裝扮,光照等變化大

440%作為訓練集,10%用於交叉驗證(cross validation),50%作為測試集

5) 無背景邊界框

Celeba(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html )數據集,它由以下特點:

1) 5個關鍵點,40個屬性值

2) 高清的名人圖片

3) 用於人臉檢測,5點訓練,人臉頭部姿勢的訓練

MTCNN的主要步驟:

由於本人沒有閱讀論文原文,參考網上資源如下,感謝各位博主。

<參考一>如下,

Stage 0:當給定一張照片的時候,將其縮放到不同尺度形成圖像金字塔,以達到尺度不變。

Stage 1:使用P-Net是一個全卷積網絡,用來生成候選窗和邊框回歸向量(bounding box regression vectors)。使用Bounding box regression的方法來校正這些候選窗,使用非極大值抑制(NMS)合並重疊的候選框。全卷積網絡和Faster R-CNN中的RPN一脈相承。

Stage 2:使用N-Net改善候選窗。將通過P-Net的候選窗輸入R-Net中,拒絕掉大部分false的窗口,繼續使用Bounding box regressionNMS合並。

Stage 3:最後使用O-Net輸出最終的人臉框和特征點位置。和第二步類似,但是不同的是生成5個特征點位置。

<參考二>如下,

Stage1:首先將圖像進行不同尺度的變換,構建圖像金字塔,以適應不同大小的人臉的進行檢測。

Stage2P-Net,全稱為Proposal Network,其基本的構造是一個全連接網絡。對上一步構建完成的圖像金字塔,通過一個FCN進行初步特征提取與標定邊框,並進行Bounding-Box Regression調整窗口與NMS進行大部分窗口的過濾。

Stage3R-Net,全稱為Refine Network,其基本的構造是一個卷積神經網絡,相對於第一層的P-Net來說,增加了一個全連接層,因此對於輸入數據的篩選會更加嚴格。在圖片經過P-Net後,會留下許多預測窗口,我們將所有的預測窗口送入R-Net,這個網絡會濾除大量效果比較差的候選框,最後對選定的候選框進行Bounding-Box RegressionNMS進一步優化預測結果。

Stage4O-Net,全稱為Output Network,基本結構是一個較為復雜的卷積神經網絡,相對於R-Net來說多了一個卷積層。O-Net的效果與R-Net的區別在於這一層結構會通過更多的監督來識別面部的區域,而且會對人的面部特征點進行回歸,最終輸出五個人臉面部特征點。

<參考三>如下,

Stage 1:采用全卷積神經網絡,即P-Net,去獲得候選窗體和邊界回歸向量。同時,候選窗體根據邊界框進行校準。然後,利用NMS方法去除重疊窗體。

stage 2:R-Net,將經過P-Net確定的包含候選窗體的圖片在R-Net網絡中 訓練,網絡最後選用全連接的方式進行訓練。利用邊界框向量微調候選窗體,再利用NMS去除重疊窗體。

stage 3O-Net,網絡結構比R-Net多一層卷積,功能與R-Net作用一樣,只是在去除重疊候選窗口的同時,顯示五個人臉關鍵點定位。

說明:

P-Net輸入:待檢測的圖像。

輸出:m*n(最終特征圖的尺度)個box坐標回歸值以及對應的是否為人臉的得分。經過進一步的計算,得到可能為人臉的box集合。

中間過程簡述:將原圖重采樣(resample),得到一系列尺寸的待檢測圖。對於每一張待檢測圖,輸入到PNet,會輸出一系列box,去掉那些得分(score)不達標的box,並用非極大值抑制(nms)再去掉一部分box。對於所有尺寸的待測圖,都得到類似的box集合。將所有box集合合並,再用nms去除一部分box,余下的就是第一階段最終的輸出。

R-Net輸入:第一階段生成的box,在原圖中截取對應的區域,將所有截取得到的圖像合 並到一個四維矩陣中,作為RNet的輸入。

輸出:對於輸入的每個box,輸出其對應的坐標回歸值以及對應的是否為人臉的得 分。將得分不達標的box去掉,得到第二階段的box集合。也就是說,第二 階段是在第一階段的基礎上對box實現進一步分篩選,同時也會以通過回歸 box坐標進行更新,使得其精度更高。

O-Net人臉檢測階段

輸入:類似於RNet,但以第二階段的輸出為輸入。

輸出:類似於RNet

O-Net人臉關鍵點檢測階段,

輸入:3.1中最終得到的人臉圖像。

輸出:N*2*5)個坐標值。其中N是人臉的數目,每個人臉檢測5個關鍵點。

中間過程簡述:略。

(2)MTCNNFaceNet

FaceNet人臉對齊對齊的實現,是采用基於深度學習方法的mtcnn人臉檢測系統。github上的facenet工程,提供了用於人臉檢測的MTCNN接口。

github上的facenet工程,為了便於測試,MTCNN也一放在了工程文件中,在工程中的位置是src/align/detect_face.pyMTCNN的參數模型也保存在align文件夾下,分別是det1.npy,det2.npy,det3.npyMTCNN的用法是先將網絡搭建出來,定位input中的人臉的位置,然後返回自己設置的固定大小的臉部crop,然後再將其輸入facenet就可以了。MTCNN目的是為了人臉檢測+定位+對齊,因為當前的首要任務是讓工程能跑起來,並且對其有一個大體的認識,方便後面的學習,具體的實現原理和代碼解讀,以及物體的檢測發展歷史,目前的發展方向,各種檢測的算法,暫不作筆記。

可見,FaceNet提供訓練數據的對齊(align)功能,它能自動完成待訓練或者待測試圖片的人臉檢測並縮放為指定大小尺寸的JPEG數據以供訓練或測試。

註:https://blog.csdn.net/guyuealian/article/details/84896733,提供了一個函數,使用MTCNN進行人臉檢測的方法,作者建議封裝成一個類,方面初始化和單獨調用。

3.2 FaceNet人臉識別模型

FaceNet,進行人臉識別的流程:

1.通過MTCNN人臉檢測模型,從照片中提取人臉圖像。

2.把人臉圖像輸入到FaceNet,計算Embedding的特征向量。

3.比較特征向量間的歐式距離,判斷是否為同一人,例如當特征距離小於1的時候認為是同一個人,特征距離大於1的時候認為是不同人。

FaceNet的網絡結構如下圖所示,其中Batch表示人臉的訓練數據,接下來是深度卷積神經網絡,然後采用L2歸一化操作,得到人臉圖像的特征表示,最後為三元組(Triplet Loss)的損失函數。

四、FaceNet的基本使用

4.1 FaceNet環境安裝

 環境配置:Ubuntu 18.04 + Tensorflow 1.5.0 + Python 2.7 + OpenCV 3.2.0

 環境安裝:略過。(本篇,主要記錄理論學習筆記。)

4.2 使用1-評估預訓練模型的準確率

4.2.1 處理數據集(對齊數據集)

因為程序中神經網絡使用的是谷歌的“inception resnet v1”網絡模型,這個模型的輸入時160*160的圖像,而我們下載的LFW數據集是250*250限像素的圖像,所以需要進行圖片的預處理。

我們可以下載LFW數據集用來測試這個程序,也為後邊的訓練函數做好數據準備。

下載鏈接:http://vis-www.cs.umass.edu/lfw/。下載後解壓在data文件夾中。

圖片預處理——運行人臉對齊程序(align\align_dataset_mtcnn.py

在運行時需要輸入的參數:

1.input_dir:輸入圖像的文件夾(facenet/data/lfw),原始數據文件夾。

2.output_dir:輸出圖像的文件夾(facenet/data/lfw_mtcnn_160,對齊後的文件夾。

3.指定裁剪後圖片的大小:--image_size 160 --margin 32 --random_order(如果不指定,默認的裁剪結果是182*182像素的)

執行命令:

$ cd facenet

$ python src/align/align_dataset_mtcnn.py data/lfw/raw data/lfw/lfw_mtcnn_160 --image_size 160 --margin 32

$ python src/align/align_dataset_mtcnn.py data/lfw/raw data/lfw/lfw_mtcnn_160 --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25 #使用GPU

進過對齊校準後,在圖像輸出文件下就會發現圖像大小變成160*160。如下圖,左邊是未處理的圖片,右邊是處理後的圖片,可以看到,左邊是人的半身照,右邊是人臉照,並且,右邊圖像的大小是160×160

4.2.2 解壓下載已訓練模型

可以參考,鏈接:https://pan.baidu.com/s/1nvBX233 密碼:s0sb

https://download.csdn.net/download/rookie_wei/10609076,解壓之後,會的的4個文件。

4.2.2 評估模型準確率

評估模型在數據集的準確率運行程序(src/validate_on_lfw.py

$ python src/validate_on_lfw.py data/lfw/lfw/lfw_mtcnn_160 models/20180402-114759

如果不好用,註意使用:模型給絕對路徑。

結果示例:

Runnning forward pass on LFW images

Accuracy: 0.992+-0.003

Validation rate: 0.97467+-0.01477 @ FAR=0.00133

Area Under Curve (AUC): 1.000

Equal Error Rate (EER): 0.007

說明,lfw數據集不經過對齊處理,也可以執行上述命令,觀察結果。

4.3 使用4-FaceNet測試人臉比對效果

人臉比對---運行程序(facenet-master\src\compare.py

有了模型,就可以執行人臉對比。在compare.py所在目錄下放入要對比的人臉圖像43.jpg44.jpg(完全不同的2人臉圖);

利用預訓練的模型,測試人臉比對效果,執行命令如下:

$ cd facenet

$ python compare.py models\20170511-185253\20170511-185253 43.jpg 44.jpg

$ python compare.py models\20170511-185253\20170511-185253 Cate_Blanchett_0001.png Cate_Blanchett_0002.png

說明,lfw數據集不經過對齊處理,也可以執行上述命令,觀察結果。

4.4 使用2-MTCNN進行人臉檢測

MTCNN進行人臉檢測和人臉對齊,目前網上已經有很多資源可以學習了。比如利用它進行自己人臉識別庫的訓練與識別,已經有MTCNN—CaffeMTCNN—TF版本的工程實現了,個人以後也會動手練習。

這裏主要是MTCNN結合facenet,兩者結合實現人臉識別。因github上的facenet工程提供了用於人臉檢測的MTCNN接口,故直接調用會使用即可。即,上面的圖像預處理步驟,執行命令:

$ cd facenet

$ python src/align/align_dataset_mtcnn.py data/lfw/raw data/lfw/lfw_mtcnn_160 --image_size 160 --margin 32

4.5 使用3-訓練自己的FaceNet模型

想要訓練自己的FaceNet模型,參考“Classifier training of inception resnet v1”

1.準備數據。

要自己訓練模型,先要找一些自己準備的圖片。這些準備的圖片只是為了訓練面部特征的表示,和後面要識別的對象沒有關系。建議,可以從你的相冊中準備一些圖片,或者下載標準的的訓練樣本(如LFW數據集)。自己準備的數據要滿足一定的格式:以人名為文件夾,文件夾內,以人名加編號來存儲圖像文件。

2.對齊數據。

因為準備的圖像可能是比較隨意,比如在郊外的一個全身照。這裏需要運行 MTCNN算法來檢測頭像,並縮放到合適的尺寸,以供FaceNet模型進行訓練,比如160*160 pixel。官方給了方法,參考大神的博客可以寫成align.sh腳本:

---------------------------------------align.sh------------------------------------------

export PYTHONPATH=PYTHONPATH:$(pwd)/src

python src/align/align_dataset_mtcnn.py data/my/raw/ data/my/lfw_160/ –image_size 182 –margin 44

------------------------------------------------------------------------------------------------

這裏data/my/raw/目錄就是你準備的原始數據的位置,data/my/lfw_160就是對齊後的數據目錄。

3.開始訓練數據。

    把官方的方法也寫成腳本training.sh,內容如下:

------------------------------------------training.sh-----------------------------------------

export PYTHONPATH=PYTHONPATH:$(pwd)/src

python src/train_softmax.py \

–logs_base_dir ./data/my/logs/facenet/ \

–models_base_dir ./data/my/models/facenet/ \

–data_dir ./data/my/lfw_182/ \

–image_size 160 \

–model_def models.inception_resnet_v1 \

–lfw_dir ./data/lfw/lfw_160/ \

–optimizer ADAM \

–learning_rate -1 \

–max_nrof_epochs 150 \

–keep_probability 0.8 \

–random_crop \

–random_flip \

–use_fixed_image_standardization \

–learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt \

–weight_decay 5e-4 \

–embedding_size 512 \

–lfw_distance_metric 1 \

–lfw_use_flipped_images \

–lfw_subtract_mean \

–validation_set_split_ratio 0.05 \

–validate_every_n_epochs 5 \

–prelogits_norm_loss_factor 5e-4

------------------------------------------------------------------------------------------------

其中,

–lfw_dir ./data/lfw/lfw_160/ 參數指定的對齊後的訓練數據的位置。

–models_base_dir ./data/my/models/facenet/參數指定了生成的模型的位置。

執行-training.sh,等待漫長的訓練過程,靜等訓練後的模型。

當然,直接使用他人生成好的模型,效果就立竿見影。如前面介紹,直接的應用就是Facenet可以直接對比2個人臉經過它的網絡映射之後的歐式距離。有了模型,就可以執行人臉對比。

.開始訓練數據。

$ python src/compare.py models/20170511-185253/20170511-185253 Cate_Blanchett_0001.png Cate_Blanchett_0002.png

其中models/20170511-185253/20170511-185253指下載的facenet訓練好的模型,Cate_Blanchett_0001.png Cate_Blanchett_0002.png 是要對比的圖像。

參考:

https://blog.csdn.net/ygd11/article/details/80724621?utm_source=blogxgwz7

https://github.com/davidsandberg/facenet/wiki/Classifier-training-of-inception-resnet-v1

五、主要函數作用說明

facenet/contributed/相關函數:

1、基於mtcnnfacenet的人臉聚類

代碼:facenet/contributed/cluster.pyfacenet/contributed/clustering.py實現了相似的功能,只是沒有mtcnn進行檢測這一步)

主要功能:

使用mtcnn進行人臉檢測並對齊與裁剪

對裁剪的人臉使用facenet進行embedding

embedding的特征向量使用歐式距離進行聚類

2、基於mtcnnfacenet的人臉識別(輸入單張圖片判斷這人是誰)

代碼:facenet/contributed/predict.py

主要功能:

使用mtcnn進行人臉檢測並對齊與裁剪

對裁剪的人臉使用facenet進行embedding

執行predict.py進行人臉識別(需要訓練好的svm模型)

3、以numpy數組的形式輸出人臉聚類和圖像標簽

代碼:facenet/contributed/export_embeddings.py

主要功能:

需要對數據進行對齊與裁剪做為輸入數據

輸出embeddings.npylabels.npylabel_strings.npy

六、其他

綜合多篇網絡資源,花了兩天的時間,自己學習並整理了這篇文章,如有謬誤,敬請指出! 十分感謝各位小主,還有很多未列出來的~~~

參考:

https://blog.csdn.net/qq_14845119/article/details/52680940 

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

https://kpzhang93.github.io/MTCNN_face_detection_alignment/index.html 

https://github.com/kpzhang93/MTCNN_face_detection_alignment/tree/master/code/codes 

https://blog.csdn.net/wshdkf/article/details/79956976

https://blog.csdn.net/guyuealian/article/details/84896733

 

----------文中涉及的圖片,未上傳---------------

FaceNet算法-理論學習篇