文章目录
所谓人脸识别,就是在图像和视频中检测人脸,并与人脸数据库中进行实时对比,从而实现身份识别。单纯的人脸识别目前已经比较成熟了,需要与其他的方向融合(如3D视觉、图形学)或者结合一些新的场景(如口罩、大尺度相片),比较能做出新的东西
人脸识别在计算机视觉中的位置
如果将计算机视觉分为四类基本任务,那么人脸识别可以认为是目标分类的延申任务
早期方法
人脸识别的方法框架大体上并没有发生变化,都是首先进行人脸检测,然后做特征提取,再训练一个分类器。
许多人认为,人脸识别任务中特征提取(在这个任务中更确切地可以说是–人脸表征)是最重要最核心地一步
以下以一种基于LBP的方法为例进行说明
Face Recognition with Local Binary Patterns(【ECCV 2004】)
1994年有人提出了LBP特征。局部二值模式(Local Binary Patter, LBP)是一种用来描述图像局部纹理特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点,它将图像中的各个像素与其邻域像素值进行比较,将结果保存为二进制数
而在2004年则有人提出可以用其来做人脸识别的特征提取
常见的特征提取算子有:PCA、LDA、BIC、HoG(行人检测常见HoG+SVM)、Haar(人脸检测常见)等
常见的分类器有:SVM、kNN、kMeans等
在文章中,作者使用LBP来提取特征,使用kNN来做分类器
LBP算子的简单介绍
LBP的feature map计算方法:
原始的LBP算子定义为在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:
除此以外LBP算子还有改进版本:
1)圆形LBP算子 2)LBP等价模式
LBP的特点
因为LBP计算特征图是通过与旁边的元素对比获得,整个图片的灰度变化是"同步"变化,因此LBP特征图对于光照变化是鲁棒的
从LBP的得到的“图片”到“向量”
上述提取的局部二值模式算子在每个像素点都可以得到一个局部二值模式“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的局部二值模式值)
局部二值模式的应用中,如纹理分类及人脸分析等,一般都不将局部二值模式图谱作为特征向量用于分类识别,而是采用局部二值模式特征谱的统计直方图作为特征向量用于分类识别。
也就是: 原图–>LBP特征图–>统计直方图得到特征向量。(这个特征向量的意思不是线代里面那个,就是指特征的意思)
经过文章作者的测试,有如下的结论
- LBP相比于PCA、LDA等应用于人脸识别方法而言,更加简单有效。LBP本身是一种纹理提取算法,但是在人脸识别中却很有用
- 对于人险识别而言,仅仅通过单个简单的分类器是难以达到很高的准确度的
- 对于LBP而言,还可以使用AdaBoost等方法组合出一个较强的分类器进行分类
数据集
下面地这张图说明了CNN时代最常用的人脸识别数据集
一些较新的文章
前面说到,人脸识别的步骤无非如下几个:
人脸识别的方法框架大体上并没有发生变化,都是首先进行人脸检测,然后做特征提取,再训练一个分类器
在深度学习时代,只不过在这三个基本步骤上加了更多花样,如更新的检测方法、以神经网络为基础的特征提取算法、和新设计的损失函数。
例如,常用以CNN为基础的网络来提取特征,新设计损失函数如triplet
对于基于 CNN 的人脸识别方法,影响准确度的因素主要有三个:训练数据、CNN 架构和损失函数。
在深度学习时代,一些最经典的人脸识别算法比较如下
From: https://sci-hub.wf/10.1007/978-981-13-7123-3_3
FaceNet(【CVPR 2015】)
这篇文章截至2022-3-27,引用次数已经达到了一万多,是近些年来人脸识别领域的经典之作
FaceNet的重要点:
- 将人脸映射到128维向量空间中。相比其他网络动辄几百上千维,向量嵌入地更加紧凑了。不过该文章只给出了人脸嵌入到128维向量。FaceNet 没有定义任何新的算法来进行分类,而只是创建了嵌入,因此可以后续用于人脸识别、验证和聚类。
FaceNet 使用深度卷积神经网络 (CNN)。网络经过训练,使得Embedding向量之间的平方 L2 距离对应于人脸相似度。
- 新设计了一个Triplet损失函数,这个triplet已经成为了人脸识别领域的经典之作。之所以叫triplet,是因这个损失函数的自变量包含三个部分: 某个特定人脸(称为anchor)、与该人匹配的人脸(称为正样本positive)、与该人不匹配的人脸(称为负样本negative)
上图即给出了triplet的计算过程,这个损失函数的输入是一个anchor与一个正样本+一个负样本合并计算而来
这张图是经过triplet损失函数训练前后,希望得到的结果: 即训练后anchor与正样本比较近,而离负样本比较远
三元组损失函数可以正式定义为
∑
i
N
[
∥
f
(
x
i
a
)
−
f
(
x
i
p
)
∥
2
2
−
∥
f
(
x
i
a
)
−
f
(
x
i
n
)
∥
2
2
+
α
]
+
\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]_{+}
i∑N[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]+
只要记住公式背后 的直觉, 然后就很容易记住了。
x
i
−
x_{\mathrm{i}} \quad-
xi− It represents an image
f
(
x
i
˙
)
f\left(x_{\dot{i}}\right)
f(xi˙) - It represents the embedding of an image
α
\alpha
α– It represents the margin between positive and negative pairs
- FaceNet 使用 2 种类型的 CNN作为backbone,即 Zeiler & Fergus 架构和 GoogLeNet 风格的 Inception 模型。
FaceNet是一个通用框架,可以用于人脸验证(Face Verification)、人脸识别(Face Recognition)、人脸聚类(Face Clustring)
任务 | 解释 | Embedding空间任务 |
---|---|---|
Face Verification | 两张脸是同一个人吗 | 距离是否超过阈值 |
Face Recognition | 这张脸是谁的 | kNN |
Face Clustering | 找出相似的人 | kMeans |
Finding Tiny Faces with GAN(【CVPR 2018】)
//TODO
Masked Face Recgonition with latent part(【ACM MM 2020】)
//TODO
MagFace(【CVPR 2020 Oral】)
//TODO