FaceNet
摘要
本文主要介绍一种叫FaceNet的方法,用于将人脸从图片映射到一个欧式空间中, 可以通过向量的欧式距离来确定人脸相似度。文中方法使用深度卷积网络,训练过程中直接优化embedding,而不是调整bottleneck层。文中使用了triple Loss,选取一个正样本一个负样本一个目标样本。
网络使得识别精度在某些数据集合中能够达到99.6%
文中也介绍了谐波嵌入的概念,谐波triple Loss, 描述不同的网络产生的嵌入向量,这些向量之间相互兼容可以直接比较。
当embedding空间完成后,可以根据阈值做人脸验证,可以使用knn做人脸识别,可以使用k-means做聚类。
简介
FaceNet 直接训练并产生128维度的嵌入向量,triple 包括匹配对的部分以及非匹配部分,Loss的目的是使用距离margin将积极对和消极对分别开来。
模型简述
网络结构
triple Loss
FaceNet有两个核心的结构,第一是风格网络, 第二是inception网络。
将嵌入网络写成f(x)的形式,其中x 是一张图片,将一张图片转化成一个d维度的向量。且满足|| f(x) ||2 = 1。
如果想让anchor 距离positive更近,距离negative更远。需要下面公式
其中a是margin
N是训练集中所有triple组合的数量,Loss就变成下面形式
在数据集中选择出所有的triple组合是比较简单的,但是并不是每一个组合都是有意义的。所以需要选择有利于模型优化的组合,选择方法如下。
Triple选择
选择的规则主要满足下面两个条件
但是计算针对数据集合中每个图片计算是一件很困难的事情,
有两种方法可进行Triple选择。
( 1)没n步骤进行线下选择生成triple组合。使用当前网络计算armin和argmax在数据的子集中。
(2)线上生成triple组合,从小批量数据中选择出hard positive以及hard negative。
文中所使用的方法是,使用mini-batch中计算argmin以及argmax。大概千级别的示例。
为了使得anchor positive distance有意义,需要保证每个mini-batch中有身份一致的最小的量。
在本文试验中,每一个mini-batch中每一个人有40张人脸左右。
文中试验,并没有计算法hardest positive,使用每一对positive pairs. 然后计算hardest negative。
但是选择hardest negative,训练模型容易造成模型塌陷。所以为了避免这类情况发生,需要根据下面公式来选择不匹配图像
文中使用的大概每个batch 大小是1800
深度卷积网络
训练时候margin设的大小是0.2
文中使用两种模型结构,在实验中展示更多的模型开销,对于不同的应用需要不同的模型,比如在数据中心中,需要非常大的模型。但是模型如果想在手机端运行的化,需要更加的轻量级。 文中所有的激活层使用的是relu,
第一类网路
第二类网络
使用的是GooleLeNet 结构inception模型,更加的轻量级.
数据和评估
文中主要使用的是四个数据集进行验证,并且使用的是匹配任务进行验证,其中评价标准是真阳率和假阳率
真阳率 = 预测正确正样本/正样本
假阳率 = 预测错误正样本/负样本
不同的网络结构的表现。