1. 概述

近年来,随着深度学习在CV领域的广泛应用,人脸识别领域也得到了巨大的发展。在深度学习中,通过多层网络的连接,能够学习到图像的特征表示,那么两张人脸的图像,是不是可以通过深度学习判别其是否是相同的人呢?Google在2015年提出了人脸识别系统FaceNet[1],可以直接将人脸图像映射到欧式空间中,空间中的距离直接代表了人脸的相似度。最终,FaceNet在LFW数据集上,准确率为0.9963,在YouTube Faces DB数据集上,准确率为0.9512。FaceNet的主要优化点是:

  1. 通过端到端的深度学习结构将人脸映射到同一个欧式空间中,使得在映射后欧式空间中彼此之间是可度量的;
  2. 提出损失函数Triplet Loss,目标是使得相同人脸在欧式空间中距离较近,不同人脸在欧式空间中距离较远。

2. 算法原理

2.1. FaceNet

FaceNet的简单结构示意图如下所示:


在FaceNet中,并未直接使用预训练的CNN模型直接提取人脸特征,同时为了能够将人脸的图像映射到同一个欧式空间中且可度量,在FaceNet采用端对端对人脸图像直接进行学习,学习从图像到欧式空间的编码方法,然后基于这个编码再做人脸识别、人脸验证和人脸聚类等。

FaceNet的网络结构与传统的深度学习模型非常相似,不同的是在FaceNet中去掉了分类模型中中Softmax,取而代之的是L2归一化,通过L2归一化得到人脸的特征表示,直接将人脸的图像xxx映射到ddd维的欧式空间中f(x)∈Rdf\left ( x \right )\in \mathbb{R}^df(x)Rd。其中L2归一化的目的是去使得认脸的向量在同一量纲下,深度模型不是本文的重点,现如今有大量成熟的CNN模型可以直接使用,如VGG,Inception,Resnet等

2.2. Triplet Loss

Triplet Loss是FaceNet系统的另一大特点,对于认脸图像xxx,通过Triplet Loss可以使得映射后的向量表示f(x)f\left ( x \right )f(x)在欧式空间中可以度量,Triplet Loss的目标是使得相同的人脸图像在欧式空间中的向量的欧式距离相近,不同的人脸图像在欧式空间中的向量的欧式距离较远。用数学的方式方式可以表示为:假设输出人脸图像是xiax_i^axia,已称为anchor,同一个人的人脸图像xipx_i^pxip,也称为positive,另一个不同人的人脸图像xinx_i^nxin,也称为negative,需要使得xiax_i^axiaxipx_i^pxip之间的向量距离较近,xiax_i^axiaxinx_i^nxin之间的距离较远,即为:

∥f(xia)−f(xip)∥22+α<∥f(xia)−f(xin)∥22,∀(f(xia),f(xip),f(xin))∈τ\left \| f\left ( x_i^a \right )-f\left ( x_i^p \right ) \right \|_2^2+\alpha <\left \| f\left ( x_i^a \right )-f\left ( x_i^n \right ) \right \|_2^2,\forall \left ( f\left ( x_i^a \right ),f\left ( x_i^p \right ),f\left ( x_i^n \right ) \right )\in \tau f(xia)f(xip)22+α<f(xia)f(xin)22,(f(xia),f(xip),f(xin))τ

其中,α\alphaα是使得正(positive)负(negative)人脸充分分开的阈值,τ\tauτ是所有的(xia,xip,xin)\left ( x_i^a,x_i^p,x_i^n \right )(xia,xip,xin)三元组的集合,集合的大小为NNN。训练的过程可由下图表示:


通过不断的学习,使得Anchor和Positive的距离较近,而Anchor和Negative的距离变远。对于FaceNet,其损失函数为:

L=∑iN[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]L=\sum_{i}^{N}\left [ \left \| f\left ( x_i^a \right )-f\left ( x_i^p \right ) \right \|_2^2-\left \| f\left ( x_i^a \right )-f\left ( x_i^n \right ) \right \|_2^2+\alpha \right ]L=iN[f(xia)f(xip)22f(xia)f(xin)22+α]

2.3. 样本选择

上述三元组(xia,xip,xin)\left ( x_i^a,x_i^p,x_i^n \right )(xia,xip,xin)构成了训练集合τ\tauτ,然而三原组的选择对模型的收敛非常重要。由上述公式可知,对于人脸图像xiax_i^axia,需要选择同一认脸的不同图像xipx_i^pxip,使得

argmaxxip∥f(xia)−f(xip)∥22argmax_{x_i^p}\left \| f\left ( x_i^a \right )-f\left ( x_i^p \right ) \right \|_2^2argmaxxipf(xia)f(xip)22

同时,还需要选择不同认脸的图像xinx_i^nxin,使得

argminxin∥f(xia)−f(xin)∥22argmin_{x_i^n}\left \| f\left ( x_i^a \right )-f\left ( x_i^n \right ) \right \|_2^2argminxinf(xia)f(xin)22

在实际训练中,对所有的训练样本来计算argmin和argmax是不现实的,还会由于错误标签图像导致训练收敛困难。参考文献[1]中给出了两种方法来进行筛选:

  1. 每隔nnn步,计算子集的argmin和argmax。
  2. 在线生成三元组Triplets,即在每个mini-batch中进行筛选positive/negative样本。

