深度学习论文精读(6):FaceNet
论文地址:FaceNet: A Unified Embedding for Face Recognition and Clustering
译文地址:https://zhuanlan.zhihu.com/p/24837264
参考博文1:https://blog.csdn.net/chenriwei2/article/details/45031677
参考博文2:https://www.jianshu.com/p/eab4e292c796?utm_source=oschina-app
非官方实现地址:https://github.com/davidsandberg/facenet
文章目录
1 总体介绍
- 提出了一种FaceNet的结构,用于以下三种情况的统一嵌入网络。
- 1.人脸验证(是否为相同的人脸)
- 2.人脸识别(这张脸属于哪个人)
- 3.人脸聚类(将同一个人的人脸图片进行聚类)
- 通过FaceNet结构,将人脸信息提取成一个长为128的向量来表示。(如果直接取全局池化后的特征向量,对当时的算力来说,维度将过大。)
- 随后,通过欧式距离对向量进行判断,欧式距离越小,则图像越相似,为同一张人脸。反之,欧氏距离越大,则图像越不相似,为不同人的脸。
- 同时,也获得特征向量之后也可以用普通的机器学习算法进行上述的任务。
- 1.人脸验证,设置一个阈值,距离小于阈值即可
- 2.人脸识别,可以用k-NN邻近算法
- 3.人脸聚类,可以用k-means等算法
-
- face clustering:人脸聚类,可以用k-means等算法;
-
- face clustering:人脸聚类,可以用k-means等算法;
- 采用了triplet loss取代softmax。
2 Method
FaceNet的整体结构如下:
- 一个mini-batch的数据输入到使用的CNN结构中,获取得到128维的特征向量。
- 进行 L 2 L_2 L2normalization( L 2 L_2 L2范数归一化)。如: ∥ f ( x ) ∥ 2 = ( ∣ f ( x ) 1 2 ∣ + ∣ f ( x ) 2 2 ∣ + ⋯ + ∣ f ( x ) n 2 ∣ ) = 1 \|f(x)\|_2=\sqrt(|f(x)_1^2|+|f(x)_2^2|+\cdots +|f(x)_n^2|)=1 ∥f(x)∥2=(∣f(x)12∣+∣f(x)22∣+⋯+∣f(x)n2∣)=1。
- 以triplet loss为目标,优化整体网络。
2.1 Triplet Loss
- Triplet的含义:
-
- Triplet的意思是 三元组,即损失函数通过三个参数来计算(而softmax的损失函数通过预测标签、标签两个参数来计算)。
- Triplet 三元组指的是:anchor, negative, positive 三个部分,每一部分都是一个 embedding 向量。
- anchor指的是基准图片,positive指的是与anchor同一分类下的一张图片,negative指的是与anchor不同分类的一张图片。
对于任意triplet来说,我们希望anchor离positive尽量近,离negative尽量远。即:
∥ f ( x i a ) − f ( x i p ) ∥ 2 2 + α < ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 \Large \|f(x^a_i)-f(x^p_i)\|2^2+ \alpha <\|f(x^a_i)-f(x^n_i)\|_2^2 ∥f(xia)−f(xip)∥22+α<∥f(xia)−f(xin)∥22
其中 α \alpha α为阈值超参数,作为一个边际存在。因此有目标函数:
L = ∑ i N [ ∥ f ( x i a ) − f ( x i p ) ∥ 2 2 − ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 + α ] + \Large L= \sum\limits^N_i[\|f(x^a_i)-f(x^p_i)\|_2^2-\|f(x^a_i)-f(x^n_i)\|_2^2+\alpha]_+ L=i∑N[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]+
2.2 Triplet Selection
-
容易知道,在一个数据集中,有非常非常多的triplet,但其中的大部分对训练都没有帮助,因为它们已经符合triplet loss的要求了。因此,triplet selection就成了一个非常重要的问题。
-
为了能够确保能让FaceNet以最快的速度学习,我们应当选择hard triplet。即,选择 hard positive(即与anchor距离最大的同类图片)与 hard negative(即与anchor距离最小的不同类图片)。但这样做不太现实,因为遍历整个训练集寻找hard triplet所需的计算量太大,并且容易被错误标记或者是不良成像的图像所干扰,导致难以收敛。
-
文中提出两种方法来进行triplet selection:
- 离线生成:每经过n次训练,计算某个子集中的 hard positive/negative。
- 在线生成(实时):在mini-batch中选择。
-
作者对两种生成方式都进行了实验,最终在论文中展现的均是以大mini-batch的方式进行在线生成。
-
其中在线生成triplet的具体操作如下:
-
选择mini-batch中的所有 anchor-positve 对(而不是选择hard positive),并选择 hard negative。相比anchor-hard positive,这样收敛速度比较快。
-
如果全部都用hardest sample的话会导致模型坍塌, f ( x ) f(x) f(x)趋于0,建议使用 semi-hard negative,即忽略损失函数中的 α \alpha α:
∥ f ( x i a ) − f ( x i p ) ∥ 2 2 + α < ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 \Large \|f(x^a_i)-f(x^p_i)\|2^2+ \alpha <\|f(x^a_i)-f(x^n_i)\|_2^2 ∥f(xia)−f(xip)∥22+α<∥f(xia)−f(xin)∥22
-
2.3 Deep Convolutional Networks
文章一共探索了两种神经网络:
- zeiler & Fergus model (NN1)
- GoogleNet Style Inception model (NN2)
- 两个网络都能接受[220,220,3]的输入,输出[1,1,128]维的输出
- 细节不再说了,就是一个特征提取网络的选择问题
4 论文其他内容
- embedding向量大小对于结果有一定影响(并不是越大越好),发现长度为128最佳。
- 训练集越大越好(文中最多用了两亿多张图片)
- 使用对齐工具后,效果更好
- 图像质量越高,效果越好
单词整理:
- downside 缺点
- thumbnail 缩略图
- alignment 对准,校准
- exemplar 模范,榜样
- illustration 例证
- variability 变化性
- corpus 资料集
- constrain 压制,抑制
- versus 与
- collasped 倒塌
- mitigate 减轻
- recitfy 纠正