https://blog.csdn.net/ctwy291314/article/details/88872490
前言
本文以lfw數據集進行示例
lfw結果集下載地址:http://vis-www.cs.umass.edu/lfw/lfw.tgz
insightface源碼下載地址:https://github.com/deepinsight/insightface
insightface作者提供了完整的工程,能夠基本滿足並完成人臉識別流程
人臉識別流程4步:1、檢測;2、對齊矯正;3、提取特徵;特徵匹配
其中,檢測對齊使用ssh或mtcnn並用dlib即可實現,然後對完成1和2步的人臉圖像進行提取特徵,作者使用的是改進後的resnet網絡來提取特徵(其中用的損失層爲arcface loss),提取到的512維向量,歸一化後內積得到相似度。
insightface讓我感覺是一個大型的分類問題,其中的迴歸問題例如迴歸出人臉關鍵點並進行對齊矯正的代碼作者已經幫我們寫好了,所以這個流程僅僅有實踐意義,理論講述可以看作者發表的論文,講述得很詳細。
在實現一個優秀人臉識別系統的過程中,我覺得應該有幾個重要環節:
1、乾淨而且大量的數據
2、優秀的網絡結構
3、優秀的網絡損失函數
4、由以上1,2,3決定一個優秀的模型,作爲一個大型的分類過程,優秀的模型能夠提取到人臉更加獨有的特徵,具有更好的“辨別特性”
數據清洗
用的方法是先用作者的model對我的數據集進行一次特徵提取和匹配,對於數據集中的每一個人我有一張標準的底圖,提取了底圖的特徵並對每個人的所有圖片進行匹配,將不匹配的圖片剪切出來進行人工篩選,(人多的話併合理用一些工具軟件,用上幾天就能將人臉數據集清洗得很好了,但不能隨意刪除圖片,確認是不同的人或圖片質量十分差才能清掉)
製作訓練集
製作成rec和idx的數據集需要先檢測對齊,使用作者的 $INSIGHTFACE/src/align 的對齊代碼可以檢測對齊並生成lst,使用作者的 $INSIGHTFACE/src/data中的face2rec2.py生成example.rec、example.idx
lfw結果集解壓至/home/hylink/eclipse-workspace/目錄
在這裏插入圖片描述
insightface源碼解壓至/home/hylink/eclipse-workspace/目錄
切換目錄
cd /home/hylink/eclipse-workspace/insightface-master/src/align/
數據檢測對齊矯正
python align_lfw.py --input-dir /home/hylink/eclipse-workspace/lfw --output-dir /home/hylink/eclipse-workspace/lfw_aligned --image-size 112,112
執行成功後在output-dir目錄下生成lst文件
在這裏插入圖片描述
lst中包含的內容如下:
在這裏插入圖片描述
中間用\t分開,第一個參數代表是否對齊,第二個參數代表圖片的路徑,第三個參數代表圖片的標籤,整個lst文件要求標籤必須從0並從小到大排列,不然生成的rec和idx會出錯
face2rec2.py需要用到property和lst
property需要手動新建文件,它是屬性文件,裏面內容是類別數和圖像大小,例如
1000,112,112 其中1000代表人臉的類別數目,圖片格式爲112x112
在這裏插入圖片描述
使用face2rec2.py會在指定目錄下尋找lst結尾的文件,因此可把lst更名爲example.lst
在這裏插入圖片描述
運行face2rec2.py會在指定目錄下生成example.rec、example.idx
切換目錄
cd /home/hylink/eclipse-workspace/insightface-master/src/data/
source activate python27
python face2rec2.py /home/hylink/eclipse-workspace/lfw_aligned
運行成功後生成以下文件:
在這裏插入圖片描述在這裏插入圖片描述
其中rec是已經對齊完成的圖像數據,idx是索引
整體結構如下:
在這裏插入圖片描述
製作驗證集
作者提供給我們的驗證集有lfw.bin,cfp_fp.bin,agedb_30.bin等,但是是基於歐美的臉型,如果要製作自己的人臉識別系統,最好用實際場景下的數據來製作驗證集,用歐美臉型訓練出來的模型在亞洲臉型的驗證集的表現並沒有歐美臉型那麼高,所以最好訓練的時候也用上亞洲的臉型和驗證集。我這裏僅介紹用作者提供的lfw2pack.py製作自己數據的驗證集*.bin。
需要pairs.txt,例如我製作的pairs.txt,前3000行代表3000對匹配的數據,後3000行代表3000對不匹配的數據(排列組合,隨機匹配的可能會導致重複),舉個例子:
Abel_Pacheco 1 4
Akhmed_Zakayev 1 3
Akhmed_Zakayev 2 3
Amber_Tamblyn 1 2
Anders_Fogh_Rasmussen 1 3
Anders_Fogh_Rasmussen 1 4
Angela_Bassett 1 5
Angela_Bassett 2 5
Angela_Bassett 3 4
Adrian_Annus 1 Jorge_Marquez-Ruarte 1
Adrian_Annus 1 Patrick_Bourrat 1
Adrian_Murrell 1 Jose_Cevallos 1
Adrian_Murrell 1 Paul_Brandt 1
Ahmed_Ibrahim_Bilal 1 Beatrice_Dalle 1
Ahmed_Ibrahim_Bilal 1 Lee_Chang-dong 1
Aileen_Riggin_Soule 1 Norio_Ohga 1
Aitor_Gonzalez 2 Horace_Donovan_Reid 1
Ajit_Agarkar 1 Jesse_James 1
Akbar_Al_Baker 1 Andrei_Konchalovsky 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
例如:
1、Abel_Pacheco 1 4 代表它是圖片Abel_Pacheco_0001.jpg和Abel_Pacheco_0004.jpg相匹配
2、Adrian_Annus 1 Jorge_Marquez-Ruarte 1 代表它是圖片Adrian_Annus_0001.jpg和Jorge_Marquez-Ruarte_0001.jpg不匹配
運行如下終端命令(記得訓練集和驗證集的圖片應當分開):
python lfw2pack.py --data-dir datasets/DATA_ALIGNED_VAL --image-size "112,112" --output ./val.bin
模型訓練
訓練的話最好寫成一個腳本,直接運行腳本比較好修改參數,例如:
#!/usr/bin/env bash
export MXNET_CPU_WORKER_NTHREADS=48
export MXNET_CUDNN_AUTOTUNE_DEFAULT=0
export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice
export MXNET_ENABLE_GPU_P2P=0
DATA_DIR=path/face_emore
NETWORK=r50
JOB=Insightface
MODELDIR="../model-$NETWORK-$JOB-faces_emore"
mkdir -p "$MODELDIR"
PREFIX="$MODELDIR/model"
LOGFILE="$MODELDIR/log-$NETWORK-`date +%Y-%m-%d-%H-%M-%S`.log"
CUDA_VISIBLE_DEVICES='0,1,2,3,4,5,6,7' python -u train_softmax.py --ckpt 2 --data-dir "$DATA_DIR" --margin-m 0.5 --network "$NETWORK" --loss-type 4 --prefix "$PREFIX" --per-batch-size 64 2>&1 | tee $LOGFILE
#其中各個參數的意義要到train_softmax.py去看,對於調節訓練的方式很重要,另外,也可以使用作者訓練好的模型作爲預訓練模型,對我們自己的數據進行fine turning(使用我們自己的數據的話網絡的最後一層的輸出應當修改一下),對於我們自己實際場景中使用的效果是會提高的,但lfw等指標會降低。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
模型評估(驗證集與Megaface、facescrub)
模型評估我用了兩種方式,一種是製作驗證,另一種是devkit的評估,也就是計算出rank1,求出rank1比較規範一些。
關於megaface的rank1評測方式請參考 https://blog.csdn.net/jmu201521121021/article/details/81151758
評測自己的數據集的rank1值可能需要自己撰寫一下腳本。
製作驗證集的方式最簡單,將自己的驗證集製作成bin格式,再使用作者提供的評估腳本即可,格式如下:
cd INSIGHTFACE/src/eval
python -u verification.py --gpu 0 --model "r50,100" --target lfw
#使用verification.py來測試模型r50-0100.params對lfw.bin的精確度
https://blog.csdn.net/ctwy291314/article/details/88872490