深度学习之facenet人脸识别网络介绍

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

1.前言

         照例先来一段废话,不要跟我说什么物质决定意识,也不要告诉我意识超越物质。在我眼中,这个世界本就是一个战场。软弱的意志自然无法战胜物质,但是足够强大的意识也是能够做到的。在战争没有进行完之前,谁也不知道结果是什么样的。包括我们的世界,我不相信它是一种刻意的设计,倒更像是一种不得已而为之。因为历史总是在不断的重复重复,肯定不是某个外在生命在循环播放电视剧。所以世界的主角就是我们,看我们的生命在这里得到了什么。

2.流程 

                  

            上图就是facenet网络进行人脸识别的整体流程,我们看到总流程分为4步,第一步加载数据集、第二步使用主干网络提取特征信息,第三步neck网络进行L2正则化嵌入,第四部计算loss。不断的正向反向传播,我们最终的模型就出来了。有了一个整体的印象,下面我们详细的讲解一些每一个流程;

       1.batch数据预处理

                  我这块只说一下facenet源码中涉及到的预处理,实际应用中需要怎么处理可自行选择。源码中的预处理包括,随机剪切、随机水平翻转、标准归一化、最后对照片进行统一尺寸(默认为160*160)

        2.backbone

                   主干网络使用的是  inception_resnet_v1,这块就是经典的网络结构设计,在此处不展开详细讨论,后续我会专门针对常用的网络结构进行解释,敬请期待。

        3.neck

                     颈部可以说是facenet最关键的部分,也是其发挥作用的关键。此处的原理是使用L2正则项将所有的特征值映射到一个球面上,球面上两个点的距离大小就可以用来表示相似度。如果两张照片是同一个人,则距离小,不同的人则距离大。如下

         

          L2正则项是如何把不同的特征映射到一个球面的,假设其中一张照片的特征为x1,x2,x3。L2正则化以后就会变成\frac{x1}{\sqrt{x1^{2}+x2^{2}+x3^{2}}}\frac{x2}{\sqrt{x1^{2}+x2^{2}+x3^{2}}}\frac{x3}{\sqrt{x1^{2}+x2^{2}+x3^{2}}}。假设球心为(0,0),那么它到球心的距离就是\sqrt{(\frac{x1}{\sqrt{x1^{2}+x2^{2}+x3^{2}}})^{2}+(\frac{x2}{\sqrt{x1^{2}+x2^{2}+x3^{2}}})^{2}+(\frac{x3}{\sqrt{x1^{2}+x2^{2}+x3^{2}}})^{2}},化简可得\sqrt{\frac{x1^{2}+x2^{2}+x3^{2}}{x1^{2}+x2^{2}+x3^{2}}}=1。如果有多个特征值也是一样,这样所有的点到圆心的距离都为1,即将特征映射到了球面上。这样就将一个复杂的求照片相似度的问题,转换为了一个简单的求坐标距离的问题。至于为什么可以这么转换,我觉得应该是特征的的数值决定了其在球面上的位置,同一个人的脸数值比较接近,其位置也就比较靠近。而且这是经过伟大的作者实验出来的结果,遇事不决、量子力学,如果你无法接受我的解释,那它就暂时是玄学,如果研究明白欢迎及时联系我。

     4.Triplet Loss

            为什么要别出心裁的弄一个三元损失呢?我觉得真的都是被逼的。因为我们的模型需要具备一种能力,是识别两张照片是否为同一个人,因为世界上有60多亿人,如果用传统的分类损失那么类别的数量将会超级大,这样的模型是没有办法训练的。所以只能自己设计一种。

           那么设计的思路是什么呢?简洁、实用。还记得逻辑回归中我们将回归的损失转换为二分类的损失,这一块需要设计一种将分类的损失转换为回归损失的办法,因为最终我们输出的是相似度。Triplet Loss的思想是,每次选择三个样本计算loss,一个是目标样本记做anchor,一个是和目标为同一个人的正样本记做positive,另一个是其它人的负样本记做negative。如图我们选择那些A到P的距离大于A到N的(这代表是分错的样本),通过模型的不断训练,将他们调节为A到P的距离小于A到N的(将它们分对),简单解释一下就是开始模型不能够分辨是否为同一人,后来可以了。

              

        5.Triplet Selection

           计算所有的点中距离最大和最小是一件不可能的事情,而且计算量庞大。所以我们设计了两种选择样本的方式,第一种offline 离线选择,方法是计算几个批次中argmin和argmax;另外一种是online,只计算一个一个小的mini-batch中的argmin和argmax。关于online和offineline我理解就是,对于单批次计算来说,假如线上新出现一个数据,我们就可以直接加入到当前的批次中进行训练,而不需要再去找前面的数据来进行计算。我们选择使用online的选择方法,但是有几点需要注意,第一是大批次,也就是说一个min_batch中的数据量要足够多;第二需要确保每个批次中有足够多的A和P,因为我们是根据AP和N时间的差异进行调节的,只有AP足够多才具有调节的意义(论文给出的实验结果是40对),然后再随机的选择负例加入批次中。

          如果每次选择离的那些负样本的距离小于正样本距离,会导致模型在训练的时候过早的进入局部最优。甚至会导致模型无法收敛,比如说他找不到这样的分错的点。所以我们决定放宽一点限制,我们选择那些分对的,并且离的比较近的负样本,我们将它叫做semi-hard。如何定义里的比较近,我们引入了阈值α(默认为0.2)。所以最终我们的Triplet Loss表达式就如下:

        

