机器学习 人脸配对

机器学习是人工智能(AI)的一个子领域,它的目标是开发和应用算法让计算机可以从数据中学习,进而做出预测或决策,而不是遵循严格的静态程序指令。

机器学习基础

1.监督学习:在这种类型的学习中,模型从标记的训练数据中学习。标记的数据意味着每个数据样本都有一个明确的输出或标签与之相关联。

想象你正在学习如何区分猫和狗。有人给你一堆图片,每张图片上都写着是猫还是狗。你通过观察这些带有标签的图片,学习到了猫和狗的特征(例如,猫通常有尖尖的耳朵和长尾巴,而狗的鼻子通常更长一些)。然后,当你看到一张没有标签的图片时,你可以根据你学到的知识来判断这是一只猫还是一只狗。这就是监督学习的过程。

2.无监督学习:在这种类型的学习中,模型从未标记的数据中学习。这意味着训练数据没有预先定义的标签。

现在想象你有一堆水果,但没有任何标签告诉你它们是什么。你可以根据它们的形状、颜色、大小等特征将它们分组。例如,你可能会将所有的红色和圆形的水果放在一起,这可能就是苹果。这就是无监督学习的过程,你没有预先的标签,而是根据数据的内在结构和相似性来发现模式。

3.半监督学习:这是监督学习和无监督学习的混合。在这种情况下,部分数据被标记,部分数据未被标记。这种方法通常在标记数据稀缺或获取标记数据的成本很高的情况下使用。

这是监督学习和无监督学习的结合。想象你有一堆水果的图片,其中一些有标签(例如,这是苹果,那是香蕉),但其他的没有。你可以先学习那些带标签的图片,然后尝试将你学到的知识应用到那些没有标签的图片上,看看它们可能是什么。

4.强化学习:在这种类型的学习中,智能体(agent)通过与环境的交互来学习。智能体在每个时间步骤选择一个动作,环境根据选择的动作给出奖励(正面或负面)。通过这种方式,智能体学习了一个策略,以最大化从环境中获得的总奖励。

想象你正在玩一个电子游戏,比如超级马里奥。你控制马里奥跳跃和移动,试图避开敌人,收集硬币,达到终点。开始时,你可能不知道怎么玩,所以你会失败很多次。但是每次你碰到敌人或者掉入陷阱时,你都会学到一些东西(负面奖励),并尝试在下次避开它们。当你成功收集硬币或者达到终点时,你也会学到一些东西(正面奖励)。通过这种方式,你逐渐学习了如何更好地玩这个游戏。这就是强化学习的过程,你通过与环境的交互(在这个例子中是游戏)来学习如何做出最好的决策。

深度学习基础

1.介绍深度学习:深度学习是机器学习的一个子领域,它试图模仿人脑的工作方式,通过训练大量的数据来自动学习数据的内在规律和表示层次。"深度"在这里指的是模型的层数,深度学习模型通常由多个层次的模型(或称为神经网络)组成,每一层都从前一层学习到的信息中提取更高级的特征。

2.神经网络和反向传播:神经网络是深度学习的基础,它由许多的"神经元"(或称为节点)组成,这些神经元按层次排列。每个神经元接收来自前一层神经元的输入,进行一些计算,然后将结果传递给下一层的神经元。反向传播是一种有效的算法,用于在神经网络中调整权重,以便更好地预测目标变量。你可以将其想象成一个试错的过程:首先,网络尝试做出预测,然后看看预测有多糟糕(即误差有多大),然后它会尝试减少这个误差。

3.激活函数:激活函数在神经网络中起到非常重要的作用,它们决定了一个神经元是否应该被"激活",以及以多大的强度激活。这就像你的大脑工作的方式:只有当某种刺激足够强时,神经元才会激活。常见的激活函数包括 Sigmoid、ReLU(Rectified Linear Unit)和 Tanh。

4.深度学习框架(例如 TensorFlow 或 PyTorch):深度学习框架就像是用于构建和训练神经网络的工具箱。它们提供了许多预先编写的函数和工具,使得创建和训练神经网络变得更加容易。TensorFlow 和 PyTorch 是两个非常流行的深度学习框架,它们都有大量的文档和社区支持。

