github地址:  face-recognition-supervised-by-center-loss

这里介绍我训练的人脸识别模型,放到了github上,各位看官路过的可以点个star

简介

这个仓库我提供了训练人脸深度神经网络的代码,框架使用的是pytorch。损失函数用的是center_loss。同时也提供了triplet_loss的实现。但是根据我的训练经验,用triplet_loss训练没有用center_loss准确度高。所以推荐center_loss。网络我使用的是标准的vgg16。你也可以根据自己的需求换成resnet 或者其他。我相信会获得更高的准确度(大概高两三个百分点的样子)。因为工作需求我选择了vgg16。训练数据我选择的是vggface2(8631个id 及300万照片)。MSLM 有更多的数据,用MSLM 训练我相信结果h会再好一点(大概一两个百分点)。测试数据集我选择的是LFW

训练结果 

vgg16+vggface2:   测试准确度:  0.967     auc:  0.99

人脸识别模型训练

(测试时代码绘制的ROC曲线图)

环境

python3, pytorch  

代码既可以在CPU运行,也可以在GPU中运行,支持多显卡

数据准备

所有的人脸都需要被对齐,使用MTCNN算法,然后才裁剪成112*112大小。

获取数据以及对齐的方法请参考 https://github.com/deepinsight/insightface
这个仓库里提供了mxnet压缩的数据,关于解压缩的方法仓库里也有提供,可以下载下来用它的代码解压缩。里边的图片已经对齐并且裁剪好的。如果你想对齐自己的数据,也可以用它src/align里的代码对齐自己的数据。如果你的数据不对齐,效果会很差。

因为vggface2的数据太大了,还是读者自行下载,我提供了LFW测试集的下载连接

链接:https://pan.baidu.com/s/1hfTRck0jc2HM1Ya2r-BAVQ 
提取码:z2qn 

数据的存放地址: datasets文件夹里

存放格式(一定要按类别存放):--datasets

                      --vggface2(数据集名)

                            ---类别名(这里是人名或者时编号)

                                      ---1111.jpg

训练

使用center loss (recommand)

paper: A Discriminative Feature Learning Approach for Deep Face Recognition

1.修改配置文件 -------> training_certer.json

我把所有的配置项都写在了json文件里,这样训练的时候就不用带一大堆参数了。
 

参数名 默认值 说明
 dataroot  "datasets/vggface2" 训练集的地址,放到dataset文件夹里
 lfw_dir  |"datasets/lfw_alighed" 测试集的地址
lfw_pairs_path  "datasets/lfw_alighed" 测试集的triplet对
 log_dir  "./checkpoints" 存放checkpoint的地址
 resume   false 是否预训练加载checkpoint
start_epoch 0 开始的epoch序号
epochs   50 训练的epoch数
no_cuda  false 使用cuda为false,不适用为true
gpu_id   "0,1" gpu序号
num_workers  10 加载数据的进程数
seed  | 0| random seed| 0 随机数种子
 val_interval  200 每隔$(val_interval) batchs ,用测试集测试一次
log_interval   10 每隔$(log_interval) batchs ,打印训练的信息(loss等)
save_interval   500 每隔$(save_interval  ) batchs ,保存checkpoint
 batch_size 256 traing batch_size
test_batch_size   128 test_batch_size  
optimizer   "sgd" 优化器:sgd/adam/adagrad
lr   0.1 学习率
center_loss_weight  0.5 center_loss 所占权重
alpha   0.5 center的学习率
beta1   0.9 adam param1
lr_decay   1e-4 adam param2
wd   0.0 adam param3

2. 运行

python train_center.py

 

使用triplet loss

paper:FaceNet: A Unified Embedding for Face Recognition and Clustering

1.修改配置文件 -------> training_triplet.json

比之前的配置项多了两个参数

参数名 默认值 说明
n_triplets   1000000  训练用的triplet pairs 的数量
margin   0.5 margin in paper FaceNet

2.运行

python train_triplet.py

你可以观察训练的过程 使用tensorboard. 具体的方式被写在了: "checkpoints/readme.txt"

预训练的checkpoints

这里提供我自己训练的vgg16的模型一个,可以放在checkpoints里加载

链接:https://pan.baidu.com/s/1IPdmFy0bFfPt1xqV8S7eDg 
提取码:89sf 

代码中加载checkpoints的逻辑是:遍历checkpoints文件夹所有pth文件,选择Acc后面数最大的,例如checkpoints_Acc0.89 .pth  和 checkpoints_Acc0.99 .pth 就会选择 后一个加载

相关文章: