1. 程式人生 > >TensorFlow實現人臉檢測和人臉識別

TensorFlow實現人臉檢測和人臉識別

facenet 進行人臉識別測試

1.簡介:facenet 是基於 TensorFlow 的人臉識別開源庫,有興趣的同學可以扒扒原始碼:https://github.com/davidsandberg/facenet

 

2.安裝和配置 facenet

我們先將 facenet 原始碼下載下來:

git clone https://github.com/davidsandberg/facenet.git

在使用 facenet 前,務必安裝下列這些庫包:

或者直接移動到 facenet 目錄下,一鍵安裝

pip install -r requirements.txt

 

3.下載 LFW 資料集

LFW 是由美國馬薩諸塞大學阿姆斯特分校計算機視覺實驗室整理的。它包含13233張圖片,共5749人,其中4096人只有一張圖片,1680人的圖片多餘一張,每張圖片尺寸是250x250 。

下載地址:http://vis-www.cs.umass.edu/lfw/   ->Menu->Download->All images as gzipped tar file

下載完成後,我們將檔案解壓到 facenet/data/lfw_data/lfw 目錄下(沒有的話自己建個目錄),在 lfw_data 目錄下新建一個目錄 lfw_160,用來存放裁剪後圖片。

 

4.對影象進行預處理

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

執行 facenet/src/align/align_dataset_mtcnn.py 來修改圖片尺寸大小,加入下列引數

facenet/data/lfw_data/lfw                         #輸入影象資料夾
facenet/data/lfw_data/lfw_160                    #輸出影象資料夾
--image_size 160 --margin 32 --random_order--gpu_memory_fraction 0.25       #指定裁剪後圖像大小(如果不指定,預設的裁剪結果是182*182畫素的)

python align_dataset_mtcnn.py facenet/data/lfw_data/lfw facenet/data/lfw_data/lfw_160 --image_size 160 --margin 32 --random_order--gpu_memory_fraction 0.25 

如果用的是 pycharm,可以在 RUN -> Edit Configurations 下新增引數資訊,然後執行 align_dataset_mtcnn.py 檔案:

**這裡自己執行的時候一直報錯提示:No module named 'align'

   將 align_dataset_mtcnn.py 移動至 src 資料夾下再執行就不會報錯了。

 

校準後圖像大小即變為160 x 160 。

 

5.評估 Google 預訓練模型在資料集中的準確性

facenet提供了兩個預訓練模型,分別是基於CASIA-WebFace和 VGGFace2人臉庫訓練的。(由於儲存在 Google 網盤中,需要 FQ 下載使用)

GitHub 地址:https://github.com/davidsandberg/facenet

 

這裡我採用的是 CASIA-WebFace 預訓練模型,有興趣瞭解的小夥伴,可以到CASIA-WebFace 官網看看:

http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html

將下載好的預訓練檔案解壓到 facenet/src/models目錄下:

新增引數

facenet/data/lfw_data/lfw_160 facenet/src/models/20180408-102900

執行 validate_on_lfw.py 檔案。

這裡我剛開始執行的時候報錯:

發現是預訓練模型版本太舊,我們在 facenet 上下載最新的CASIA-WebFace 訓練庫再重新執行即可。

 執行結果如下:

 

可以看到識別精度可以達到 97.7%,其識別準確度還是非常不錯的。

但是程式執行完以後雖然最終執行結果正確,但是最後卻還是報了個錯誤:_2_input_producer: Skipping cancelled enqueue attempt with queue not closed

原因是主執行緒已經關閉,但是讀取資料入隊執行緒還在執行入隊。

由於自己對 TensorFlow 執行緒還不是特別瞭解,暫時還沒有解決這個問題。