Retinaface预测过程:

利用主干特征提取网络MobilenetV1-0.25对图片进行初步的特征提取

再对初步的特征进行特征金字塔的构建  特征金字塔主要完成特征融合的功能

利用SSH对融合后的特征进行加强特征提取  获得最终的有效特征层

利用Retinahead对获取到的特征层进行通道数的调整  获得我们最终的预测结果

最终的预测结果会判断先验框内部是否包含人脸  并对先验框进行调整获得最终的预测框  还会对先验框中心调整  获得人脸的五个关键点

  1. 预测部分

  • 提取特征

特征提取部分的功能是对输入进来的图片进行特征提取,优秀的特征可以帮助更容易区分目标,所以特征提取部分一般由各类卷积组成,卷积拥有强大的特征提取能力;

Retinaface的主干网络起到提取特征的作用,主干特征提取网络是mobilenetv1,mobilenetv1是针对手机等嵌入式设备提出的轻量级深层神经网络,其核心思想是深度可分离卷积块。

深度可分离卷积块由两部分组成,分别是深度可分离卷积和1*1普通卷积,深度可分离卷积的卷积核大小一般是3*3,用于做特征提取,1*1普通卷积可以完成通道数的调整。

相较于普通的3*3卷积,深度可分离卷积块可大大减少模型的参数。

  • FPN特征金字塔

利用1*1卷积对Mobilenet特征提取网络的最后三个特征有效层进行通道数的调整,然后利用Upsample和Add进行上采样的融合。

卷积神经网络由浅到深,语义信息越来越丰富,但特征图越来越小,分辨率越来越低,解决方案是接将浅层和高层的特征图连接起来,将浅层的信息传递到深层,以解决深层特征图容易忽略小目标的问题。
为了解决以上三种结构的不足之处,提出了FPN,即使每一层不同尺度的特征图都具有较强的语义信息。
这种网络结构,能够在增加较少计算量的前提下融合低分辨率语义信息较强的特征图和高分辨率语义信息较弱但空间信息丰富的特征图。
FPN的独特之处在于,它是在以特征金字塔为基础结构上,对每一层级的特征图分别进行预测。
FPN将深层信息上采样,与浅层信息逐元素地相加,从而构建了尺寸不同的特征金字塔结构。

  • SSH进一步加强特征提取

经过特征金字塔后,获得三个有效特征层,Retinaface为进一步加强特征提取,使用了SSH模块加强感受野。

为什么要增大感受野
卷积、池化都有一个重要作用就是增大感受野,为什么感受野这么重要呢?
前面看过感受野的定义,是表示在前几层对应的图像区域的大小,那么为了保证所利用的信息是全局的,而不仅仅是局部信息,我们就应该保证感受野较大。同时,合理计算感受野,可以保证效率,例如,输入图像大小是128*128,如果最后一层的感受野已经可以超过128,我们可以认为在做最后的分类判断时所用到的特征已经涵盖了原始图像所有范围的信息了。如果能够尽可能的降低网络的参数总量,也十分重要。

SSH结构如下:

SSH思想是使用了三个并行结构,利用3x3卷积的堆叠代替5x5与7x7卷积的效果:左边的是3x3卷积,中间利用两次3x3卷积代替5x5卷积,右边利用三次3x3卷积代替7x7卷积。

为什么利用3x3卷积的堆叠代替5x5与7x7卷积:
第一:2个3x3卷积核与1个5x5卷积核具有相同的感受野 第二:使用2个3×3卷积核的参数计算量远小于5×5卷积核的参数计算量。 第三:多个3×3卷积核比一个较大尺寸的卷积核有更多层的非线性函数,从而能够增加非线性表达能力,使判决函数更具有判决性。

为什么要激活函数:
如果没有激活函数会导致的问题:1.各层级之间的线性操作可以直接等价于一层线性操作,那么其实整个网络其实就当于是一个从输入到输出的变化,中间隐藏层的线性变化完全通过更改输入层的参数矩阵就可以实现。 2.其次由于线性组合相当于是对原始参数矩阵张成的空间进行 伸缩,旋转和剪切,但是可能 真实世界有些原始数据本身就是 线性不可分的,必须要对原始空间进行一定的 非线性操作。
引入激活函数的好处:1.为神经网络引入非线性的能力。2.限制每层之间的输出值范围。3.模拟人类神经元的传递规则.

  • 从特征获取预测结果

