人脸识别系统FaceNet原理

article/2025/8/28 0:19:22

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归一化得到人脸的特征表示,直接将人脸的图像 x x x映射到 d d d维的欧式空间中 f ( x ) ∈ R d f\left ( x \right )\in \mathbb{R}^d f(x)Rd。其中L2归一化的目的是去使得认脸的向量在同一量纲下,深度模型不是本文的重点,现如今有大量成熟的CNN模型可以直接使用,如VGG,Inception,Resnet等

2.2. Triplet Loss

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

∥ f ( x i a ) − f ( x i p ) ∥ 2 2 + α < ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 , ∀ ( f ( x i a ) , f ( x i p ) , f ( x i n ) ) ∈ τ \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 τ是所有的 ( x i a , x i p , x i n ) \left ( x_i^a,x_i^p,x_i^n \right ) (xia,xip,xin)三元组的集合,集合的大小为 N N N。训练的过程可由下图表示:

在这里插入图片描述
通过不断的学习,使得Anchor和Positive的距离较近,而Anchor和Negative的距离变远。对于FaceNet,其损失函数为:

L = ∑ i N [ ∥ f ( x i a ) − f ( x i p ) ∥ 2 2 − ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 + α ] 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. 样本选择

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

a r g m a x x i p ∥ f ( x i a ) − f ( x i p ) ∥ 2 2 argmax_{x_i^p}\left \| f\left ( x_i^a \right )-f\left ( x_i^p \right ) \right \|_2^2 argmaxxipf(xia)f(xip)22

同时,还需要选择不同认脸的图像 x i n x_i^n xin,使得

a r g m i n x i n ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 argmin_{x_i^n}\left \| f\left ( x_i^a \right )-f\left ( x_i^n \right ) \right \|_2^2 argminxinf(xia)f(xin)22

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

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

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

∥ f ( x i a ) − f ( x i p ) ∥ 2 2 < ∥ f ( x i a ) − f ( x i n ) ∥ 2 2 \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 f(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.


http://chatgpt.dhexx.cn/article/f3MsZU5E.shtml

相关文章

聪明的人脸识别3——Pytorch 搭建自己的Facenet人脸识别平台

聪明的人脸识别3——Pytorch 搭建自己的Facenet人脸识别平台 学习前言什么是Facenet源码下载Facenet的实现思路一、预测部分1、主干网络介绍2、根据初步特征获得长度为128的特征向量3、l2标准化4、构建分类器&#xff08;用于辅助Triplet Loss的收敛&#xff09; 二、训练部分1…

syscall()

1、syscall的定义 #include<unistd.h> #include<sys/syscall.h> / For SYS_xxx definitions /long syscall(long number, ...);syscall执行间接系统调用&#xff0c;使用该函数会执行一个系统调用&#xff0c;根据指定的参数 number 和所有系统调用的汇编语言接口…

linux systemctl命令详解

笔者在前文中概要的介绍了 systemd 的基本概念和主要特点。由于 systemd 相关的绝大多数任务都是通过 systemctl 命令管理的&#xff0c;所以本文将集中的介绍 systemctl 命令的用法。注意&#xff0c;本文以 ubuntu 16.04 进行介绍&#xff0c;文中所有的 demo 都在 ubuntu 16…

Linux常用命令——sysctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sysctl 时动态地修改内核的运行参数 补充说明 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff…

Linux之systemctl命令基本使用

文章目录 1. systemctl 管理指令2. systemctl 设置服务的自启动状态3. 应用案例&#xff1a;4. 细节讨论&#xff1a; 1. systemctl 管理指令 基本语法&#xff1a; systemctl [start | stop | restart | status] 服务名systemctl 指令管理的服务在 /usr/lib/systemd/system 查…

systemctl命令解析

原文链接如果有效&#xff0c;请点击原文链接查看。 原文&#xff1a;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 一、由来 历史上&#xff0c;Linux 的启动一直采用init进程。 下面的命令用来启动服务。 $ sudo /etc/init.d/apache2 start # …

Linux常用命令——systemctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) systemctl 系统服务管理器指令 补充说明 systemctl命令是系统服务管理器指令&#xff0c;它实际上将 service 和 chkconfig 这两个命令组合到一起。 任务旧指令新指令使某服务自动启动chkconfig --level 3 ht…

