当前位置:   article > 正文

insightface训练数据制作详细说明以及部分训练参数设置

insightface训练

官方有详细的训练部分的内容,参考insightface官方githubDeep 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')
  • 1
  • 2
  • 3

生成的图片按id分类,并对齐和resize成了image-size参数大小的统一图片(人脸识别输入通常是112×112)。output-dir下会生成一个lst文件,格式如下:

是否对齐图片路径重新生成的id
1/insightface_data/align_img/0_6753546/1.jpg0
1/insightface_data/align_img/0_6753547/7.jpg1

训练数据.rec的制作

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文件,需要命名为<prefix>.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行时:

python face2rec2.py  prefix
# <prefix>.lst中有image的位置和id,只需要写prefix的地址就行,但是lst要放在prefix文件夹下.
  • 1
  • 2

二、验证数据制作

待续,以后如果需要使用自标或者其他数据集再制作.
目前官方已提供了很多验证集:agedb_30.bin,calfw.bin,cfp_ff.bin,cfp_fp.bin,cplfw.bin,vgg2_fp.bin.

三、一些训练细节和参数

config.py

位置在./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'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

run.sh

位置在./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
  • 1
  • 2
  • 3
  • 4

四、测试

代码位置:./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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/289242
推荐阅读
相关标签
  

闽ICP备14008679号