简介

基于深度卷积网络的人脸识别,流程基本上一致,如下图所示,可以看做是一个基本框架:

图1 人脸识别基本框架

由上图,可以看到,人脸识别分为以下几个主要步骤:

  1. 输入图像:可以做一些图像前处理操作,比如:调整亮度、去噪等
  2. 人脸检测:检测人脸位置,可以加入一些活体检测之类的算法
  3. 人脸对齐:实际场景中,人脸一般都是歪的,需要基于人脸关键点进行对齐
  4. 人脸裁剪:将对齐后人脸抠出,作为后续深度特征网络的输入
  5. 人脸特征提取:通过DCNN网络,对人脸图进行建模,得到人脸特征
  6. 人脸特征比对:使用比对算法,比对不同人脸特征,比如:余弦距离、欧氏距离等

详细介绍

Input Image -> Detect

输入:原始的可能含有人脸的图像

输出:活体人脸位置的bounding box

这一步称之为“人脸检测”(Face Detection),可以使用dlib、OpenCV现有的人脸检测方法,比如传统计算机视觉中的方法(Hog、Haar等特征)、深度学习YOLO等。

对人脸检测这一步感兴趣的可以参考下列资料:

dlib的实现:dlib C++ Library: Dlib 18.6 released: Make your own object detector!

openCV的实现:Face Detection using Haar Cascades

在金融等高安全场景,对检测到的人脸,还需判断是否为照片和视频等非活体人脸,需要将检测到的人脸输入活体分类网络,筛选出活体人脸。

另外,一般在进行该步骤之前,会进行图像预处理操作,这部分工作可能很多很复杂,比如:减少图像中的噪声干扰、提高清晰度,还有包括图像滤波、变换、转码、模数转化等,如下图所示,原始图像人脸太暗,需要先提个亮度,然后发现噪点太多,再做个降噪.....一顿操作后,感觉效果可以了,然后再进行之后流程:

图2 图像预处理

Detect -> Transform -> Crop

输入:原始图像 + 人脸位置bounding box

输出:“校准”过的只含有人脸的图像

对于输入的原始图像 + bounding box,这一步要做的事情就是要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。所谓关键点(landmark),就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等,关键点个数有很多类型,可以参考资料(点击查看)。有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。解释一下:就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫Face Alignment(人脸对齐)。人脸对齐后,就可以进行人脸图扣取了。

图3 人脸对齐

对于人脸对齐感兴趣的,可以参考如下传统方法,特点是比较快,对应的论文是:

https://www.semanticscholar.org/paper/One-millisecond-face-alignment-with-an-ensemble-of-Kazemi-Sullivan/d78b6a5b0dcaa81b1faea5fb0000045a62513567?p2df

人脸关键点:

人脸关键点检测的数据集与核心方法发展综述 - 极市社区

Crop -> Representation

输入:校准后的单张人脸图像(抠图后)

输出:人脸特征向量

这一步就是使用深度卷积网络,将输入的人脸图像,转换成一个向量的表示。在insightface中,使用的向量是512x1的,也就是一个512维的向量,该维度取决于特征网络,如下图是人脸特征提取网络示意图:

图4 人脸特征网络示意图

图5 人脸特征网络功能图

通过图4,不难发现,该网络就是一个分类网络,而实际特征提取的时候,只需要到conv5_3,,换言之,实际使用时,提取人脸特征,一般就是到卷积层的最后一层,而训练时,一般需要完整的分类网络(基于训练可行性)。

在理想的情况下,我们希望人脸特征向量具备如下性质:

  1. 同一个人的人脸图像,特征向量之间差异比较小
  2. 不同人的人脸图像,特征向量之间差异比较大

举个例子,如下是手写0-9数字CNN分类网络,让最后一层的向量变成2维后,可视化出来每一类对应的二维向量表示,图中每个颜色代表一个类别:

图6 手写0-9可视化特征向量

从图中可以看出,直接采用softmax训练得到的结果,不太符合我们理想特征的特点:我们希望同类尽可能接近,不同类尽可能的远,而图中,不同类之间距离很近,而同类之间(比如紫色)距离很远。

那么训练人脸特征的正确姿势是什么呢?其实有很多种方法,如下图所示,展示了几种损失函数类型。

图7 不同类型损失函数

损失函数介绍,可以参考如下:

人脸识别损失函数综述(附开源实现) - 知乎

通过设计不同的loss,最大程度达到我们理想的特征,如下图是采用center loss(中心点)训练后,可视化的MINIST(0-9分类)特征图分布,相对于图6,更加接近理想特征。

图8 采用center loss后的手写0-9可视化特征向量图

center loss介绍可以参考如下:

http://ydwen.github.io/papers/WenECCV16.pdf

Recognition

经过上述流程,可以训练出人脸特征提取模型,之后就是基于该模型进行人脸比对,人脸比对有几个场景:

  • 人脸验证(Face Identification):就是检测A、B是否是属于同一个人。只需要计算向量之间的距离,设定合适的报警阈值(threshold)即可。
  • 人脸识别(Face Recognition):这个应用是最多的,给定一张图片,检测数据库中与之最相似的人脸。显然可以被转换为一个求距离的最近邻问题。
  • 人脸聚类(Face Clustering):在数据库中对人脸进行聚类,直接K-Means即可。