【Linux】之systemd与systemctl

文章目录 一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息 二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.…

【linux systemctl】Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…

Linux命令之systemctl命令

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…

idea 如何使用tomcat启动项目

1、首先对项目进行打包&#xff08;使用maven&#xff09; 2、打包成功后会有target 3、选择右侧的长条框&#xff08;如果没有tomcat&#xff0c;框是灰色的&#xff0c;这时你要自己手动加一个tomcat&#xff09;&#xff0c;选择Edit 4、如图所示、点击“”号&#xff0c;继…

Tomcat启动项目慢

原因是多方面&#xff0c;我遇到的情况有三种可能导致tomcat启动项目变慢 情况一&#xff1a;tomcat在启动过程中会检查jar&#xff0c;当有大量的jar被检测的时候&#xff0c;启动需要很长时间 解决办法&#xff1a;将catalina.properties文件中的这一行 tomcat.util.scan.S…

Eclipse配置Tomcat以及使用Tomcat启动项目

1、打开Peferences弹窗 Windeows--->Peferences : 2、输入Server&#xff0c;点击Runtime Enviroument&#xff0c;点击Add&#xff1a; 3、选择tomcat版本&#xff1a; 4、找到自己的tomcat的下载路径&#xff0c;点击finish&#xff1a; 5、顶级apply and close&#xf…

IDEA配置本地tomcat启动项目

1.确认tomcat本地安装是否成功 tomcat安装可以参考我之前写的内容,Windows下tomcat安装教程 2.idea启动tomcat设置 1.新建项目 2.点击Java Enterprise选项&#xff0c;并进行设置 ​ 服务器选择对应的Tomcat版本、JDK版本号要与Tomcat的版本号对应&#xff0c;不然可能出现…

Java项目部署到tomcat启动

Java项目部署到tomcat启动 1.选中项目右击进行打包2.把后缀war文件放入tomcat-->webapps下3.修改tomcat-->conf--server.xml文件4.修改tomcat-->bin-->startup.bat和 shutdown.bat文件5.启动startup.bat 1.选中项目右击进行打包 2.把后缀war文件放入tomcat–>we…

Tomcat启动闪退问题处理

一、问题描述 启动tomcat一闪就退出。 二、解决办法 1、确定JAVA_HOME配置正确 必须有JAVA_HOME变量&#xff0c;且配到了path中 2、新增TOMCAT_HOME变量 3、新增CATALINA_BASE和CATALINA_HOME变量 4、修改Path变量 把%CATALINA_HOME%\lib和%CATALINA_HOME%\bin放到Path中 三…

Tomcat启动后出现乱码

今天启动时出现了如下乱码&#xff1a; 解决方案&#xff1a; 1.找到Tomcat目录下conf文件夹中的logging.properties文件&#xff0c;用记事本打开 2.打开logging.properties文件&#xff0c;找到文件中的java.util.logging.ConsoleHandler.encoding UTF-8&#xff0c; 3.将其…

IDEA创建Tomcat启动配置

很多时候我们都是使用spring自带的Tomcat容器就可以启动应用&#xff0c;这里介绍下使用外置tomcat启动应用。 1.点击IDEA菜单&#xff1a;【Run】–>【Edit Configurations】&#xff0c;进入如下界面&#xff1a; 2.点击左上方【】&#xff0c;选择【Tomcat Server】->…

IDEA整合Tomcat启动javaweb项目

1.前言 突然兴起想要写这么一篇博客,不是因为别的,纯属是因为小编还是一个小白的时候,听某马和某硅谷的javaweb网课时,遇到这个章节一直启动不起来,虽然小编依旧是个菜鸡,但是今时不同往日了,小编已经打破桎梏成为了一个有素养的菜鸡,蓦然回首,还有这么多苦读的学子卡在这个章…

Tomcat启动时,报404错误

在网页输入 https://localhost:8080时出现Not Found 404错误 在Tomcat正常启动后出现的这个错误一般就是该8080端口被占用了&#xff0c;所以我们可以修改Tomcat中的配置文件&#xff0c;打开conf目录后&#xff0c;打开server.properties文件 修改端口号8080为8081 之后再次在…