【應用】臉部辨識 – TensorFlow x deep learning (二)
上一篇文章帶您了解了人臉辨識的概念,在這篇文章中我們將實作處理數據、設置環境、得到初步的成果。
使用 Dlib 和 Docker 預先處理數據
# Project Structure
├── Dockerfile
├── etc
│ ├── 20170511–185253
│ │ ├── 20170511–185253.pb
├── data
├── medium_facenet_tutorial
│ ├── align_dlib.py
│ ├── download_and_extract_model.py
│ ├── __init__.py
│ ├── lfw_input.py
│ ├── preprocess.py
│ ├── shape_predictor_68_face_landmarks.dat
│ └── train_classifier.py
├── requirements.txt
準備數據
您可以透過 LFW (Labeled Faces in the Wild) 數據集作為訓練數據。這個數據集的目錄架構如下。你可以仿照同樣的目錄架構,將其中的數據換成你自己的數據。
# Download lfw dataset
curl -O http://vis-www.cs.umass.edu/lfw/lfw.tgz # 177MB
tar -xzvf lfw.tgz
# Directory Structure
# ├── Tyra_Banks
# │ ├── Tyra_Banks_0001.jpg
# │ └── Tyra_Banks_0002.jpg
# ├── Tyron_Garner
# │ ├── Tyron_Garner_0001.jpg
# │ └── Tyron_Garner_0002.jpg
預先處理
下面我們會介紹在將圖片傳入 FaceNet 模型之前如何進行預先處理。在人臉辨識的應用中,圖片的預先處理通常會解決照明差異、遮擋、對齊、切割圖片等問題。接下來會先介紹如何切割(從圖片中切出需要辨識的人臉)和對齊圖片。
首先,解決切割問題的方法是直接找出圖片中最大的人臉。如此一來,作為訓練數據的圖片就不需要提前裁切好。
其次是對齊問題。照片中的人臉通常不會完美的正面朝前。為了將輸入標準化,通常會將人臉經過轉換(transform),使其依照眼睛和下唇的位置通通調整成正面朝前。
Segment, align, and crop
環境設置
這裡,你將使用 docker 安裝 tensorflow、opencv 和 Dlib。Dlib 提供一個可以用於臉部檢測和對齊的資料庫 (libraries)。這些資料庫可能有點難以安裝,使用 docker 進行安裝更為方便。
docker 是一個簡化部署的容器平台。它解決了將軟體安裝到不同伺服器環境的依賴性問題。如果你對 docker 很陌生,可以點此了解更多。要安裝 docker,請輸入:
curl https://get.docker.com | sh
在安裝 docker 之後,你將創建兩個文件。這兩個文件分別是管理 python 相依套件的 requirements.txt 和用來創建 docker 環境的 Dockerfile。
requirements.txt:
dockerfile:
使用下面的指令來建構 docker 映像檔(build docker image):
docker build -t colemurray/medium-facenet-tutorial -f Dockerfile .
# This can take several minutes depending on your hardware
# On MBP, ~ 25mins
# Image can be pulled from dockerhub below
現在聯繫 GCP專門家,瞭解更多 GCP 加值服務!
如果你不想從原始碼重新建構,可以使用以下命令從 dockerhub 直接下載 docker image:
docker pull colemurray/medium-facenet-tutorial # Recommended
# A GPU supported environment can be found here
# nvidia-docker pull colemurray/medium-facenet-tutorial:latest-gpu
檢測, 裁剪和與 Dlib 對齊
創建好你的環境後,你可以開始預先處理。
首先下載 dlib 的臉部座標預測軟體 (dlib’s face landmark predictor)。
curl -O http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
bzip2 -d shape_predictor_68_facelandmarks.dat.bz2
您將使用這個臉部座標預測軟體來查找圖像中臉部的內眼睛和下嘴唇的位置。這些坐標將用於居中對齊圖像。
align_dlib.py:
上述引用自 CMU 的程式碼提供了檢測圖像中的臉部、找到臉部標記、並且基於這些臉部標記進一步對齊人臉的做法。
接下來,你可以為你的數據集創建一個預處理器。這個文件將讀取每個圖像到記憶體中,嘗試找到最大的臉,中心對齊,並輸出執行結果。如果在圖像中找不到臉部,日誌記錄會顯示文件名,以方便控管。
由於每個圖像都可以獨立處理,所以我們利用 python 的多執行緒功能讓每個 CPU 分別處理不同的圖檔。
觀看目前的成果
現在你已經創建了一個 pipeline,是時候看結果了!由於我們的 script 用多個 CPU 可以有效提升執行效能。您需要在 docker 環境中跑行預處理器才能使用已安裝的資料庫 (libraries)。
以下的指令是將你的專案目錄以 volume 的形式掛載進入 docker 容器中,並對輸入數據執行預處理腳本(preprocessing script)。結果將寫入使用命令參數指定的目錄。
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/preprocess.py \
--input-dir /medium-facenet-tutorial/data \
--output-dir /medium-facenet-tutorial/output/intermediate \
--crop-dim 180
Code up to this point can be found here
Review
使用 Dlib,你檢測到圖像中最大的臉部,並通過內眼和下唇對齊臉部中心。這種對齊是標準化每個圖像作為特徵輸入的方法。
現在我們了解了人臉辨識的概念,並完成了初步的實作,下一篇最終章將完整您對臉部辨識的了解。
(上一篇:如何在 TensorFlow 使用深度學習建立臉部辨識 (一))
(原文經授權且翻譯自:https://goo.gl/oKQrHa)