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