# 前言

本項目參考了ArcFace的損失函數結合MobileNet,意在開發一個模型較小,但識別準確率較高且推理速度快的一種人臉識別項目,該項目訓練數據使用emore數據集,一共有85742個人,共5822653張圖片,使用lfw-align-128數據集作爲測試數據。

源碼地址:https://github.com/yeyupiaoling/Pytorch-MobileFaceNet

數據集準備

本項目提供了標註文件,存放在dataset目錄下,解壓即可。另外需要下載下面這兩個數據集,下載完解壓到dataset目錄下。
- emore數據集百度網盤
- lfw-align-128下載地址:百度網盤 提取碼:b2ec

然後執行下面命令,將提取人臉圖片到dataset/images,並把整個數據集打包爲二進制文件,這樣可以大幅度的提高訓練時數據的讀取速度。

python create_dataset.py

訓練

執行train.py即可,更多訓練參數請查看代碼。

python train.py

訓練輸出如下:

[2021-11-03 15:18:28.813591] Train epoch 9, batch: 6100/90979, loss: 1.215695, accuracy: 0.859375, lr: 0.000107, eta: 5 days, 5:28:26
[2021-11-03 15:18:37.044353] Train epoch 9, batch: 6200/90979, loss: 0.908210, accuracy: 0.859375, lr: 0.000107, eta: 5 days, 6:35:02
[2021-11-03 15:18:45.229030] Train epoch 9, batch: 6300/90979, loss: 0.964092, accuracy: 0.875000, lr: 0.000107, eta: 5 days, 9:17:21
[2021-11-03 15:18:53.449567] Train epoch 9, batch: 6400/90979, loss: 1.208947, accuracy: 0.828125, lr: 0.000107, eta: 5 days, 12:41:06
[2021-11-03 15:19:01.682437] Train epoch 9, batch: 6500/90979, loss: 1.081449, accuracy: 0.875000, lr: 0.000107, eta: 5 days, 10:29:44
[2021-11-03 15:19:09.895995] Train epoch 9, batch: 6600/90979, loss: 1.277803, accuracy: 0.828125, lr: 0.000107, eta: 5 days, 12:29:05
[2021-11-03 15:19:18.086872] Train epoch 9, batch: 6700/90979, loss: 1.308692, accuracy: 0.828125, lr: 0.000107, eta: 5 days, 7:23:03
[2021-11-03 15:19:26.306897] Train epoch 9, batch: 6800/90979, loss: 1.474561, accuracy: 0.781250, lr: 0.000107, eta: 5 days, 8:20:23
[2021-11-03 15:19:34.528685] Train epoch 9, batch: 6900/90979, loss: 1.295028, accuracy: 0.812500, lr: 0.000107, eta: 5 days, 5:54:56
[2021-11-03 15:19:42.736712] Train epoch 9, batch: 7000/90979, loss: 1.474828, accuracy: 0.812500, lr: 0.000107, eta: 5 days, 8:32:33

評估

執行eval.py即可,更多訓練參數請查看代碼。

python eval.py

預測

本項目已經不教提供了模預測,模型文件可以直接用於預測。在執行預測之前,先要在face_db目錄下存放人臉圖片,每張圖片只包含一個人臉,並以該人臉的名稱命名,這建立一個人臉庫。之後的識別都會跟這些圖片對比,找出匹配成功的人臉。。這裏使用的人臉檢測是MTCNN模型,這個模型具有速度快,模型小的特點,源碼地址:Pytorch-MTCNN

如果是通過圖片路徑預測的,請執行下面命令。

python infer.py --image_path=temp/test.jpg

日誌輸出如下:

人臉檢測時間:38ms
人臉識別時間:11ms
人臉對比結果: [('迪麗熱巴', 0.7030987), ('楊冪', 0.36442137)]
人臉對比結果: [('楊冪', 0.63616204), ('迪麗熱巴', 0.3101096)]
預測的人臉位置: [[272, 67, 328, 118, 1], [156, 80, 215, 134, 1]]
識別的人臉名稱: ['迪麗熱巴', '楊冪']
總識別時間:82ms

如果是通過相機預測的,請執行下面命令。

python infer_camera.py --camera_id=0
小夜