卷积神经网络(CNN)

1.介绍卷积神经网络:卷积神经网络(CNN)是一种特殊类型的深度学习模型,它特别适合处理网格形状的数据,如图像(2D网格像素)和时间序列数据(1D网格)。CNN的特点是它可以自动学习输入数据的有用特征,这使得它在图像识别和处理等任务中非常有效。

2.卷积、池化和全连接层:

1)卷积层:卷积层是CNN的核心。你可以将卷积看作是一个滤波器或检测器,它在图像上滑动,寻找特定的视觉特征,如边缘、颜色或纹理。例如,一个卷积滤波器可能会专门寻找垂直边缘,而另一个滤波器可能会寻找特定的颜色。
2)池化层:池化层通常跟在卷积层后面,它的主要目的是减少数据的维度(即降低计算复杂性),同时保留最重要的信息。最常见的池化操作是最大池化,它只保留每个小区域内的最大值。
3)全连接层:全连接层通常在CNN的最后,它将前面的所有特征连接起来,并输出最终的分类结果。例如,在一个猫狗分类器中,全连接层可能会接收到关于图像中是否有耳朵、鼻子、尾巴等特征的信息,然后决定这个图像更可能是猫还是狗。

增加卷积层 tf.keras.layers.Conv2D() -- 增强提取特征的能力
增加池化层 tf.keras.layers.MaxPooling2D() -- 使得模型的视野变大
Dropout层 tf.keras.layers.Dropout() -- 抑制过拟合(当发现模型过拟合的时候再添加,不然可能会影响正常拟合正确率)
全连接层   tf.keras.layers.Dense(10, activation='softmax') -- 最终输出预测结果

当计算机看到一张图像(输入一张图像)时,它看的是一大堆像素值。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oI1mnipI-1684657447441)(attachment:image.png)]

现在的问题是:当你提供给计算机这一数组后,它将输出描述该图像属于某一特定分类的概率的数字(比如:80% 是猫、15% 是狗、5%是鸟)。

我们人类是通过特征来区分猫和狗,现在想要计算机能够区分开猫和狗图片,就要计算机搞清楚猫猫狗狗各自的特有特征。计算机可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层级建构出更为抽象的概念。这是 CNN(卷积神经网络)工作方式的大体概述。

什么是卷积?
卷积是指将卷积核应用到某个张量的所有点上,通过将卷积核在输入的张量上滑动而生成经过滤波处理的张量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wS3C1m7-1684657447442)(attachment:image.png)]

人脸识别

1.人脸检测:人脸检测是人脸识别的第一步,它的目标是在图像中找到所有的人脸。这就像在一张拥挤的照片中找到所有的人脸。Haar cascades和MTCNN(多任务级联卷积网络)是两种常用的人脸检测方法。

2.人脸对齐:人脸对齐是调整检测到的人脸的位置和角度,使其与预定义的模板对齐。这就像你在拍照时调整你的脸,使其正对着相机。人脸对齐可以帮助提高人脸识别的准确性,因为它减少了由于头部姿势变化引起的变化。

3.特征提取:特征提取是从对齐的人脸中提取有用的信息,这些信息可以用来区分不同的人。这就像你注意到你的朋友的特征,如眼睛的颜色,鼻子的形状,或者他们的笑容。在深度学习中,我们通常使用预训练的卷积神经网络(CNN)来自动提取特征。

4.人脸识别:人脸识别是根据提取的特征来识别人脸的身份。这就像你根据你记住的朋友的特征来识别他们。常用的方法包括支持向量机(SVM)和softmax分类器。

5.人脸验证和人脸识别的区别:人脸验证是一对一的比较,目标是验证一个人脸是否是特定的人。例如,当你使用面部解锁你的手机时,你的手机正在验证你的脸是否是它存储的你的脸。而人脸识别是一对多的比较,目标是确定一个人脸在一个数据库中的身份。例如,一个监控系统可能会使用人脸识别来确定一个人是否在犯罪嫌疑人的数据库中。

