InsightFace - 使用篇, 如何一鍵刷分LFW 99.80%, MegaFace 98%.

開頭先把論文和開源項目地址放一下:

Additive Angular Margin Loss for Deep Face Recognitionarxiv.org

deepinsight/insightfacegithub.com圖標

InsightFace庫是對我們上述論文中提出演算法的開源實現. 其中不僅僅包括我們自己的演算法, 也包括其他常見的人臉loss, 比如Softmax, SphereFace, AMSoftmax, CosFace, Triplet Loss等等. 除了代碼實現以外, 我們還提供了打包對齊好的人臉訓練數據供下載, 免除了一大堆數據準備的工作. 研究人員可以專註於人臉識別的演算法實驗, 工業界也可以方便的根據自己需求訓練或者拿我們提供的高精度預訓練模型產品化.

目前暫列MegaFace榜單第一名:

之後會單獨開一篇談談我對MegaFace這個評測集的看法, 不是今天的主題.

總之, 用了我們InsightFace的人, 一日之內會武功突飛猛進,打通任督二脈,吃飯香,睡得好,最後渾身血管。。。可能有朋友要問了:"那麼。。在哪裡才能買(yong)到呢?" 巧了,下面就為您講解.

此外今天我們也暫時不提具體演算法細節, 先教大家如何使用我們這個開源項目來做人臉方面的研究和落地項目.

環境需求:

  1. Linux
  2. Python 2.7

環境搭建:

1.安裝MXNet:

1.1 從pip安裝:

pip install -U six scipy scikit-learn opencv-python scikit-image easydict mxnet-cu80

1.2 編譯安裝(以乾淨的Centos 7為例):

yum install epel-releaseyum install git python-devel.x86_64 openblas-devel.x86_64 libSM opencv-devel python-pippip install -U six scipy scikit-learn opencv-python scikit-image easydictgit clone --recursive https://github.com/apache/incubator-mxnet.git mxnet; cd mxnetmake -j4 USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1 ADD_CFLAGS=-I/usr/include/openblas ADD_LDFLAGS=-L/usr/lib64cd python; pip install -e .

2. 安裝/下載InsightFace

git clone --recursive https://github.com/deepinsight/insightface.git

3. 給insightface項目Star一下.

至此, 代碼環境搭建完畢.

訓練數據集下載和說明:

Refine-MS1M: pan.baidu.com/s/1nxmSCc (推薦)

VGG2: pan.baidu.com/s/1c3KeLz

所有數據集均用MXNet IndexedRecord存儲, 加速讀取性能.

文件列表:

faces_ms1m_112x112/ train.idx train.rec property lfw.bin cfp_ff.bin cfp_fp.bin agedb_30.bin

其中train.idxtrain.rec分別是數據偏移索引和數據本身的文件. property代表數據集屬性. 其餘4個bin文件是驗證集,

MXNet IndexedRecord是一種類kv結構. key是一個整數, 每個value代表數據並可包含一個header記錄數據的標籤.

InsightFace Record格式:

key:0, value_header => [identities_key_start, identities_key_end]key∈[1, identities_key_start), value_header => [identity_label], value_content => [face_image]key∈[identities_key_start, identities_key_end), value_header => [identity_key_start, identity_key_end]

這樣的格式既可以支持Softmax這種類型的訓練(不需要按人物分組), 又能支持類Triplet Loss的訓練(通過id->images映射)

具體生成rec文件的命令可參考src/data/face2rec2.py

所有人臉圖片均用MTCNN檢測5點並相似變換到112x112大小.

訓練過程:

預備工作,設定一些MXNet相關環境變數保證性能:

export MXNET_CPU_WORKER_NTHREADS=24export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice

接下來舉幾個例子說明,

1. 性價比最高的模型:

CUDA_VISIBLE_DEVICES=0,1,2,3 python -u train_softmax.py --network r100 --loss-type 4 --margin-m 0.5 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-r100

--network r100 代表使用 LResNet100-IR(L-IR是默認選項, 也可修改).

--loss-type 4--margin-m 0.5代表使用我們的additive angular loss.

--data-dir指定訓練數據目錄.

--prefix指定模型輸出目錄.

默認的每張卡batch-size為128, 可通過--per-batch-size修改.

默認每2000個iterators輸出一次驗證集結果, 包括lfw,cfp,agedb-30. 可通過--verbose修改.

硬體需求: 4*P40. 如果只有12G卡的話, 參考issue 32 .

這個模型可以完美復現我們提交的MegaFace結果, 並且lfw能達到99.81或99.83.

(提供的訓練數據集已經剔除了和FaceScrub重複的人物, 如果不剔除的話, MegaFace達到98.5左右都是可能的. 同時在另一個剔除LFW重複人物的實驗上, LFW精度並沒有降低)

2.訓練MobileNetV1,Softmax.

CUDA_VISIBLE_DEVICES=0,1,2,3 python -u train_softmax.py --network m1 --loss-type 0 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-m1-softmax

除了--network m1--loss-type 0以外和上面的例子基本沒有差別. --loss-type 0代表Softmax Loss. m1代表MobileNetV1. 我們另外還支持InceptionResNetV2, DPN, DenseNet, 等等.

3.Fine-tuning Triplet Loss, 在上述模型的基礎上.

CUDA_VISIBLE_DEVICES=0,1,2,3 python -u train_softmax.py --network m1 --loss-type 12 --lr 0.005 --mom 0.0 --per-batch-size 150 --data-dir ../datasets/faces_ms1m_112x112 --pretrained ../model-m1-softmax,50 --prefix ../model-m1-triplet

注意一下後面的參數(lr, weight decay, momentum等).--loss-type 12代表Triplet Loss. 另外我們已經把semi-hard mining放入GPU計算, 極大加快了訓練速度.

模型測試和部署:

0. 預訓練模型下載:

0.1 LResNet50-IR: pan.baidu.com/s/1mj6X7M LFW: 99.80

0.2 LResNet34-IR: pan.baidu.com/s/1jKahEX LFW: 99.65. 單張圖模型推理時間(包括對齊): 17ms

1. Verification Test.

lfw,cfp,agedb-30這幾項已經在訓練時不斷被測試了. 如果想用訓好的模型測試這幾項得分的話, 可參考 src/eval/verification.py.

2.MegaFace Test.

參考 src/megaface/目錄, 分三步走: 一、對齊FaceScrub和MegaFace distractors. 二、生成對應feature(src/megaface/gen_megaface.py), 三、運行megaface development kit.

3.模型部署.

我們提供了一些腳本, 可參考做模型部署. 值得注意的是輸入的圖片不需要被對齊, 只需要檢測人臉後裁剪就可以.

3.1 進入deploy/文件夾.

3.2 訓練或下載訓好的模型.

3.3 參考 deploy/test.py 輸入一張檢測並切割好的面部照片, 返回512維的embedding. 利用上述的 LResNet34-IR模型, 單次推理僅需17毫秒(Intel E5-2660 @ 2.00GHz, Tesla M40).

結語:

希望有更多人的人來用我們這個庫, 也歡迎大家來貢獻代碼. 有問題隨時留言或者在github上提issue.


推薦閱讀:

靠臉吃飯的時代來了,但安全問題值得關注
計算機視覺技術

TAG:人臉識別 | mxnet |