人脸识别各种损失函数一网打尽

导读

随着人脸数据集越来越大,所以人脸识别技术也越来越成熟,促使了很多相关人脸识别产品的落地,如人脸解锁手机人脸支付人脸门锁人脸搜索人脸登录等。不同的系统对于人脸识别的要求和精度有所不同,所以为了提高目前人脸识别的精度,主要的发展方向是通过减少类内的距离、增大类间的距离,就诞生了一批通过改进人脸损失函数来提高精度的算法

这篇文章主要介绍的是基于mxnet的gluon的一个人脸识别的库,gluon-face它包括了近些年来主流的人脸损失函数,包括TripletLossRingLossCosLossL2SoftmaxASoftmaxCenterLossContrastiveLossAcrLoss等。除此之外,还包括了1:1人脸验证的metric人脸识别的pretrained model

gluon-face的安装

gluon-face是基于mxnet的,所以需要安装mxnet

环境要求:Python3.5或者以上版本,需要安装gluoncvmxnet

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.rectrain.idxval_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

建议

要想训练出一个好的人脸识别模型还是需要大量数据的,我这里除了上面的数据之外还有一些人脸识别相关数据集

需要的小伙伴,可以私信我回复“人脸数据”即可获取下载链接

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();