当输入进来的图像是(640*640*3),利用SSH获得三个有效特征层SSH1,SSH2,SSH2.

SSH1的shape为(80, 80, 64); SSH2的shape为(40, 40, 64); SSH3的shape为(20, 20, 64).

SSH1就表示将原图像划分为80*80的网格,SSH2和SSSH3同理。每个网格上会有两个先验框,每个先验框代表图片上一定的区域。

Retinaface的预测结果分为三个,分别是分类预测结果,框的回归预测结果和人脸关键点的回归预测结果

1、分类预测结果用于判断先验框内部是否包含物体,我们可以利用一个1x1的卷积,将SSH的通道数调整成num_anchors x 2,用于代表每个先验框内部包含人脸的概率。

2、框的回归预测结果用于对先验框进行调整获得预测框,我们需要用四个参数对先验框进行调整。此时我们可以利用一个1x1的卷积,将SSH的通道数调整成num_anchors x 4,用于代表每个先验框的调整参数。每个先验框的四个调整参数中,前两个用于对先验框的中心进行调整,后两个用于对先验框的宽高进行调整。

3、人脸关键点的回归预测结果用于对先验框进行调整获得人脸关键点,每一个人脸关键点需要两个调整参数,一共有五个人脸关键点。此时我们可以利用一个1x1的卷积,将SSH的通道数调整成num_anchors x 10(num_anchors x 5 x 2),用于代表每个先验框的每个人脸关键点的调整。每个人脸关键点的两个调整参数用于对先验框中心的x、y轴进行调整获得关键点坐标。

完成调整、判断之后,还需要进行非极大移植。可以用一句话概括非极大抑制的功能就是:筛选出一定区域内属于同一种类得分最大的框。

2.训练过程

  • 真实框的处理

真实框的处理过程可以分为3步:

1、计算所有真实框和所有先验框的重合程度,和真实框iou大于0.35的先验框被认为可以用于预测获得该真实框。

2、对这些和真实框重合程度比较大的先验框进行编码的操作,所谓编码,就是当我们要获得这样的真实框的时候,网络的预测结果应该是怎么样的。

3、编码操作可以分为三个部分,分别是分类预测结果,框的回归预测结果和人脸关键点的回归预测结果的编码。

  • 利用处理完的真实框与对应图片的预测结果计算loss

loss的计算分为两个部分:

1、Box Smooth Loss:获取所有正标签的框的预测结果的回归loss。

2、MultiBox Loss:获取所有种类的预测结果的交叉熵loss(常用于分类问题中)。

https://zhuanlan.zhihu.com/p/35709485

3、Lamdmark Smooth Loss:获取所有正标签的人脸关键点的预测结果的回归loss。

由于在Retinaface的训练过程中,正负样本极其不平衡,即 存在对应真实框的先验框可能只有若干个,但是不存在对应真实框的负样本却有几千上万个,这就会导致负样本的loss值极大,因此我们可以考虑减少负样本的选取,常见的情况是取七倍正样本数量的负样本用于训练。

在计算loss的时候要注意,Box Smooth Loss计算的是所有被认定为内部包含人脸的先验框的loss,而Lamdmark Smooth Loss计算的是所有被认定为内部包含人脸同时包含人脸关键点的先验框的loss。(在标注的时候有些人脸框因为角度问题以及清晰度问题是没有人脸关键点的)。

Facenet:

简单来讲,在使用阶段,facenet即是:

1、输入一张人脸图片

2、通过深度卷积网络提取特征

3、L2标准化

4、得到一个长度为128特征向量

  • 通过深度卷积网络提取特征

主干特征提取网络会对输入进来的人脸图片进行初步的特征提取,获得初步的特征层。

对初步特征层进行处理,获得长度为128的特征长条,具体操作就是对初步特征层进行全局平均池化,这时就可以获得一个尚未处理的特征长条,对特征长条进行全连接,全连接的神经元个数为128,完成全连接后就可以获得一个长度为128的特征长条。

  • L2标准化