关于向量距离计算,人脸识别一般采用余弦距离,其他还有欧氏距离、汉明距离、标准化欧式距离等,详细可以参考:

特征向量的距离度量 - 知乎

常用聚类算法,可以参考:

常用聚类算法 - 知乎

参考:

  1. https://arxiv.org/abs/1801.07698
  2. 『算法理论学』基于深度人脸识别流程介绍 - 云+社区 - 腾讯云
  3. 人脸识别长篇研究 | 技术与流程(二) - 知乎
  4. 硬核科普:一文看懂人脸识别技术流程-面包板社区
  5. 人脸关键点检测的数据集与核心方法发展综述 - 极市社区
  6. 人脸识别损失函数综述(附开源实现) - 知乎
  7. http://ydwen.github.io/papers/WenECCV16.pdf
  8. 特征向量的距离度量 - 知乎
  9. 常用聚类算法 - 知乎

深度学习框架人脸识别介绍相关推荐

  1. 开发基于深度学习的人脸识别【考勤/签到】系统

    开发基于深度学习的人脸识别[考勤/签到]系统 人脸识别介绍 平台环境需求 技术点 系统流程 细节设计 人脸检测 人脸关键点定位 人脸特征提取 模型的训练 模型的部署 MySQL数据库的使用 MFC工程 ...

  2. dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码

    请直接访问原文章 dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码 https://hotdog29.com/?p=595 在 2019年7月7日 上张贴 由 hotdog发表回 ...

  3. 基于深度学习的人脸识别综述

    本文转载自 https://xraft.github.io/2018/03/21/FaceRecognition/ (作者:Caleb Ge (葛政)),如有侵权请告知删除. (下文中的"我 ...

  4. python模块cv2人脸识别_手把手教你使用OpenCV,Python和深度学习进行人脸识别

    使用OpenCV,Python和深度学习进行人脸识别 在本教程中,你将学习如何使用OpenCV,Python和深度学习进行面部识别.首先,我们将简要讨论基于深度学习的面部识别,包括"深度度量 ...

  5. [深度学习概念]·深度学习中人脸识别开发解析

    深度学习中人脸识别开发解析 目录 人脸识别介绍 人脸识别算法 实战解析 参考文献 人脸识别介绍 人脸识别是什么 人脸识别问题宏观上分为两类:1. 人脸验证(又叫人脸比对)2. 人脸识别. 人脸验证做的 ...

  6. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  7. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  8. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  9. 基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)

    摘要:人脸检测与识别是机器视觉领域最热门的研究方向之一,本文详细介绍博主自主设计的一款基于深度学习的人脸识别与管理系统.博文给出人脸识别实现原理的同时,给出Python的人脸识别实现代码以及PyQt设 ...

最新文章

  1. python数据写入CSV
  2. java8 求和_java8求和
  3. python语言程序设计基础第二版第六章答案-Python语言程序设计基础(第2版) 课后题 第六章...
  4. 新建仓库后第一次提交的问题
  5. k8s部署nacos集群:3个pod、连接外部mysql读写分离集群
  6. Markdown数学符号
  7. 解决新版chrome跨域问题:cookie丢失以及samesite属性问题
  8. 微信小程序开发--【Hello World 及代码结构】(二)
  9. linux系统同时安装python2.x和3.x
  10. 利用FastFds搭建文件管理系统(一)
  11. ug建模文本怎么竖着_ug模型如何雕刻立体汉字
  12. 老打印机USB改无线连接
  13. Linux下安装MySQL、安装注意事项以及安装问题解决等(以腾讯云服务为主)
  14. 手工制作使用WinXShell的PE(不是直接生成) #1
  15. Cadence OrCAD Capture原理图检查之逐个元件Part检查的方法
  16. 项目管理(项目管理中的重要角色项目经理)
  17. ubuntu下putty的安装及使用
  18. Perl实现逆波兰式与递归计算
  19. Cesium出现Unknown crs name: urn:ogc:def:crs:EPSG:xxxx
  20. Scipy sparse中关于CSC矩阵的自我理解

热门文章

  1. 计算机网络技术应用》期末试卷,计算机网络期末考试试卷及答案
  2. Linux 防火墙设置失败
  3. 【精品】大学生求职简历模板分享
  4. 《量化金融R语言初级教程》一第2章 投资组合优化
  5. Java设计模式 - 模板模式
  6. 矿工选择囤币等待 | TokenInsight减半特辑
  7. (线段树)小白月赛9-C红球进白洞
  8. Cola公司的雇员分为以下若干类:(知识点:多态) 4.1 ColaEmployee :这是所有员工总的父类,属性:员工的姓名,员工 的生日月份。方法:getSalary(int month) 根据
  9. 2021物联网国赛Lora模块通用库开发——A卷
  10. 从互联网思维走向智联网思维