3.工程技巧

         1.在样本选择方面,我们会将成对的图像信息写入到pairs.txt文件中。如下,如果有三个值表示同一个人的两幅不同的照片;如果有四个值表示两个不同人的照片。每一个人的照片存储在同一个文件夹中,用姓名加四位的整数代表不同的照片

             

             

         2.使用模型进行推理的时候,我们一般先使用mtcnn网络检测出摄像头中的人脸信息,将该人脸信息和数据库中已有的信息进行比较,选择最相似的作为输出。如果是每次识别都是暴力穷举所有的数据 进行比对的话,有可能会遇到瓶颈,facebook有一个专门用来向量查找的库faiss,类似于检索的方式对 最近的向量 进行查找,可以在一定程度上提高 速度。

        3.人脸入库的时候,一般需要将检测出来的人脸信息张量转换成向量的形式,然后将向量中的元素转换成字符串拼接到一起存储到数据库中。出库的时候需要对拼接的字符串进行重新解码,使其恢复成张量形式。每个编码在数据库中会对应自己的人物姓名。

4.总结

          我们介绍了facenet人脸识别系统,其核心的原理就是将人脸的相似度,映射到欧式空间。然后使用特征在空间中的距离表示相似度。还有一个亮点就是引入了Triplet Loss,每次使用Anchor、Positive、Negative三个样本之间的距离差加上一个超参数α来计算损失。最后其采用Large batch的online选择样本,因为批次足够大所以选择的样本argmin和argmax也具有代表性,为了保证AP距离有意义,每个批次中必须保证足够数量的AP对(论文建议为40)。

       今天白天玩的太多了,导致晚上写到这么晚。不过这种感觉也很爽,没有玩的激情哪有学的动力。一首今夜无人入眠为大家献上。

【灵魂的高歌】帕瓦罗蒂-今夜无人入睡

 

 

 

 


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

相关文章

聪明的人脸识别4——Pytorch 利用Retinaface+Facenet搭建人脸识别平台

睿智的目标检测51——Pytorch 利用RetinafaceFacenet搭建人脸识别平台 学习前言什么是Retinface和Facenet1、Retinface2、Facenet 整体实现代码实现流程一、数据库的初始化二、检测图片的处理1、人脸的截取与对齐2、利用Facenet对矫正后的人脸进行编码3、将实时图片中的人脸特征…

Facenet 原理介绍

引子[编辑 | 编辑源代码] 这篇wiki主要介绍facenet人脸相似比较的基本原理,另外两篇wiki主要介绍基于tensorflow实现facenet的准确率测试及源码解读。经过在网上的一番搜索,找到了facenet实现人脸聚类的论文和论文解读,以及github上根据facen…

【 facenet-retinaface】快速复现 实现 facenet-retinaface-pytorch 人脸识别 windows上 使用cpu实现

目录 0 前言1 搭建环境与项目2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-retinaface-pytorch 是在上一次博客的内容上更进一步 快速复现 实现 facenet-pytorch 人脸识别 windows上 使用cpu实现 人脸对比 参考了: Pytorch 利用Facenet和Re…

FaceNet

摘要: 尽管人脸识别领域最近取得了重大进展[10,14,15,17],但大规模有效地实施人脸验证和识别对当前方法提出了严峻挑战。在本文中,我们提出了一个称为 FaceNet 的系统,它直接学习从人脸图像到紧凑欧几里得空间的映射,其…

【facenet】快速复现 实现 facenet-pytorch 人脸识别 windows上 使用cpu实现 人脸对比

目录 0 前言1 搭建环境与项目2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-pytorch 参考了: Pytorch 搭建自己的Facenet人脸识别网络(Bubbliiiing 深度学习 教程) https://gitee.com/xiaozhao123666/facenet-pytorch …

利用MTCNN和facenet实现人脸检测和人脸识别

利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单,先利用mtcnn的进行人脸检测,当然也可以使用其他的人脸…

facenet 总结一

Facenet是谷歌研发的人脸识别系统,该系统是基于百万级人脸数据训练的深度卷积神经网络,可以将人脸图像embedding(映射)成128维度的特征向量。以该向量为特征,采用knn或者svm等机器学习方法实现人脸识别。 CASIA-WebFac…

【人脸识别】FaceNet详解

论文题目:《FaceNet: A Unified Embedding for Face Recognition and Clustering》 论文地址:FaceNet 1、概述 FaceNet(A Unified Embedding for Face Recognition and Clustering)直接把输入图像变成欧式空间中的特征向量&#…

人脸识别系统FaceNet原理

1. 概述 近年来,随着深度学习在CV领域的广泛应用,人脸识别领域也得到了巨大的发展。在深度学习中,通过多层网络的连接,能够学习到图像的特征表示,那么两张人脸的图像,是不是可以通过深度学习判别其是否是相…

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

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