然后对长度为128的特征长条进行L2标准化,它会将特征长条标准化到同一个数量级上,这样就可以方便我们的人脸比对了,完成L2标准化后,特征长条的模就是1了。

  • 得到一个长度为128特征向量

然后将人脸向量与数据库中的人脸向量进行比对,如果比对的欧氏距离非常近的话,也就意味着这两张图片很有可能属于同一个人的,这个时候我们就可以找到输入人脸的身份了,完成人脸识别

  1. 预测部分:

  • 提取特征

特征提取部分的功能是对输入进来的图片进行特征提取,优秀的特征可以帮助更容易区分目标,所以特征提取部分一般由各类卷积组成,卷积拥有强大的特征提取能力;

facenet的主干网络起到提取特征的作用,主干特征提取网络是mobilenetv1,mobilenetv1是针对手机等嵌入式设备提出的轻量级深层神经网络,其核心思想是深度可分离卷积块。

深度可分离卷积块由两部分组成,分别是深度可分离卷积和1*1普通卷积,深度可分离卷积的卷积核大小一般是3*3,用于做特征提取,1*1普通卷积可以完成通道数的调整。

相较于普通的3*3卷积,深度可分离卷积块可大大减少模型的参数。

  • 根据初步特征获取长度为128的特征向量

分类部分会利用特征提取部分获取到的特征进行分类,分类部分一般由全连接组成,特征提取部分获取到的特征一般是一维向量,可以直接进行全连接分类。

利用提取到的特征层,将其全局平均池化,方便后续的处理,将平铺后的特征层进行一个神经元个数为128的全连接此时相当于利用了一个长度为128的特征向量代替输入进来的图片。这个长度为128的特征向量就是输入图片的特征浓缩。

全连接的作用(为什么):全连接层的主要作用就是将前层(卷积、池化等层)计算得到的特征空间映射样本标记空间。简单的说就是将特征表示整合成一个值,其优点在于减少特征位置对于分类结果的影响,提高了整个网络的鲁棒性。

全连接的原理(怎么做):一个网络在全连接层之前,生成了5@3×3的特征映射,我们需要只需要使用五个卷积核去和激活函数的输出进行卷积运算,在将五个输出的值相加即可得到一个全连接层的输出值。

  • L2标准化

为了使不同人脸的特征向量处于同一数量级,以方便比较。我们对长度为128的特征向量进行L2标准化。

  • 构建分类器

Facenet结合交叉熵损失(Cross-Entropy Loss)和三元组损失(Triplet Loss)。

三元组损失用于进行不同人的人脸特征向量欧几里得距离的扩张,同一个人的不同状态的人脸特征向量欧几里得距离的缩小。交叉熵损失用于人脸分类,具体作用是辅助Triplet Loss收敛。

想要利用交叉熵损失进行训练需要构建分类器,因此对L2标准化的特征向量再次进行一个全连接用于分类。(在进行网络的训练的时候,可使用分类器辅助训练,在预测的时候,分类器是不需要的)

构建分类器的代码:

if mode =="train":self.classifier = nn.Linear(embedding_size, num_classes) #全连接
  1. 训练部分:

  • 数据集

将同一个人的图片放在同一个文件夹中,并对人脸进行了提取和矫正。

  • LOSS(损失函数)组成

facenet使用三元组损失作为损失函数。三元组输入是一个三元组:

a:anchor,锚点的128维人脸特征向量

p:positive,正样本的128维人脸特征向量

n:negative,负样本的128维人脸特征向量

则Triplet loss的思想用欧氏距离形式化表示为:L=max(d(a,p)−d(a,n)+margin,0)

我们求anchor和positive的欧几里得距离,并使其尽量小;求anchor和negative的欧几里得距离,并使其尽量大。

由于仅仅使用三元组损失会使网络难以收敛,因此用交叉熵损失用于辅助三元组损失收敛,交叉熵损失用于人脸分类。

交叉熵刻画了两个概率分布之间的距离,更适合用在分类问题上,因为交叉熵表达预测输入样本属于某一类的概率。其公式如下所示:

