文章目录
mxnet+insightface框架搭建
1. 安装 python2
insightface使用python2.7(2010年1月就退役了emmm),安装anaconda2:
$ wget https://repo.anaconda.com/archive/Anaconda2-2019.03-Linux-x86_64.sh
$ sh Anaconda2-2019.03-Linux-x86_64.sh
之后一路回车安装成功,原来有anaconda3还想直接用的就改一下bashrc
接下来开始按官方教程走,准备mxnet和insightface
2. 安装 mxnet
使用阿里云境像安装mxnet,速度很快
$ pip install mxnet-cu90 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
期间说少个什么依赖,“tables 3.5.1 requires mock>=2.0, which is not installed.”,理论上没什么影响,还是装了吧
$ pip install mock==2.0.0 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
3. 克隆insightface仓库到本地
$ git clone --recursive https://github.com/deepinsight/insightface.git
然后去datasetzoo准备一个训练集
MS1M-ArcFace (85K ids/5.8M images) [5,7] (Recommend)
解压后放到insight/datasets目录下,目录结构如下
datasets/faces_emore/
train.idx
train.rec
property
lfw.bin
cfp_fp.bin
agedb_30.bin
4. 基本配置
进入insightface/recognition/目录
$ cd recognition
加两个CPU硬件相关的宏定义:
$ export MXNET_CPU_WORKER_NTHREADS=24
$ export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice
这个目录下,我们会看到一个内容十分"caffe-like"的config文件:
sample_config.py
拷一份重命名为config.py,按照自己的需求修改内容(比如数据集路径之类的):
cp sample_config.py config.py
vim config.py # edit dataset path etc..
5. 试运行
以下实例原作者是运行在 Tesla P40 GPU上的:
5.1 训练
(1) Train ArcFace with LResNet100E-IR.
四张卡跑,如果实际卡不够就改CUDA_VISIBLE_DEVICES,一张卡就CUDA_VISIBLE_DEVICES=‘0’:
$ CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network r100 --loss arcface --dataset emore
每2000个batch输出一次LFW、CFP-FP、AgeDB-30的验证结果(config.py中默认设置的),该模型在LFW上结果99.80%+,MegaFace上98.3%+
其它同理
注意,这里一开始运行,说还缺easydict和cv2包,所以要先装这两个包再开始训练:
$ pip install easydict -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
$ pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
$ CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network r100 --loss arcface --dataset emore
开始训练,每2000个batch做一次验证输出结果:
实测原封不动运行这个实验(batch size = per_batch_size(128) * gpu_nums(4) = 512)要75G左右的显存(如下图),卡不够的话还是得根据实际情况调整batch size,1080 ti 一张卡最多只能设置per_batch_size = 64
(2) Train CosineFace with LResNet50E-IR.
$ CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network r50 --loss cosface --dataset emore
(3) Train Softmax with LMobileNet-GAP.
$ CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network m1 --loss softmax --dataset emore
(4) Fine-turn the above Softmax model with Triplet loss.
$ CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train.py --network m1 --loss triplet --lr 0.005 --pretrained ./models/m1-softmax-emore,1
5.2 验证
原作者基于MS1M-Arcface数据集的带ArcFace loss的LResNet100E-IR网络验证结果如下:
| Method | LFW(%) | CFP-FP(%) | AgeDB-30(%) |
|---|---|---|---|
| 原文 | 99.80+ | 98.0+ | 98.20+ |
| 实际验证(迭代307K次384batch_size,忘记停了,相当于230K次512batch_size,原文是160k次512batch_szie) | 0.99817±0.00273 | 0.98529±0.00515 | 0.98067±0.00831 |
测试预训练模型
可以用 insightface/src/eval/verification.py 来验证、测试预训练模型
Model-Zoo里也提供了一些预训练模型
在MegaFace上测试
在insightface/Evaluation/megaface/测试,该目录下README提供了所需要的数据
IJBC测试
insightface/Evaluation/IJB/
5.3 特征提取
进入deploy目录:
$ cd deploy
- 准备一个训练好的模型
- 把模型放到insightface/models目录下,比如insightface/models/model-r100-ii
- 运行测试脚本insightface/deploy/test.py(这个脚本内容演示了一下怎么提取特征和计算相似度,批量生成特征的自己改一个就行)
对于单裁剪人脸图(112x112),原作者的测试服务器上总推断时间只有17ms (Intel E5-2660 @ 2.00GHz, Tesla M40, LResNet34E-IR)
5.4 人脸对齐
详见Menpo Benchmark 和 Dense U-Net
5.5 人脸检测
insightface github仓库地址