原文链接:FaceNet:A Unified Embedding for Face Recognition and Clustering

首先可以看一下最终的效果,数字表示两张图片经过Facenet提取的特征之间的欧式距离,可以直接表示两张图片的差异:

从图中可以看出,若取阈值为1.1,可以很轻易的区分出两张照片是不是同一个人。

网络结构:

上图是文章中所采用的网络结构,其中,前半部分就是一个普通的卷积神经网络,但是与一般的深度学习架构不一样,Facenet没有使用Softmax作为损失函数,而是先接了一个l2**嵌入**(Embedding)层。

所谓嵌入,可以理解为一种映射关系,即将特征从原来的特征空间中映射到一个新的特征空间,新的特征就可以称为原来特征的一种嵌入。

这里的映射关系是将卷积神经网络末端全连接层输出的特征映射到一个超球面上,也就是使其特征的二范数归一化,然后再以Triplet Loss为监督信号,获得网络的损失与梯度。

Triplet Loss也正是这篇文章的特点所在,接下来我们重点介绍一下。

Triplet Loss

什么是Triplet Loss呢?顾名思义,也就是根据三张图片组成的三元组(Triplet)计算而来的损失(Loss)。

其中,三元组由Anchor(A),Negative(N),Positive(P)组成,任意一张图片都可以作为一个基点(A),然后与它属于同一人的图片就是它的P,与它不属于同一人的图片就是它的N。

Triplet Loss的学习目标可以形象的表示如下图:

网络没经过学习之前,A和P的欧式距离可能很大,A和N的欧式距离可能很小,如上图左边,在网络的学习过程中,A和P的欧式距离会逐渐减小,而A和N的距离会逐渐拉大。

也就是说,网络会直接学习特征间的可分性:同一类的特征之间的距离要尽可能的小,而不同类之间的特征距离要尽可能的大。

意思就是说通过学习,使得类间的距离要大于类内的距离。

损失函数为:

其中,左边的二范数表示类内距离,右边的二范数表示类间距离,α是一个常量。优化过程就是使用梯度下降法使得损失函数不断下降,即类内距离不断下降,类间距离不断提升。

提出了这样一种损失函数之后,实践过程中,还有一个难题需要解决,也就是从训练集里选择适合训练的三元组。

选择最佳的三元组

理论上说,为了保证网络训练的效果最好,我们要选择hard positive

以及hard negative

来作为我们的三元组

但是实际上是这样做会有问题:如果选择最Hard的三元组会造成局部极值,网络可能无法收敛至最优值。

因此google大佬们的做法是在mini-batch中挑选所有的 positive 图像对,因为这样可以使得训练的过程更加稳固。对于Negetive的挑选,大佬们使用了semi-hard的Negetive,也就是满足a到n的距离大于a到p的距离的Negative,而不去选择那些过难的Negetive。

CNN结构

文中尝试了两个CNN结构,其参数如下:

网络1:Zeiler&Fergus architecture

网络2: GoogLeNet

实验

1. 不同的网络配置下的VAL(validation rate)。

2. 不同的训练图像数据集的大小。

3. 嵌入层特征的维度对VAL的影响:

4. 不同的图像质量下的VAL:

左边图表示jpeg图像的质量q对VAL的影响,显然质量越高,VAL越高,右边图表示图像的大小对VAL的影响。

LFW得分

在LFW上达到了98.87% +-0.15的验证准确率

如果预先使用更好的人脸检测算法来对齐人脸,最高可以达到99.63% +-0.09 的验证准确率。

人脸识别系列(六):FaceNet相关推荐

  1. 人脸识别系列(七):百度的人脸识别

    原文链接:Targeting Ultimate Accuracy: Face Recognition via Deep Embedding 网络结构: 输入的是对齐好了的人脸图像,将人脸图像通过面部标 ...

  2. 人脸识别系列(十七):ArcFace/Insight Face

    论文链接:ArcFace: Additive Angular Margin Loss for Deep Face Recognition 作者开源代码:https://github.com/deepi ...

  3. 深度学习之视频人脸识别系列一:介绍

    作者 | 东田应子 [导读]本文是深度学习之视频人脸识别系列的第一篇文章,介绍了人脸识别领域的一些基本概念,分析了深度学习在人脸识别的基本流程,并总结了近年来科研领域的研究进展,最后分析了静态数据与视 ...

  4. 深度学习之视频人脸识别系列(一):简介

    阅读时间约4分钟 [介绍]本文是深度学习之视频人脸识别系列的第一篇文章,介绍了人脸识别领域的一些基本概念,分析了深度学习在人脸识别的基本流程,并总结了近年来科研领域的研究进展,最后分析了静态数据与视频 ...

  5. 深度学习之视频人脸识别系列二:人脸检测与对齐

    作者 | 东田应子 [磐创AI导读]本文是深度学习之视频人脸识别系列的第二篇文章,介绍人脸检测与对齐的相关算法.欢迎大家关注我们的公众号:磐创AI. 一.人脸检测与关键点检测 问题描述: 人脸检测解决 ...

  6. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  7. 人脸识别三大经典算法_人脸识别系列四 | DeepID1算法

    前言 这是人脸识别系列的第5篇文章,前4篇文章可以在公众号的人脸识别栏里找到,这篇文章主要是解析CVPR 2014年的经典人脸识别论文DeepID1算法.论文的地址如下:http://mmlab.ie ...

  8. 人脸识别系列(十五):COCO Loss

    论文链接:Rethinking Feature Discrimination and Polymerization for Large-scale Recognition 这篇文章其实和NormFac ...

  9. 人脸识别系列算法原理

    目录 1.Eigenfaces(特征脸)算法 基本思想 Eigenfaces算法过程 2.FisherFace算法 基本思想 Fisherface算法流程 3.LBPH(Local Binary Pa ...

  10. 『人脸识别系列教程』1·目录与概述

    原文出处:https://zhuanlan.zhihu.com/FaceRec 目录 本系列专栏将解析基于深度学习的人脸识别相关的关键性论文,从2014年DeepFace开始到最新的算法.还介绍了用于 ...

最新文章

  1. 【python语言基础】疑难点整理2
  2. BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
  3. qPCR实验疑难杂问解答
  4. Spring-JdbcTemplate(注入到spring容器)-02
  5. ReentrantLock 源码分析
  6. apache mesos_Apache Mesos + Marathon和Java EE
  7. LVS学习笔记之三种模式的特点概括
  8. 推荐sqlLite管理工具.
  9. java 定时器 数据库_java实现定时器,定时修改数据库代码
  10. Angular 权威教程
  11. 建网站域名服务器那个好,如何选择好建网站的域名?
  12. 耗时两天,Html实现小米官网
  13. 泰戈尔《飞鸟集》节选
  14. 什么是数据结构?什么是算法?怎么学习数据结构与算法?
  15. Load, Modify, and Save an Image - 加载、修改和保存图像
  16. 打包chromium浏览器
  17. Runes——Dart
  18. c++成员函数指针揭秘
  19. 近距离看GPU计算(2)
  20. Kafka多个消费者监听消费同一个Topic主题

热门文章

  1. gitbook 使用粘自csdn
  2. OpenCV实现图像的裁块与拼接
  3. cp——复制文件\文件夹
  4. 在标准c语言中 =是判断两个数是否相等,='运算符用于判断两个数是否相等。
  5. 多元函数概念和偏导数
  6. 让自己分享的网址在QQ中更有逼格
  7. linux图像编辑,Photoflare:Linux下简单的开源图像编辑器
  8. a+b+c+d==0
  9. Delphi中实现多线程同步查询
  10. C# %253A%252F%252F 咋编码