6.深度度量学习和人脸识别:深度度量学习是一种方法,它学习一个距离函数,使得同一个人的不同图片之间的距离小,而不同人的图片之间的距离大。这就像你可以很容易地识别你的朋友,即使他们换了发型或穿了不同的衣服,因为你知道哪些特征更重要(例如,脸的形状或眼睛的颜色),哪些特征不那么重要(例如,发型或衣服)。Triplet Loss是一种常用的深度度量学习方法,它每次考虑三个样本:一个锚点(anchor),一个正样本(positive,与锚点是同一个人的另一张图片),和一个负样本(negative,与锚点不是同一个人的图片)。Triplet Loss的目标是使锚点和正样本之间的距离小于锚点和负样本之间的距离。

当被部署在无约束条件的环境中时,由于人脸图像在现实世界中的呈现具有高度的可变性(这类人脸图像通常被称为自然人脸(faces in-the-wild)),所以人脸识别也是最有挑战性的生物识别方法之一。人脸图像可变的地方包括头部姿势、年龄、遮挡、光照条件和人脸表情。图 1 给出了这些情况的示例。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JG3Kadxt-1684657447443)(attachment:image.png)]

主成分分析

线性判别分析

人脸识别系统通常由以下构建模块组成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvHcZpRX-1684657447444)(attachment:image-2.png)]

很多人认为人脸表征是人脸识别系统中最重要的组件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rO8aylz5-1684657447445)(attachment:image-3.png)]

深度学习方法

卷积神经网络(CNN)是人脸识别方面最常用的一类深度学习方法。深度学习方法的主要优势是可用大量数据来训练,从而学到对训练数据中出现的变化情况稳健的人脸表征。这种方法不需要设计对不同类型的类内差异(比如光照、姿势、面部表情、年龄等)稳健的特定特征,而是可以从训练数据中学到它们。深度学习方法的主要短板是它们需要使用非常大的数据集来训练,而且这些数据集中需要包含足够的变化,从而可以泛化到未曾见过的样本上。幸运的是,一些包含自然人脸图像的大规模人脸数据集已被公开 [9-15],可被用来训练 CNN 模型。除了学习判别特征,神经网络还可以降维,并可被训练成分类器或使用度量学习方法。CNN 被认为是端到端可训练的系统,无需与任何其它特定方法结合。

用于人脸识别的 CNN 模型可以使用不同的方法来训练。其中之一是将该问题当作是一个分类问题,训练集中的每个主体都对应一个类别。训练完之后,可以通过去除分类层并将之前层的特征用作人脸表征而将该模型用于识别不存在于训练集中的主体 [99]。在深度学习文献中,这些特征通常被称为瓶颈特征(bottleneck features)。在这第一个训练阶段之后,该模型可以使用其它技术来进一步训练,以为目标应用优化瓶颈特征(比如使用联合贝叶斯 [9] 或使用一个不同的损失函数来微调该 CNN 模型 [10])。另一种学习人脸表征的常用方法是通过优化配对的人脸 [100,101] 或人脸三元组 [102] 之间的距离度量来直接学习瓶颈特征。

自组织映射

上面提到的方法都未能取得突破性的成果,主要原因是使用了能力不足的网络,且训练时能用的数据集也相对较小。直到这些模型得到扩展并使用大量数据 [107] 训练后,用于人脸识别的首个深度学习方法 [99,9] 才达到了当前最佳水平。尤其值得一提的是 Facebook 的 DeepFace [99],这是最早的用于人脸识别的 CNN 方法之一,其使用了一个能力很强的模型,在 LFW 基准上实现了 97.35% 的准确度,将之前最佳表现的错误率降低了 27%。研究者使用 softmax 损失和一个包含 440 万张人脸(来自 4030 个主体)的数据集训练了一个 CNN。本论文有两个全新的贡献:(1)一个基于明确的 3D 人脸建模的高效的人脸对齐系统;(2)一个包含局部连接的层的 CNN 架构 [108,109],这些层不同于常规的卷积层,可以从图像中的每个区域学到不同的特征。在那同时,DeepID 系统 [9] 通过在图块(patch)上训练 60 个不同的 CNN 而得到了相近的结果,这些图块包含十个区域、三种比例以及 RGB 或灰度通道。在测试阶段,会从每个图块提取出 160 个瓶颈特征,加上其水平翻转后的情况,可形成一个 19200 维的特征向量(160×2×60)。类似于 [99],新提出的 CNN 架构也使用了局部连接的层。其验证结果是通过在这种由 CNN 提取出的 19200 维特征向量上训练一个联合贝叶斯分类器 [48] 得到的。训练该系统所使用的数据集包含 202599 张人脸图像,来自 10177 位名人 [9]。

