1. 程式人生 > >InsightFace原始碼以及pre-train模型以及使用

InsightFace原始碼以及pre-train模型以及使用

其實這篇論文可以看作是AmSoftmax的一種改進版本,總體思路相對較為簡單。

AmSoftmax:

這裡寫圖片描述

Arcface:

這裡寫圖片描述

這樣修改的原因

角度距離比餘弦距離在對角度的影響更加直接

決策邊界的具體比較如下圖
這裡寫圖片描述

IR

除了損失函式的改進之外,作者還提出了一種稱為IR的網路結構,就是對Resnet的block進行了一些改進,文章說更適合對人臉圖片的訓練了
這裡寫圖片描述

實驗

使用了幾種網路結構作實驗,包括MobileNet、 Inception-
Resnet-V2、Densely connected convolutional networks
(DenseNet)、Squeeze and excitation networks
(SE) 和Dual path Network (DPN)
實驗結果如下:

lfw得分

這裡寫圖片描述

MegaFace得分

這裡寫圖片描述
截止當前(2018年3月),是MegaFace榜第一,達到了98.36%的成績,但是因為作者對動了MegaFace中的資料,將FaceScrub與MegaFace1M干擾項中重疊的部分去除了,(這也就是表中R的含義),因此不能體現該演算法對其他演算法有絕對的優勢。
即便如此,這篇論文以及作者開源的程式碼對人臉識別研究做出的貢獻也是不可磨滅的。

--------------------- 本文來自 Fire_Light_ 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/Fire_Light_/article/details/79602705?utm_source=copy

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-release
yum install git python-devel.x86_64 openblas-devel.x86_64 libSM opencv-devel python-pip
pip install -U six scipy scikit-learn opencv-python scikit-image easydict
git clone --recursive https://github.com/apache/incubator-mxnet.git mxnet; cd mxnet
make -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/lib64
cd python; pip install -e .

2. 安裝/下載InsightFace

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

3. 給insightface專案Star一下.

至此, 程式碼環境搭建完畢.

訓練資料集下載和說明:

所有資料集均用MXNet IndexedRecord儲存, 加速讀取效能.

檔案列表:

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

其中train.idx 和 train.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=24
export 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. 預訓練模型下載:

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).

以下給出模型下載連結:

3.1 LResNet100E-IR,[email protected]

Performance:

Method LFW(%) CFP-FP(%) AgeDB-30(%) MegaFace(%)
Ours 99.77 98.27 98.28 98.47

3.2 LResNet50E-IR,[email protected]

Performance:

Method LFW(%) CFP-FP(%) AgeDB-30(%) MegaFace(%)
Ours 99.80 92.74 97.76 97.64

3.3 LResNet34E-IR,[email protected]

Performance:

Method LFW(%) CFP-FP(%) AgeDB-30(%) MegaFace(%)
Ours 99.65 92.12 97.70 96.70

3.4 MobileFaceNet,[email protected]

Performance:

Method LFW(%) CFP-FP(%) AgeDB-30(%) MegaFace(%)
Ours 99.50 88.94 95.91 -----