官方有详细的训练部分的内容,参考insightface官方github的Deep Face Recognition部分内容。但关于训练数据准备、测试数据准备没有详细说明,本文主要阐述数据准备部分以及小部分训练参数设置问题。
按id分类
代码:./src/align_lfw.py
parser.add_argument('--input-dir', type=str, help='Directory with unaligned images.')
parser.add_argument('--output-dir', type=str, help='Directory with aligned face thumbnails.')
parser.add_argument('--image-size', type=str, help='Image size (height, width) in pixels.', default='112,112')
生成的图片按id分类,并对齐和resize成了image-size参数大小的统一图片(人脸识别输入通常是112×112)。output-dir下会生成一个lst文件,格式如下:
是否对齐 | 图片路径 | 重新生成的id |
---|---|---|
1 | /insightface_data/align_img/0_6753546/1.jpg | 0 |
1 | /insightface_data/align_img/0_6753547/7.jpg | 1 |
MXNet训练时的标准输入文件是.rec形式的,就类似于tensorflow中的.tfrecord形式,所以需要做一个.rec文件.
在生成rec前需要touch一个property文件,内容为:id,image-size(height),image-size(width).
源码中在./src/data/face2rec.py里。需要注意的参数:
def parse_args():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
description='Create an image list or make a record database by reading from an image list')
parser.add_argument('prefix', help='prefix of input/output lst and rec files.')
# prefix是制作训练集的output-dir.(前面对齐已生成lst文件,需要命名为.lst)
# cgroup是制作lst的选项,但是源代码中将root folder已经注释掉了,所以不太清楚这段代码还是否能生成lst.详细见源码.
cgroup = parser.add_argument_group('Options for creating image lists')
# rgroup是生成数据集的选项.详细见源码.
rgroup = parser.add_argument_group('Options for creating database')
args = parser.parse_args()
args.prefix = os.path.abspath(args.prefix)
return args
运行时:
python face2rec2.py prefix
# .lst中有image的位置和id,只需要写prefix的地址就行,但是lst要放在prefix文件夹下.
待续,以后如果需要使用自标或者其他数据集再制作.
目前官方已提供了很多验证集:agedb_30.bin,calfw.bin,cfp_ff.bin,cfp_fp.bin,cplfw.bin,vgg2_fp.bin.
位置在./recognition/config.py,需要关注的设置:
# dataset settings
dataset = edict()
dataset.emore = edict()
dataset.emore.dataset = 'emore'
dataset.emore.dataset_path = '../datasets/faces_emore'
dataset.emore.num_classes = 85742
dataset.emore.image_shape = (112,112,3)
dataset.emore.val_targets = ['lfw', 'cfp_fp', 'agedb_30']
# pretrained model setting
default.pretrained = '/home/insightface/recognition/model-r100-ii/model'
default.pretrained_epoch = 1
# default dataset
default.dataset = 'emore'
default.loss = 'arcface'
# _cb = mx.callback.Speedometer(args.batch_size, args.frequent) 每隔多少个batch显示一次结果.
default.frequent = 20
# verbose为验证和保存模型的间隔batch.
default.verbose = 2000
default.kvstore = 'device'
default.end_epoch = 10000
# 要根据数据集大小调整,小数据需要调小.
default.lr = 0.1
default.wd = 0.0005
default.mom = 0.9
# 根据显卡内存调整.
default.per_batch_size = 128
# 'checkpoint saving option. 0: discard saving. 1: save when necessary. 2: always save. 3:最优结果覆盖模型'.
default.ckpt = 3
default.lr_steps = '100000,160000,220000'
default.models_root = './models'
位置在./recognition/run.sh,内容结合官方给的训练过程:
#!/usr/bin/env bash
export MXNET_CPU_WORKER_NTHREADS=24
export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice
CUDA_VISIBLE_DEVICES='2,3,4,5,6,7' python -u train.py --network r50 --loss arcface --dataset emore
代码位置:./recognition/eval/verification.py
parser = argparse.ArgumentParser(description='do verification')
# general
parser.add_argument('--data-dir', default='', help='')
parser.add_argument('--model', default='../model/softmax,50', help='path to load model.')
parser.add_argument('--target', default='lfw,cfp_ff,cfp_fp,agedb_30', help='test targets.')
parser.add_argument('--gpu', default=0, type=int, help='gpu id')
parser.add_argument('--batch-size', default=32, type=int, help='')
parser.add_argument('--max', default='', type=str, help='')
parser.add_argument('--mode', default=0, type=int, help='')
parser.add_argument('--nfolds', default=10, type=int, help='')
args = parser.parse_args()