如何使用facenet详解_facenet在比赛中的应用

本文介绍了在《平安产险2019数字科技冠军赛》面部识别比赛中,如何利用facenet进行过拟合训练,讨论了softmax损失和三元损失函数在训练过程中的应用,以及训练模型时的关键参数设置。通过MTCNN进行人脸检测和对齐,然后使用facenet模型进行特征向量生成,最终实现高精度的人脸识别。
摘要由CSDN通过智能技术生成

赛题描述

最近参加了一个面部识别方面的比赛:《平安产险2019数字科技冠军赛》,简单叙述一下这个比赛吧,大赛分为两个篇章,分别为数字化创意篇章和科技算法篇章。这里,我参加的是科技算法篇章。

该赛题需要解决这样一个任务:根据赛方提供的人脸图片数据,为每张人脸生成一个特征向量(一张图片的特征向量维度D限制为[1,1024])。所以,对于N张测试图片,我们需要提交[N,D]的结果。

评估函数

其中θ为阈值,样本对距离小于等于θ认定预测为同一人,大于认定预测为不同人,TP、FP、TN、FP分别为真正例、假正例、真负例、假负例的个数,系统将根据上传数据遍历所有可能的θ值。

实际上,就是将人脸测试集映射到N为空间,并计算它们的欧式距离,使得同一个人间的距离相比于不同人间的距离要近。

赛题分析

在赛题分析之前,简单介绍下与人脸相关的任务:人脸跟踪:在视频中,动态的追踪人脸位置的变化;

人脸检测:定位人脸或者人脸中关键点(如鼻子、眼睛、嘴唇等)的位置;

人脸识别:将一张人脸图片输入,判断该人脸属于人脸数据库记录中的哪一个人;

人脸验证:输入两张人脸图片,判断是否为同一人;

人脸聚类:输入一批脸,将属于相似的人脸归为一类。

乍一看,该赛题其实并不属于以上任何任务。但是详细分析后,其实有一个简单的思路就是:假设训练图片中有50个人,这50个人每个人有m多张图片,我们仅需要训练能够识别这50个人的多分类模型即可。我们知道,在神经网络中,分类任务的最后一层大多由softmax层来承担。而softmax层中的k个神经元可作为概率输出,即为k维向量(输入图片=>k维向量)。这样,即可完成图片的嵌入。

本赛题只是提供了测试数据,并未提供训练数据,训练数据需要我们自己搜集并训练出图像嵌入模型。通过初步观察测试集,可以看出该测试集均来自于

所以,这个赛题的目的只有一个:过拟合,过拟合,过拟合……。

即便是过拟合,我还是没能使facenet模型完全过拟合这个数据集,真是惭愧TT,不知道是facenet的问题还是我的问题,终究还是我的实力不够啊。既然参加了,还是得总结一下的,不然以后又忘了,哈哈。接下来步入正题,总结一下我所使用的facenet模型。

facenet介绍和使用

使用facenet训练模型主要有两种方式:train_softmax.py:使用中心损失来训练模型,而中心损失要用Softmax损失配合训练,所以使用了train_softmax这样的名称;softmax+center loss的损失函数:

m——批的样本数,n——类别数

实际上,相当于给softmax loss上增加了约束。这样的约束使得同一类样本之间的距离缩短。

该方法的缺陷:1. 并不能扩大类与类之间的距离;2. 当需要识别的人很多时(>500,经验值),softmax层的神经元很多,facenet很难收敛。train_tripletloss.py:使用三元损失函数Triplet-loss。这个理解起来其实很简单:选择一个样本(名叫Anchor),使得它到Positive的距离要比到Negative的距离要短(Positive为与Anchor同类的样本,Negative为与Anchor不同类的样本)。模型的目标就是通过学习使得类别内部的样本距离大于不同类别样本的距离即可。三元损失函数:

表示正负样本之间的边距,和SVM中的边距一个意思。N表示特征数。该公式一个感性的认识就是:anchor与positive近,anchor与negative远。

在三元组选择的时候,存在这样的问题:1. easy triplets:当我们确定一个Anchor后,接下来又选择了与Anchor很相似的Positive以及与Anchor十分不同的Negative,facenet大多数情况下能够识判断出Positive和Negative的类别。因此,反向传播的误差很小,facenet参数基本上不更新;2. hard triplets:选择了很容易分错的positive和negative,导致误差过大,facenet收敛不稳定,容易过拟合。所以,为了加快facenet收敛,作者提出了一种三元组选择的方法:即选择一个hard-positive(positive中与anchor欧式距离最远的)和hard-negative(negative中与anchor欧式距离最近的)。所以,在训练过程中,应尽量选择semi-hard triplets。使用公式描述即为:

(anchor到positive的欧式距离

下图很好的描述了使用tripltloss损失的facenet模型:

好了,回到比赛中来。

对于任意的人脸识别竞赛,我们都可以将其分为一下几步:通过MTCNN人脸检测模型,从照片中提取人脸图像(人脸对齐);

把人脸图像输入到人脸识别模型中;

根据模型得出的结果完成不同的任务。

由于本场竞赛比较特殊,需要过拟合训练图片,所以就train_softmax.py来说明:观察测试集

每张图片已经裁剪出人脸,但是图片的size大小不一,所以我将其resize到160x160。

2. 观察训练集

训练集与测试集存在同样的问题,resize到160x160。

3. 训练

为了过拟合训练集,需要修改train_softmax.py中的几个参数:--random_crop=store_false:不进行图像裁剪;

--random_flip=store_false:不对训练图像执行随机水平翻转

--random_rotate=store_false:不对训练图像进行随机旋转

--weight_decay=0.0:不进行正则化

--keep_probability=0.9:保留全连接层的90%参数

设置完成后,开始训练即可。

大概训练了150个epoch后,损失基本为0,榜上分数为0.95左右。这竞赛榜上准确率太多的人为1了,大家真的也太强了。如果有大佬愿意教教我--,欢迎私信交流交流。

记录一下使用train_tripletloss.py训练而出现的错误,因为这个错误,我没有使用这种方式进行训练,但是我总感觉该方法准确率应该会比train_softmax.py高,不知道是不是错觉--。

InvalidArgumentError (see above for traceback): Input to reshape is a tensor with 25600 values, but the requested shape requires a multiple of 1536

[[node Reshape (defined at H:/xxx/code/models/facenet_master/src/train_tripletloss.py:138) ]]

[[node Adagrad/update (defined at H:\xxx\code\models\facenet_master\src\facenet.py:191) ]]

以后解决了再进行补充说明。

赠几个本人觉得不错的传送门:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值