人脸识别insightFace-模型训练config.py文件注释详解

# !/usr/bin/python
# -*- encoding: utf-8 -*-

import numpy as np
import os
from easydict import EasyDict as edict

# config配置是最基本的配置,如果后面出现相同的,则被覆盖
config = edict()

config.bn_mom = 0.9                                 # 反向传播的momentum
config.workspace = 256                              # mxnet需要的缓冲空间
config.emb_size = 512                               # 输出特征向量的维度
config.ckpt_embedding = True                        # 是否检测输出的特征向量
config.net_se = 0                                   #
config.net_act = 'prelu'                            # 网络激活函数
# 在神经网络中,激活函数不是真的去激活什么,而是用激活函数给神经网络加入一些非线性因素。
# 使得网络可以更好地解决较为复杂的问题。比如有些问题是线性可分的,而现实场景中更多问题不是线性可分的,
# 若不使用激活函数则难以拟合非线性问题,测试时会有低准确率。所以激活函数主要是非线性的,如 sigmod、tanh、relu
# sigmoid 函数通常用于二分类,但要防止梯度消失,故适合浅层神经网络且需要配备较小的初始化权重,
# tanh 函数具有中心对称性,适合于有对称性的二分类。在深度学习中,
# relu 是使用最多的激活函数,简单又避免了梯度消失。

config.net_unit = 3                                   #
config.net_input = 1                                  #
config.net_blocks = [1, 4, 6, 2]                      #
config.net_output = 'E'                               # 输出层,链接层的类型,如"GDC"也是其中一种,具体查看recognition\symbol\symbol_utils.py
config.net_multiplier = 1.0                           #
config.val_targets = ['lfw', 'cfp_fp', 'agedb_30']    # 测试数据,即.bin为后缀的文件
config.ce_loss = True                                 # Focal loss,一种改进的交叉损失熵
config.fc7_lr_mult = 1.0                              # 学习率的倍数
config.fc7_wd_mult = 1.0                              # 权重刷衰减的倍数
config.fc7_no_bias = False                            #
config.max_steps = 0                                  # 训练的最大step
config.data_rand_mirror = True                        # 数据随机进行镜像翻转
config.data_cutoff = False                            # 数据进行随机裁剪
config.data_color = 0                                 # 数据进行色彩增强
config.data_images_filter = 0                         #
config.count_flops = True                             # 是否计算一个网络占用的浮点数内存
config.memonger = False                               # not work now

# network settings 网络参数设置
network = edict()

network.r100 = edict()
network.r100.net_name = 'fresnet'            # 网络类型
network.r100.num_layers = 100                # 网络层数

network.r100fc = edict()
network.r100fc.net_name = 'fresnet'          # 网络类型
network.r100fc.num_layers = 100              # 网络层数
network.r100fc.net_output = 'FC'             # 输出层FC全连接层

network.r50 = edict()
network.r50.net_name = 'fresnet'
network.r50.num_layers = 50

network.r50v1 = edict()
network.r50v1.net_name = 'fresnet'
network.r50v1.num_layers = 50
network.r50v1.net_unit = 1

network.d169 = edict()
network.d169.net_name = 'fdensenet'
network.d169.num_layers = 169
network.d169.per_batch_size = 64
network.d169.densenet_dropout = 0.5
# dropout是深度学习训练过程中,将神经网络训练单元随机从网络中移除的概率(取值一般设为0.4~0.6),用于减少过拟合。
# 如果要训练一个大型的网络,而训练数据很少的话,那么很容易引起过拟合。

network.d201 = edict()
network.d201.net_name = 'fdensenet'
network.d201.num_layers = 201
network.d201.per_batch_size = 64
network.d201.densenet_dropout = 0.5

network.y1 = edict()
network.y1.net_name = 'fmobilefacenet'
network.y1.emb_size = 128
network.y1.net_output = 'GDC'

network.y2 = edict()
network.y2.net_name = 'fmobilefacenet'
network.y2.emb_size = 256
network.y2.net_output = 'GDC'
network.y2.net_blocks = [2, 8, 16, 4]

