Insightface/Arcface项目实践流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wuzebiao2016/article/details/81868443

Insightface/Arcface项目实践流程

Code:https://github.com/deepinsight/insightface
作者提供了完整的工程,能够基本满足并完成人脸识别的这个流程。

以下纯属个人实践记录,如有不当还望各位前辈多多指教。


人脸识别流程4步:1、检测;2、对齐矫正;3、提取特征;特征匹配
其中,检测对齐使用ssh或mtcnn并用dlib即可实现,然后对完成1和2步的人脸图像进行提取特征,作者使用的是改进后的resnet网络来提取特征(其中用的损失层为arcface loss),提取到的512维向量,归一化后内积得到相似度。


insightface让我感觉是一个大型的分类问题,其中的回归问题例如回归出人脸关键点并进行对齐矫正的代码作者已经帮我们写好了,所以这个流程仅仅有实践意义,理论讲述可以看作者发表的论文,讲述得很详细。
在实现一个优秀人脸识别系统的过程中,我觉得应该有几个重要环节:
1、干净而且大量的数据
2、优秀的网络结构
3、优秀的网络指挥棒(损失函数)
4、由以上1,2,3决定一个优秀的模型,作为一个大型的分类过程,优秀的模型能够提取到人脸更加独有的特征,具有更好的“辨别特性”
5、部署途径
(1)提取底图特征并保存数据库,就是要有每一个人的标准人脸图像,经过模型进行一遍提取之后的特征保存到数据库当中。
(2)索引匹配的人脸特征,对检测到的人进行检测、对齐矫正并经过模型提取到“独有”的特征,然后利用该特征与数据库中的人脸特征进行匹配,输出匹配程度最高的前几个人。


以下是数据清洗、数据检测对齐矫正、训练集和验证集制作、模型训练与评估的流程记录:

一、数据清洗,用的方法是先用作者的model对我的数据集进行一次特征提取和匹配,对于数据集中的每一个人我有一张标准的底图,提取了底图的特征并对每个人的所有图片进行匹配,将不匹配的图片剪切出来进行人工筛选,(人多的话并合理用一些工具软件,用上几天就能将人脸数据集清洗得很好了,但不能随意删除图片,确认是不同的人或图片质量十分差才能清掉)

二、数据检测对齐矫正,数据检测对齐矫正,可以用ssh和dlib,也可以直接用作者提供的align_dataset_mtcnn.py,ssh表现效果确实比mtcnn这个好,但是相对麻烦了一点,所以我这里直接用了作者的align_dataset_mtcnn.py。

cd $INSIGHTFACE\src\align
python align_dataset_mtcnn.py --image_size 112 --margin 0 --gpu_memory_fraction 0.8 path/src_images path/aligned_images
#作者用了margin=44,我这里使用了margin=0,可以都试一下,看看效果。

这个align_dataset_mtcnn.py在gpu使用方面有些奇怪的地方,使用了8块1080 Ti,可用的总显存应该也有90GB,但是当我运行align_dataset_mtcnn.py的时候,总显存被它全部占满了,并且它的计算利用率特别低,只用了第一张卡的百分之十以内,才发现它其他卡占用着根本没有用,为了提高对齐效率,我用了比较傻的办法,我把几百万张图片分成了十几份,用了好几个终端,也就是好多个进程分别对这十几份进行对齐,但最后输出目录还是path/aligned_images,也就是总的输出目录不变,就这样所有卡的利用率都提高了很多,显存占满了但对齐速度是之前的好多倍。
PS:其实要好的方法是写个多线程。
PS:在实际对比中发现使用align_dataset_mtcnn.py进行对齐矫正貌似会发生人脸扭曲的情况,如果是重训练开源数据集的情况可以使用开源数据集提供的landmark对已检测出来的人脸进行对齐矫正,那样子效果会好很多。

三、制作训练集,训练集需要.rec,.idx,*.lst,property
其中rec是已经对齐完成的图像数据,idx是索引,需要用到lst来生成rec和idx,lst中包含的内容如下(举个例子)
1 path/Adam_Brody/Adam_Brody_277.png 25
中间用\t分开,第一个参数代表是否对齐,第二个参数代表图片的路径,第三个参数代表图片的标签,整个lst文件要求标签必须从0并从小到大排列,不然生成的rec和idx会出错。
另外,property是属性文件,里面内容是类别数和图像大小,例如
1000,112,112 其中1000代表人脸的类别数目,图片格式为112x112

cd $INSIGHTFACE\src\data
python face2rec2.py --encoding=.png $INSIGHTFACE/datasets/DATA_ALIGNED
#其中$INSIGHTFACE/datasets/DATA_ALIGNED目录下要有*.lst,property

四、验证集的制作,作者提供给我们的验证集有lfw.bin,cfp_fp.bin,agedb_30.bin等,但是是基于欧美的脸型,如果要制作自己的人脸识别系统,最好用实际场景下的数据来制作验证集,用欧美脸型训练出来的模型在亚洲脸型的验证集的表现并没有欧美脸型那么高,所以最好训练的时候也用上亚洲的脸型和验证集。我这里仅介绍用作者提供的lfw2pack.py制作自己数据的验证集*.bin。
1、需要pairs.txt,例如我制作的pairs.txt,前5000行代表5000对匹配的数据,后5000行代表5000对不匹配的数据(排列组合,随机匹配的可能会导致重复),举个例子:
Alley_Mills 6 45
Brendan_Fraser 26 3
Brendan_Fraser 25 10
Alley_Mills 16 28
Billy_Burke 42 11
Andrea_Bowen 43 13
Alley_Mills 31 Bobbie_Eakes 34
Brianna_Brown 35 Andrea_Bowen 43
Andrea_Bowen 11 Alec_Baldwin 16
Alley_Mills 4 Bobbie_Eakes 43
Bobbie_Eakes 20 Alec_Baldwin 6
Brianna_Brown 14 Christel_Khalil 48
例如“Alley_Mills 6 45” 代表它是图片Alley_Mills_0006.png和Alley_Mills_0045.png相匹配,如果不用数字来找的话就去改动一下lfw2pack.py的代码,是小改动。
2、运行如下终端命令(记得训练集和验证集的图片应当分开):

python lfw2pack.py --data-dir datasets/DATA_ALIGNED_VAL --image-size "112,112" --output ./val.bin

PS:作者好像有直接提供制作pairs.txt到生成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等指标会降低。

六、模型评估(验证集与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的精确度

猜你喜欢

转载自blog.csdn.net/Wuzebiao2016/article/details/81868443