在文献[1]中采用在线生成Triplets的方法,选择了大样本的mini-batch(1800样本/batch)来增加每个batch的样本数量。每个mini-batch中,我们对单个个体选择40张人脸图片作为正样本,随机筛选其它人脸图片作为负样本。负样本选择不当也可能导致训练过早进入局部最小。为了避免,我们采用如下公式来帮助筛选负样本:

∥f(xia)−f(xip)∥22<∥f(xia)−f(xin)∥22\left \| f\left ( x_i^a \right )-f\left ( x_i^p \right ) \right \|_2^2 <\left \| f\left ( x_i^a \right )-f\left ( x_i^n \right ) \right \|_2^2f(xia)f(xip)22<f(xia)f(xin)22

3. 总结

在FaceNet系统中,通过端到端的训练方式将人脸图像映射到同一个欧式空间中,并通过设计Triplet Loss,使得同一人脸在欧氏空间中的距离较近,而不同人脸在欧式空间中的距离较远。

参考文献

[1] Schroff F , Kalenichenko D , Philbin J . FaceNet: A Unified Embedding for Face Recognition and Clustering[J]. IEEE, 2015.

人脸识别系统FaceNet原理相关推荐

  1. 人脸识别(9)---人脸识别系统的原理与发展

    人脸识别系统的原理与发展 1,人脸识别介绍 广义定义:构建人脸识别系统的一系列相关技术,包括人脸图像采集,人脸定位,人脸识别预处理,身份确认以及身份查找等. 狭义定义:通过人脸进行身份确认或者身份查找 ...

  2. Google人脸识别系统Facenet paper解析

    Facenet paper地址 : facenet:   论文解析下载地址(PDF版):论文解析 FaceNet: A Unified Embedding for Face Recognition a ...

  3. 人脸识别网络facenet原理

    人脸相关任务介绍 人脸相关任务其实分为两部分: 人脸检测和人脸识别. 人脸检测: 人脸检测就是获取图像中所有人脸的位置,并对人脸进行对齐.由于原始图像中的人脸可能存在姿态.位置上的差异,我们需要在获取 ...

  4. 如何在 Keras 中使用 FaceNet 开发人脸识别系统

    https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...

  5. matlab人脸识别样本库建立,facenet 人脸识别(二)——创建人脸库搭建人脸识别系统...

    搭建人脸库 选择的方式是从百度下载明星照片 照片下载,downloadImageByBaidu.py # coding=utf-8 """ 爬取百度图片的高清原图 &qu ...

  6. 创建自己的人脸识别系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 这是一篇全面的.互动性强的人脸识别初学指南.接下来,我们将创建一个 ...

  7. 制作自己的人脸识别系统

    by Sigurður Skúli 通过SigurðurSkúli 制作自己的人脸识别系统 (Making your own Face Recognition System) Face recogni ...

  8. 你熟知的那个杀毒软件公司McAfee,用这种方法骗过护照人脸识别系统

    选自mcafee.com 作者:Steve Povolny.Jesse Chick 机器之心编译 编辑:杜伟 当你自己与其他人的图像高度匹配时,人脸识别系统还能发挥其作用吗?网络安全公司McAfee生 ...

  9. 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计

    基于MATLAB的人脸识别系统的设计(论文12000字,外文翻译,参考程序) 摘要:本文基于MATLAB平台设计了一款简单的人脸识别系统,通过USB摄像头来采集图像,经过肤色方法进行人脸检测与定位,然 ...

最新文章

  1. Linux下task_struct详解
  2. 【深度学习】深度学习中的单元测试
  3. mysql读写分离实现_脱离开发:Mysql读写分离方案之一
  4. adr和ldr的区别
  5. POJ2631 Roads in the North
  6. spark加盐(salting)操作
  7. python拓展7(Celery消息队列配置定时任务)
  8. Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
  9. cnblogs用户体验评价
  10. csv转vcf格式网页工具-快速导入手机通讯录
  11. 牛市来了,我劝读者不要炒股他却骂我不地道...
  12. 拉普拉斯变换解微分方程
  13. WRF-Chem笔记——MOZBC边界场制作
  14. 编程术语晦涩_晦涩的编程语言的乐趣
  15. 冰河在大学是如何度过的?
  16. 2015-华为招聘公开测试题目-单词迷宫
  17. 【报告分享】2019短视频平台数据报告-抖音快手.pdf(附下载链接)
  18. 2021百度网盘网页版视频在线倍速播放
  19. c语言进阶编程 培训,大学C语言进阶编程实例.doc
  20. 如何让更多游客参与到景区夜游光影秀

热门文章

  1. Xrdp与i3搭建超轻量级远程PC
  2. Idea-06:Amoeba management(阿米巴经营)
  3. Matlab求解方程或函数的根,root,fzero,solve,fsolve的区别
  4. Openvswitch原理与代码分析(2): ovs-vswitchd的启动
  5. 《python数学实验与建模》(2)高等数学与线性代数
  6. 神经网络激活函数汇总(Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout)
  7. uni-app数据循环
  8. 高精度定位成就智能物联|高精度定位的“智能化”进化史
  9. BZOJ2654: tree(陈立杰)
  10. 使用AWS MVP方案[Data Transfer Hub]从Global S3同步文件到中国区S3