network.m1 = edict()
network.m1.net_name = 'fmobilenet'
network.m1.emb_size = 256
network.m1.net_output = 'GDC'
network.m1.net_multiplier = 1.0
# MobileNet同时也提供了两个参数以允许进一步减少运算量。
# 一个为瘦身乘子(width multiplier)其取值范围为0~1,用来减少网络的通道数,每一层减少alpha∗Nalpha∗N个通道,该参数能被用来权衡模型性能与仿真等待时间。
# 另一个参数为分辨率乘子(resolution multiplier),该参数将缩放输入图像的尺寸,尺寸范围为224~128之间。

network.m05 = edict()
network.m05.net_name = 'fmobilenet'
network.m05.emb_size = 256
network.m05.net_output = 'GDC'
network.m05.net_multiplier = 0.5

network.mnas = edict()
network.mnas.net_name = 'fmnasnet'
network.mnas.emb_size = 256
network.mnas.net_output = 'GDC'
network.mnas.net_multiplier = 1.0

network.mnas05 = edict()
network.mnas05.net_name = 'fmnasnet'
network.mnas05.emb_size = 256
network.mnas05.net_output = 'GDC'
network.mnas05.net_multiplier = 0.5

network.mnas025 = edict()
network.mnas025.net_name = 'fmnasnet'
network.mnas025.emb_size = 256
network.mnas025.net_output = 'GDC'
network.mnas025.net_multiplier = 0.25

network.vargfacenet = edict()
network.vargfacenet.net_name = 'vargfacenet'
network.vargfacenet.net_multiplier = 1.25
network.vargfacenet.emb_size = 512
network.vargfacenet.net_output = 'J'

# dataset settings 数据集参数设置
dataset = edict()
# 这里可以添加自己的数据集,仿照emore数据集参数进行修改即可
# 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']

dataset.star = edict()
dataset.star.dataset = 'star'                   # 数据集名称
dataset.star.dataset_path = '/home/user/insightface/datasets/star_data'    # 数据集所在路径
dataset.star.num_classes = 50                   # 数据集的类(即人脸id类)数量
dataset.star.image_shape = (112, 112, 3)        # 数据集图像的大小维度
dataset.star.val_targets = ['lfw', 'cfp_fp', 'agedb_30', 'cfp_ff']   # 验证集bin文件的名称

dataset.retina = edict()
dataset.retina.dataset = 'retina'
dataset.retina.dataset_path = '../datasets/ms1m-retinaface-t1'
dataset.retina.num_classes = 93431
dataset.retina.image_shape = (112, 112, 3)
dataset.retina.val_targets = ['lfw', 'cfp_fp', 'agedb_30']

# 损失函数的设置
loss = edict()
loss.softmax = edict()
loss.softmax.loss_name = 'softmax'

loss.nsoftmax = edict()
loss.nsoftmax.loss_name = 'margin_softmax'    # 损失函数的类型
loss.nsoftmax.loss_s = 64.0                   # 通过L2归一化来固定嵌入特征||xi||,并将其重新缩放成s
loss.nsoftmax.loss_m1 = 1.0                   # m1 乘法边缘角度
loss.nsoftmax.loss_m2 = 0.0                   # m2 加法边缘角度
loss.nsoftmax.loss_m3 = 0.0                   # m3 加法余弦边缘

loss.arcface = edict()
loss.arcface.loss_name = 'margin_softmax'
loss.arcface.loss_s = 64.0
loss.arcface.loss_m1 = 1.0
loss.arcface.loss_m2 = 0.5
loss.arcface.loss_m3 = 0.0

loss.cosface = edict()
loss.cosface.loss_name = 'margin_softmax'
loss.cosface.loss_s = 64.0
loss.cosface.loss_m1 = 1.0
loss.cosface.loss_m2 = 0.0
loss.cosface.loss_m3 = 0.35

loss.combined = edict()
loss.combined.loss_name = 'margin_softmax'
loss.combined.loss_s = 64.0
loss.combined.loss_m1 = 1.0
loss.combined.loss_m2 = 0.3
loss.combined.loss_m3 = 0.2

loss.triplet = edict()
loss.triplet.loss_name = 'triplet'                  # triplet loss
loss.triplet.images_per_identity = 5                # 每个id的图像数量
loss.triplet.triplet_alpha = 0.3                    # triplet的参数
loss.triplet.triplet_bag_size = 7200                #
loss.triplet.triplet_max_ap = 0.0                   #
loss.triplet.per_batch_size = 60                    # 每个batch中的类型数量
loss.triplet.lr = 0.05                              #