对于基于 CNN 的人脸识别方法,影响准确度的因素主要有三个:训练数据、CNN 架构和损失函数。因为在大多数深度学习应用中,都需要大训练集来防止过拟合。一般而言,为分类任务训练的 CNN 的准确度会随每类的样本数量的增长而提升。这是因为当类内差异更多时,CNN 模型能够学习到更稳健的特征。但是,对于人脸识别,我们感兴趣的是提取出能够泛化到训练集中未曾出现过的主体上的特征。因此,用于人脸识别的数据集还需要包含大量主体,这样模型也能学习到更多类间差异。[110] 研究了数据集中主体的数量对人脸识别准确度的影响。在这项研究中,首先以降序形式按照每个主体的图像数量对一个大数据集进行了排序。然后,研究者通过逐渐增大主体数量而使用训练数据的不同子集训练了一个 CNN。当使用了图像数量最多的 10000 个主体进行训练时,得到的准确度是最高的。增加更多主体会降低准确度,因为每个额外主体可用的图像非常少。另一项研究 [111] 研究了更宽度的数据集更好,还是更深度的数据集更好(如果一个数据集包含更多主体,则认为它更宽;类似地,如果每个主体包含的图像更多,则认为它更深)。这项研究总结到:如果图像数量相等,则更宽的数据集能得到更好的准确度。研究者认为这是因为更宽度的数据集包含更多类间差异,因而能更好地泛化到未曾见过的主体上。表 1 展示了某些最常用于训练人脸识别 CNN 的公开数据集。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9VWTLPQ-1684657447446)(attachment:image-4.png)]

用于人脸识别的 CNN 架构从那些在 ImageNet 大规模视觉识别挑战赛(ILSVRC)上表现优异的架构上取得了很多灵感。举个例子,[11] 中使用了一个带有 16 层的 VGG 网络 [112] 版本,[10] 中则使用了一个相似但更小的网络。[102] 中探索了两种不同类型的 CNN 架构:VGG 风格的网络 [112] 和 GoogleNet 风格的网络 [113]。即使这两种网络实现了相当的准确度,但 GoogleNet 风格的网络的参数数量少 20 倍。更近段时间,残差网络(ResNet)[114] 已经成为了很多目标识别任务的最受偏爱的选择,其中包括人脸识别 [115-121]。ResNet 的主要创新点是引入了一种使用捷径连接的构建模块来学习残差映射,如图 7 所示。捷径连接的使用能让研究者训练更深度的架构,因为它们有助于跨层的信息流动。[121] 对不同的 CNN 架构进行了全面的研究。在准确度、速度和模型大小之间的最佳权衡是使用带有一个残差模块(类似于 [122] 中提出的那种)的 100 层 ResNet 得到的。

选择用于训练 CNN 方法的损失函数已经成为近来人脸识别最活跃的研究领域。即使使用 softmax 损失训练的 CNN 已经非常成功 [99,9,10,123],但也有研究者认为使用这种损失函数无法很好地泛化到训练集中未出现过的主体上。这是因为 softmax 损失有助于学习能增大类间差异的特征(以便在训练集中区别不同的类),但不一定会降低类内差异。研究者已经提出了一些能缓解这一问题的方法。优化瓶颈特征的一种简单方法是使用判别式子空间方法,比如联合贝叶斯 [48],就像 [9,124,125,126,10,127] 中所做的那样。另一种方法是使用度量学习。比如,[100,101] 中使用了配对的对比损失来作为唯一的监督信号,[124-126] 中还结合使用了分类损失。人脸识别方面最常用的度量学习方法是三元组损失函数 [128],最早在 [102] 中被用于人脸识别任务。三元组损失的目标是以一定余量分开正例对之间的距离和负例对之间的距离。从数学形式上讲,对于每个三元组 i,需要满足以下条件 [102]:

