如何在 TensorFlow 使用深度學習建立臉部辨識 (三)

【應用】臉部辨識 – TensorFlow x deep learning (三)

上一篇文章帶您初步完成了人臉辨識的實作,現在來到了這系列的最終章,將介紹如何訓練分類器,並評估成果。

在 Tensorflow 創建嵌入 (Embeddings)

處理完數據之後,下一步就是產生每張人臉的嵌入(embedding),而這些嵌入後續可以用來作為分類、回歸或叢集分析使用。

下載權重(Weights)

您將使用 Inception Resnet V1 作為卷積神經網絡。首先,創建一個文件來下載模型的權重。藉由遷移學習,我們可以將預先訓練好的權重應用在新的數據集上。以下將會使用 LFW 數據集為例:

docker run -v $PWD:/medium-facenet-tutorial \
  -e PYTHONPATH=$PYTHONPATH:/medium-facenet-tutorial \
  -it colemurray/medium-facenet-tutorial python3 /medium-facenet-tutorial/medium_facenet_tutorial/download_and_extract_model.py \
  --model-dir /medium-facenet-tutorial/etc

載入遷入

接下來,你將利用 Tensorflow 的 queue API 來平行載入已經預處理好的圖片。通過使用列隊 (queues),可以使用多線程平行載入圖片。使用 GPU 時,這使你可以在 CPU 上執行圖片預處理,並在 GPU上執行行矩陣乘法。

訓練分類器

輸入隊列處理好後,下一步是創建嵌入。

首先,你將從你創建的隊列中載入圖片。在開始訓練前,還有一步額外的預處理步驟:對圖片添加隨機變換,例如翻轉或是亮度及對比的改變,以增加訓練用的資料

在訓練模型時,我們會以 128 張圖片作為一個批次(batch)。而對於每張圖片,此模型會回傳一個 128 維度的嵌入,所以每一個批次會回傳一個 128(每張圖片的嵌入維度) x 128(每個批次的圖片張數) 的矩陣。

接下來,這些嵌入將被做為 scikit-learn SVM 分類器的輸入特徵值,以訓練出一個可以進行身份識別的分類器。如果其中某個身份的人臉資料少於 10 張圖片的話,則該身份資料將忽略不計,此參數可以經由命令行調整。

docker run -v $PWD:/medium-facenet-tutorial \
  -e PYTHONPATH=$PYTHONPATH:/medium-facenet-tutorial \
  -it colemurray/medium-facenet-tutorial \
  python3 /medium-facenet-tutorial/medium_facenet_tutorial/train_classifier.py \
  --input-dir /medium-facenet-tutorial/output/intermediate \
  --model-path /medium-facenet-tutorial/etc/20170511-185253/20170511-185253.pb \
  --classifier-path /medium-facenet-tutorial/output/classifier.pkl \
  --num-threads 16 \
  --num-epochs 25 \
  --min-num-images-per-class 10 \
  --is-train 
# ~16 mins to complete on MBP

評估結果

訓練好分類器之後,就可以使用訓練資料之外的新圖片進行測試。只要將前述指令中的 is_train 去除就可以評估實驗結果。

docker run -v $PWD:/$(basename $PWD) \
  -e PYTHONPATH=$PYTHONPATH:/medium-facenet-tutorial \
  -it colemurray/medium-facenet-tutorial \
  python3 /medium-facenet-tutorial/medium_facenet_tutorial/train_classifier.py \
  --input-dir /medium-facenet-tutorial/output/intermediate \
  --model-path /medium-facenet-tutorial/etc/20170511-18253/20170511-185253.pb \
  --classifier-path /medium-facenet-tutorial/output/classifier.pkl \
  --num-threads 16 \
  --num-epochs 5 \
  --min-num-images-per-class 10

完成每個圖片的推論後,你會在 console 看到如下結果。

結論

在這篇人臉辨識的教學中,你可以學到機器學習的歷史以及如何製作先進的 pipeline。你知道該如何利用 docker 來管理您的 libraries 的依賴關係,提供一個與平台無關的一致環境。您使用Dlib進行預處理,使用 Tensorflow + Scikit-learn 訓練能夠基於圖片預測身份的分類器。

延伸閱讀:

1. 如何在 TensorFlow 使用深度學習建立臉部辨識 (一)
2. 如何在 TensorFlow 使用深度學習建立臉部辨識 (二)

(原文經授權且翻譯自:https://goo.gl/oKQrHa)

 


連絡「GCP 專門家」