loss.atriplet = edict()
loss.atriplet.loss_name = 'atriplet'
loss.atriplet.images_per_identity = 5
loss.atriplet.triplet_alpha = 0.35
loss.atriplet.triplet_bag_size = 7200
loss.atriplet.triplet_max_ap = 0.0
loss.atriplet.per_batch_size = 60
loss.atriplet.lr = 0.05

# default settings 默认参数设置
default = edict()

# default network 默认网络
default.network = 'r100'                            # 网络类型名称
default.pretrained = '/home/user/insightface/pretrained-models/model-r100-ii/model'     # 预训练网络路径
default.pretrained_epoch = 0                        # 与训练网络轮数

# default dataset 默认数据集
default.dataset = 'emore'                           # 默认数据集名称
default.loss = 'arcface'                            # 损失函数类型
default.frequent = 20                               # frequent就是模型每训练多少个batch显示训练结果
default.verbose = 2000                              # 做验证测试和模型保存的批次数
default.kvstore = 'device'                          # 分布式训练参数(MXNet的KVStore模块)
# MXNet支持6种不同的kvstore:local,device,dist_sync,dist_async,dist_sync_device,dist_async_device。
# 其中local和device会创建支持单机训练的KVStore,而以dist开头的命令会创建支持分布式训练的KVStore。
# 通过向KVStore::Create传入不同的参数,即可创建不同类型的KVStore。
# 先判断有无dist,如果有就创建KVStoreDist,如果有dist又有async,就给server发送异步训练的消息。
# 如果命令中包含device,就在GPU上聚合。
# 参考https://www.cnblogs.com/littleorange/p/12770634.html

default.end_epoch = 10000                           # 默认最终epoch数

# 模型超参数——可调
default.lr = 0.1                                    # 学习率(learning rate或作lr)
# 指在优化算法中更新网络权重的幅度大小。
# 学习率可以是恒定的、逐渐降低的,基于动量的或者是自适应的。
# 不同的优化算法决定不同的学习率。当学习率过大则可能导致模型不收敛,损失loss不断上下震荡;
# 学习率过小则导致模型收敛速度偏慢,需要更长的时间训练。
# 通常 lr 取值为[0.01,0.001,0.0001]

default.wd = 0.0005                                 # 权重衰减 weight decay
# 参考:https://zhuanlan.zhihu.com/p/40814046
# https://blog.csdn.net/program_developer/article/details/80867468
# 在标准SGD的情况下,通过对衰减系数做变换,可以将L2正则和Weight Decay看做一样。但是在Adam这种自适应学习率算法中两者并不等价。

default.mom = 0.9                                   # 动量优化器 Momentum optimizer
# 目前Adam是快速收敛且常被使用的优化器。
# 随机梯度下降(SGD)虽然收敛偏慢,但是加入动量Momentum可加快收敛,
# 同时带动量的随机梯度下降算法有更好的最优解,即模型收敛后会有更高的准确性。
# 通常若追求速度则用Adam更多。

default.per_batch_size = 64                         # 训练一次所抓取的数据样本数量
# 批次大小是每一次训练神经网络送入模型的样本数,在卷积神经网络中,大批次通常可使网络更快收敛,
# 但由于内存资源的限制,批次过大可能会导致内存不够用或程序内核崩溃。bath_size通常取值为[16,32,64,128]
# 在一个 epoch 中,需要batch_size的个数和迭代次数是相等的

default.ckpt = 3                                    #
default.lr_steps = '100000,160000,220000'           # 默认保存模型的轮数
default.models_root = './models'                    # 默认模型存放目录


# 对config = edict()进行更新
def generate_config(_network, _dataset, _loss):
    for k, v in loss[_loss].items():
        config[k] = v
        if k in default:
            default[k] = v
    for k, v in network[_network].items():
        config[k] = v
        if k in default:
            default[k] = v
    for k, v in dataset[_dataset].items():
        config[k] = v
        if k in default:
            default[k] = v
    config.loss = _loss
    config.network = _network
    config.dataset = _dataset
    config.num_workers = 1
    if 'DMLC_NUM_WORKER' in os.environ:
        config.num_workers = int(os.environ['DMLC_NUM_WORKER'])

参考了其他博主的资料,还是有些参数不明白,希望各位大佬可以在评论中补充,感谢。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值