导读
随着人脸数据集越来越大,所以人脸识别技术也越来越成熟,促使了很多相关人脸识别产品的落地,如人脸解锁手机、人脸支付、人脸门锁、人脸搜索、人脸登录等。不同的系统对于人脸识别的要求和精度有所不同,所以为了提高目前人脸识别的精度,主要的发展方向是通过减少类内的距离、增大类间的距离,就诞生了一批通过改进人脸损失函数来提高精度的算法。
这篇文章主要介绍的是基于mxnet的gluon的一个人脸识别的库,gluon-face它包括了近些年来主流的人脸损失函数,包括TripletLoss、RingLoss、CosLoss、L2Softmax、ASoftmax、CenterLoss、ContrastiveLoss、AcrLoss等。除此之外,还包括了1:1人脸验证的metric,人脸识别的pretrained model。
gluon-face的安装
gluon-face是基于mxnet的,所以需要安装mxnet
环境要求:Python3.5或者以上版本,需要安装gluoncv和mxnet
pip install gluoncv --pre pip install mxnet-mkl --pre --upgrade # if cuda XX is installed pip install mxnet-cuXXmkl --pre --upgrade
安装gluon-face
pip install git+https://github.com/THUFutureLab/gluon-face.git@master#推荐 pip install gluonfr
人脸数据集
insightface项目地址:https://github.com/deepinsight/insightface
数据集下载地址:https://github.com/deepinsight/insightface/wiki/Dataset-Zoo
insightface是基于mxnet的symbol开发的一个人脸识别项目,这个项目也包括了基于不同损失函数来训练模型,整个项目结构比较复杂,阅读有一定难度,该项目也提供了不同模型的预训练模型,具体可以参考GitHub,下面是insightface使用不同的loss下的准确度
gluon-face借鉴了insightface的思想,git上面提供了一些人脸数据集的训练集和验证集,所有的人脸数据都已经通过mtcnn裁剪对齐保证人脸的图片大小为(112,112),并将数据保存为了三个文件分别是train.rec、train.idx和val_data.bin。
数据存放格式如下图:
注意:这三个文件是是将112×112的人脸数据转成了三个文件,主要目的是因为人脸数据比较大为了提高读取数据的速度加快训练,使用这种格式的文件可以极大利用mxnet的低层优化来提高速度。文件的制作方式可以参考insightface项目的介绍
gluon-face的损失函数
下面展示的是基于论文提供的不同损失函数下训练的模型,在LFW数据集上获得的最好的准确率,
gluon-face示例
地址:https://github.com/THUFutureLab/gluon-face/tree/master/examples/face_recognition
目前gluon-face的git上给出的example并不是特别全,下面我们看一个基于arcLoss的训练核心代码,详细代码请参考上面给的地址,相对insightface代码要少不少,不过准确率有待验证
# 部分训练代码,完整请参考项目内的例子 train_set = get_recognition_dataset("emore", transform=transform_train) train_data = DataLoader(train_set, batch_size, shuffle=True, num_workers=num_worker) loss = ArcLoss(train_set.num_classes, s=64, m=0.5) while it < iters: for batch in tqdm(train_data): if it == lr_steps[lr_counter]: trainer.set_learning_rate(trainer.learning_rate * 0.1) lr_counter += 1 data = gluon.utils.split_and_load(batch[0], ctx_list=ctx, batch_axis=0, even_split=False) labels = gluon.utils.split_and_load(batch[1], ctx_list=ctx, batch_axis=0, even_split=False) with ag.record(): outputs = [net(X)[1] for X in data] losses = [loss(yhat, y) for yhat, y in zip(outputs, labels)] for l in losses: ag.backward(l) trainer.step(batch_size) metric.update(labels, outputs) loss_mtc.update(0, losses) it += 1
建议
要想训练出一个好的人脸识别模型还是需要大量数据的,我这里除了上面的数据之外还有一些人脸识别相关数据集
需要的小伙伴,可以私信我回复“人脸数据”即可获取下载链接
本文暂时没有评论,来添加一个吧(●'◡'●)