深度学习论文精读(6):FaceNet

深度学习论文精读(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 normalization( L 2 L_2 范数归一化)。如: 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
  • 以triplet loss为目标,优化整体网络。

1545215609933

2.1 Triplet Loss

  • Triplet的含义:
    • Triplet的意思是 三元组,即损失函数通过三个参数来计算(而softmax的损失函数通过预测标签、标签两个参数来计算)。
    • Triplet 三元组指的是:anchor, negative, positive 三个部分,每一部分都是一个 embedding 向量。
    • anchor指的是基准图片,positive指的是与anchor同一分类下的一张图片,negative指的是与anchor不同分类的一张图片。

1545216549068

对于任意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

其中 α \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]_+

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) 趋于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

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 纠正

猜你喜欢

转载自blog.csdn.net/hwl19951007/article/details/85106623
今日推荐