Pytorch 利用Facenet和Retinaface实现人脸识别相关推荐

  1. 详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别

    @[TOC](详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别**) 近来闲来无事,翻出了搁置已久的轻薄版电脑,望着积满灰尘的显示屏,觉得有愧于老师的尊尊教导,心中叹息 ...

  2. ICCV 2019 | 爱奇艺提出半监督损失函数,利用无标签数据优化人脸识别模型

    点击我爱计算机视觉标星,更快获取CVML新技术 论文发表于ICCV 2019 作者 | 爱奇艺技术产品团队 编辑 | 唐里 论文标题:Unknown Identity Rejection Loss: ...

  3. Python 在 Windows 下利用 face_recognition 和 OpenCV 实现人脸识别

    在安装Python的一些库时,遇到的错误及解决办法: # OpenCV的介绍.安装和使用 # OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,OpenCV用C++语言编写, # 支持 ...

  4. Python利用百度AI平台实现人脸识别

    前言 百度AI平台提供的接口十分丰富,对于做项目来说,百度是一个很好的开放平台.本文利用百度提供的接口来实现人脸识别,而且可以无限制调用.博客参考人脸识别-Python-SDK 安装 pip inst ...

  5. 用facenet源码进行人脸识别测试过程中的一些问题

    1.首先下载facenet源码:https://github.com/davidsandberg/facenet 2.运行facenet 用pycharm打开,下载好tensorflow1.7 版本, ...

  6. [树莓派] : 如何用树莓派利用摄像头进行简单的人脸识别【how to use IR camera +raspberrypi 3b+ in python】

    # how to use IR camera +raspberrypi 3b+ in python: 1.connect the camera module:    shut down the res ...

  7. 利用芝麻信用的来人脸识别-实名认证

    这是传进来的参数 ​ public class ZmUser {private String userName;private String identityCard;private String r ...

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

    目录 0 前言 1 搭建环境与项目 2 人脸预测与结果展示 0 前言 这一次要复现的是人脸识别中的 facenet-retinaface-pytorch 是在上一次博客的内容上更进一步 快速复现 实现 ...

  9. 【人脸识别】MTCNN + Arcface全流程详解 Pytorch代码 损失函数发展

    目录: 人脸识别介绍 损失函数发展 Softmax loss Center loss Triplet loss L-softmax loss SphereFace(A-Softmax loss) Co ...

最新文章

  1. 14 个经典的 Linux 终端命令行,这些工具堪称神器!
  2. mingw 编译 libopus 1.3.1 时 注意事项
  3. WordPress实践:自定义theme(01)
  4. handler消息机制
  5. arm el2与el3_ARMv8的学习笔记
  6. jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递...
  7. 初三计算机会考成都,高中阶段教育学校统一招生考试试卷(含成都市初三毕业会考)...
  8. Jquery学习总结(2)——jQuery Ajax用法详解
  9. 假如我结婚以后父母把房子过户到我一人名下,属于夫妻共同财产嘛?
  10. 什么是python的内置函数_python 内置函数
  11. 51单片机最小系统解读
  12. ASCII码格式转回汉字
  13. java的时间日期类_Java基础学习:日期时间类
  14. 洛谷 P4233 射命丸文的笔记 题解
  15. 前端工程化、模块化、组件化
  16. java语言与其他语言的区别是_浅谈Java语言和其他语言的区别
  17. 2022年北京国际塑料橡胶及包装工业展览会
  18. Android监听横竖屏切换
  19. zabbix4.2批量导入主机
  20. 总结一波 Redis 面试题,收藏起来

热门文章

  1. c语言实现灰度图转换
  2. 推荐几款好用的企业级文档管理软件
  3. 华为 DHCP基本配置及概念
  4. python中合并excel表格
  5. python如何将数组里的数提取出来_python [:3] 实现提取数组中的数
  6. 借助CatGPT让turtlesim小乌龟画曲线
  7. 【调剂】陕西师范大学计算机科学学院2022年硕士研究生调剂公告
  8. 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
  9. 无法打开包括文件: “opencv2/opencv_modules.hpp”
  10. Diskpart工具为硬盘进行GPT分区