人脸识别之FaceNet

从来没做过人脸识别,决定好好学习学习。

1. Introduction

首先看看是一个怎样的流程:
这里写图片描述

这里有一个embedding嵌入到我们的网络当中,随后接了一个三元组损失

我们使用一个embedding: f(x),将图像变换到一个128维的特征空间中,在这里存放所有脸之间的距离。
相同人脸的距离比较小,而不同人脸的距离比较大。

三元组由2个同一个人的face和1个其他人的face构成。
如:(mckee1,mckee2,jack1)
loss目的是通过距离将same与different区分开。

2. Method

2.1 triplet loss

这里写图片描述
我们要做到:
这里写图片描述
其中,a表示anchor,p表示positive,n表示negative
本文alfa = 0.2

损失函数为
这里写图片描述

当然,在这里,难例挖掘是至关重要的!!!

3.2 Triplet selection

应尽量选择一些hard examples,让网络学习到有用的东西,从而更好的更新
我们选择训练样本时,选择同一个人的两张脸差异度最大的正样本,选择不同人的两张脸差异度最小的负样本。

但是计算所有训练集的差异度是不可行的。

有以下两个方法:
(1)generate triplets offline: 每迭代n次,使用最近的model在数据的一个子集中来产生难例。
(2)generate triplets online: 在迭代的过程中,我们就在mini-batch中选择难例。
本文选择的是第二种。

3.3 Deep Convolutional Networks

两种结构,如图分别为ZF和Inception
ZF:
这里写图片描述

Inception:
这里写图片描述

可以看出,Inception参数量真是太太太少了!!!有木有?

4. Datasets and Evaluation

本文用了4个dataset:其中两个是 LFW 和 YouTube Faces

设置一个阈值来区分两张图片是否是一个人

我们将所有相同人物的pair放一起,称为P_same
所有不同人物构成的pair放一起,称为P_diff
评价指标是
这里写图片描述
其中,
TA表示正确分类的正样本数。
这里写图片描述
FA表示错误分类的负样本数。
这里写图片描述

5. 示例

将阈值设为1.1就可以正确进行识别了。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/leewanzhi/article/details/80286158