其中 x_a 是锚图像,x_p 是同一主体的图像,x_n 是另一个不同主体的图像,f 是模型学习到的映射关系,α 施加在正例对和负例对距离之间的余量。在实践中,使用三元组损失训练的 CNN 的收敛速度比使用 softmax 的慢,这是因为需要大量三元组(或对比损失中的配对)才能覆盖整个训练集。尽管这个问题可以通过在训练阶段选择困难的三元组(即违反余量条件的三元组)来缓解 [102],但常见的做法是在第一个训练阶段使用 softmax 损失训练,在第二个训练阶段使用三元组损失来对瓶颈特征进行调整 [11,129,130]。研究者们已经提出了三元组损失的一些变体。比如 [129] 中使用了点积作为相似度度量,而不是欧几里德距离;[130] 中提出了一种概率式三元组损失;[131,132] 中提出了一种修改版的三元组损失,它也能最小化正例和负例分数分布的标准差。用于学习判别特征的另一种损失函数是 [133] 中提出的中心损失(centre loss)。中心损失的目标是最小化瓶颈特征与它们对应类别的中心之间的距离。通过使用 softmax 损失和中心损失进行联合训练,结果表明 CNN 学习到的特征能够有效增大类间差异(softmax 损失)和降低类内个体差异(中心损失)。相比于对比损失和三元组损失,中心损失的优点是更高效和更容易实现,因为它不需要在训练过程中构建配对或三元组。另一种相关的度量学习方法是 [134] 中提出的范围损失(range loss),这是为改善使用不平衡数据集的训练而提出的。范围损失有两个组件。类内的损失组件是最小化同一类样本之间的 k-最大距离,而类间的损失组件是最大化每个训练批中最近的两个类中心之间的距离。通过使用这些极端案例,范围损失为每个类都使用同样的信息,而不管每个类别中有多少样本可用。类似于中心损失,范围损失需要与 softmax 损失结合起来以避免损失降至零 [133]。

当结合不同的损失函数时,会出现一个困难,即寻找每一项之间的正确平衡。最近一段时间,已有研究者提出了几种修改 softmax 损失的方法,这样它无需与其它损失结合也能学习判别特征。一种已被证明可以增加瓶颈特征的判别能力的方法是特征归一化 [115,118]。比如,[115] 提出归一化特征以具有单位 L2 范数,[118] 提出归一化特征以具有零均值和单位方差。一个成功的方法已经在 softmax 损失中每类之间的决策边界中引入了一个余量 [135]。为了简单,我们介绍一下使用 softmax 损失进行二元分类的情况。在这种情况下,每类之间的决策边界(如果偏置为零)可由下式给定:

其中 x 是特征向量,W_1 和 W_2 是对应每类的权重,θ_1 和 θ_2 是 x 分别与 W_1 和 W_2 之间的角度。通过在上式中引入一个乘法余量,这两个决策边界可以变得更加严格:

如图 8 所示,这个余量可以有效地增大类别之间的区分程度以及各自类别之内的紧凑性。根据将该余量整合进损失的方式,研究者们已经提出了多种可用方法 [116,119-121]。比如 [116] 中对权重向量进行了归一化以具有单位范数,这样使得决策边界仅取决于角度 θ_1 和 θ_2。[119,120] 中则提出了一种加性余弦余量。相比于乘法余量 [135,116],加性余量更容易实现和优化。在这项工作中,除了归一化权重向量,特征向量也如 [115] 中一样进行了归一化和比例调整。[121] 中提出了另一种加性余量,它既有 [119,120] 那样的优点,还有更好的几何解释方式,因为这个余量是加在角度上的,而不是余弦上。表 2 总结了有余量的 softmax 损失的不同变体的决策边界。这些方法是人脸识别领域的当前最佳。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值