人臉辨識在 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 MTCNN、RetinaFace,這邊示範使用 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。
如果是下載 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