论文:FaceNet:A Unified Embedding for Face Recognition and Clustering
一、简单介绍
FaceNet是一个通用的人脸识别系统,可以用于人脸验证(是否是同一个人),人脸识别(这个人是谁)和人脸聚类(寻找相似的人),采用的方法是通过卷积神经网络将人脸图像映射到欧几里得空间,空间距离直接和图片人脸图像的相似度相关:同一个人的人脸图像具有很小的距离,不同人的人脸具有很大的距离。(在这里,我理解为,每个人都可以看成一个类,同一个人的不同人脸之间的距离可被看做类内距离,不同人的人脸图像之间的距离可被看做是类间距离,FaceNet系统的主要思想可看做尽量缩小类内距离,增大类间距离。)
二、方法
2.1 模型结构
图1:FaceNet模型结构
如图1展示的就是FaceNet模型结构。Deep Architecture 就是一个深度卷积网络剔除softmax后的结构。后面经过一个特征归一化,将特征映射到一个超球面上,之后提出一个新的损失函数,Triplet Loss
所谓嵌入(embedding),可以理解为一种映射关系,即将特征从原来的特征空间映射到一个新的特征空间,新的特征就可以称为原来特征的一种嵌入。
2.2 Triplet Loss
图2:Triplet loss
顾名思义,triplet是一个三元组(anchor, positive,Negative),对于一个特定个体的人脸图像样本(anchor),同属于这个个体的其他人脸图像样本即是positive,与不属于这个个体的其他人脸图像样本就是Negative。那么学习的过程就是:对于尽可能多的三元组,使得anchor和positive之间的距离要小于anchor和negative之间的距离。如图2所示,网络没有学习之前,A和P的欧式距离可能大于A和N之间的距离,学习后,A和P的具体会减少,A和N之间的距离会增大,最后A和P之间的距离会小于A和N之间的距离,即是通过学习,要使得类间的距离大于类内的距离。假设x是输入的图片, 是CNN表示后的特征向量,三元函数为
其中是一个常量,所以最终的损失函数为:
2.3 三元组的选择
选择合适的triplet对于收敛速度,一般来说,对于一个,我们想要找到一个
(hard positive)使得
并且同时找到一个
(hard negative)使得
. 通过最小化损失函数,对模型进行更新,在整个训练集上进行寻找是不现实的,因此提出两种策略:
1. 离线方式:每n步,计算自己的argmin和argmax生成三元组
2. 在线方式:在一个mini-batch中寻找hard positive/negative
在FaceNet论文中是选择的第二种方式,作者在mini-batch中挑选所有的positive图像对,因为这样这样在训练的过程中更加稳固而且在训练的初期收敛速度更快点。对于negative的选择,作者使用了semi-hard的Negative,也就是满足A到N的距离大于A到P之间的距离的Negative样本。
2.4 深层卷积网络
FaceNet用到了一个深层卷积网络,在FaceNet这篇论文中,作者讨论了两个不同的架构,Zeiler&Fergus架构和Inception架构。
表1:Zeiler&Fergus架构
表1中展示的是用在论文中的Zeiler&Fergus架构网络的结构,22层,140 million个参数和每一个图像需要大约1.6 billion FLOPS(每秒浮点运算次数)。
表2:GoogLeNet style Inception 模型
表2展示的是论文中用到的GoogLeNet Style Inception模型,模型参数是第一个模型的二十分之一,FLOPS也是第一个的五分之一。
FaceNet的算法基本思想如上描述,FaceNet是典型的纯数据驱动模型,至于FaceNet的训练数据和模型的对比,在这里不在赘述,也许为如何实现单独写一篇博客,可我目前还没有动手操作,所以先放入日程安排中。