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 就会选择 后一个加载