Face Recognition 人臉辨識 Python 教學

李謦伊
謦伊的閱讀筆記
5 min readJul 10, 2021

人臉辨識在 Computer Vision 中一直是很火熱的話題,也是目前廣為人知的一項技術。本質上分為 Face Verification、Face Recognition:前者為驗證兩張人臉是否為同一個人,屬於一對一的過程;後者則是從數據庫裡辨識出相同的人臉,屬於一對多的過程。詳細的人臉辨識解說可以參考: 使用深度學習進行人臉辨識: Triplet loss, Large margin loss(ArcFace)

本文將要使用 Python 來進行人臉辨識的實作,過程分為幾個階段:

  • Face Detection
  • Face Align
  • Feature extraction
  • Create Database
  • Face Recognition

首先安裝相關 library

$ pip install scikit-learn$ pip install onnxruntime

Face Detection

這部分要進行人臉偵測,可以使用 Python API MTCNNRetinaFace,這邊示範使用 RetinaFace 來進行偵測。

  • 安裝 RetinaFace
$ pip install retinaface
  • 偵測

接著就可以來偵測人臉啦~輸出會有預測框左上角跟右下角、兩個眼睛、鼻子、嘴巴兩邊的座標值

# output[{‘x1’: 243, ‘y1’: 142, ‘x2’: 557, ‘y2’: 586, ‘left_eye’: (303, 305), ‘right_eye’: (431, 346), ‘nose’: (305, 403), ‘left_lip’: (272, 468), ‘right_lip’: (364, 505)}]

❗ 若在使用 RetinaFace 的時候,出現以下錯誤

有可能是因為無法導入 shapely.geometry 模塊的關係,因此要先去下載 Shapely package,下載網址 → 🔗

下載完後再執行以下指令

$ pip install <your Shapely package path>

測試是否安裝成功

$ python
>>> from shapely.geometry
import Polygon

Face Align

這部分要來將人臉特徵點進行對齊,需要先定義對齊的座標,在 onnx arcface_inference.ipynb 裡的 Preprocess images 中可以看到。

接著就用 skimage 套件 transform.SimilarityTransform() 得到要變換的矩陣,然後進行對齊。

對齊特徵點後的人臉會呈現以下樣子

Feature extraction

這部分要提取剛剛對齊後的人臉特徵,這邊示範使用 onnx ArcFace model。

  • InsightFace-REST 模型 arcface_r100_v1 下載 → 🔗
  • onnx 官方模型下載 → 🔗

如果是下載 onnx 官方模型需要先進行更新,因為該模型的 BatchNorm 節點中 spatial 為 0,參考: https://github.com/onnx/models/issues/156。不過轉換過後的模型準確度較差,因此資料集需要放兩張比較能夠偵測出來。

接著使用模型進行提取~ 將對齊後的人臉做轉置,再轉換 dtype 為 float32,最後進行 inference

Create Database

這部分要將辨識的人臉資料寫進資料庫裡,這邊資料庫是使用 sqlite。

首先,準備要辨識的人臉資料

接著把上面的 Face Detection、Face Align、Feature extraction 寫成函數,調用比較方便。然後將資料夾的圖片分別進行偵測、對齊、提取特徵後,再寫入資料庫裡。

確認是否寫入資料庫裡

Face Recognition

這部分是要將資料庫裡的人臉特徵跟輸入照片進行比對,這邊使用 L2-Norm 來計算之間的距離。最後再設定 threshold,若 L2-Norm 距離大於 threshold 表示輸入照片不為資料庫裡的任何一個人;反之,L2-Norm 距離最小的人臉與輸入照片為同一個人。

接下來就來測試看看吧!由以下測試結果可以看出,在資料庫的人臉都有正確的識別到,而不在的則會顯示 Unknown Person。

詳細的 code 可參考我的 Github

--

--