基于MMOD方法的人脸识别模型

基于MMOD方法的人脸识别模型

摘要: 大多数物体检测方法通过将二元分类器应用于图像的子窗口,然后进行非极大抑制,消除重叠子窗口上的检测结果。通常子窗口数量非常庞大,因此分类器通常仅从子窗口的子集中学习,这会导致次优的检测器性能。本文的介绍了一种新方法,最大间隔物体检测(MMOD),用于学习在图像中检测物体。该方法不执行任何子采样,而是优化所有子窗口,解决了传统方法没有充分利用训练数据,仅能找到次优解的问题。本文介绍了MMOD方法的基本原理,并测试了MMOD-CNN人脸检测器和HOG+线性SVM人脸检测器在检测新数据集中的性能,证明了MMOD方法的优越性。

关键词:目标检测、MMOD方法、子窗口、ROC

  • 引言

1.1本文主要内容

本文主要介绍了《Max-Margin Object Detection》论文中所提出的最大间隔物体检测(MMOD)方法的原理,介绍了MMOD算法的原理以及相对于传统算法的优点,并用MMOD-CNN人脸检测器和HOG+线性SVM人脸检测器在FERET,Colorferet数据集上进行了测试,证明了MMOD方法的优越性。其中主要完成了MMOD算法理论的推导、测试数据集的收集与选取和两种检测器在数据集上的测试比较工作。

1.2 本文章节安排

本文共分为四章,其中各个章节的主要内容如下。

第一章为引言,介绍了本文主要的研究内容和行文组织结构。

第二章为问题的提出,介绍目标检测的基本情况。

第三章为最大间隔物体检测(MMOD)方法的原理。

第四章为MMOD-CNN与HOG+线性SVM的测试比较。

第五章介绍了本学期对《机器学习》这门课的学习与体会。

  • 问题的提出

目标检测在日常生活中已经有了广泛的应用,如人脸识别、智慧交通等。其中人脸识别在日常生活中的应用种类丰富,人脸识别门禁就是一个很好的例子,在上海大学等高校都有实际的应用,大大放便人们的日常生活。可见,目标检测和人们生活息息相关,是非常重要的研究对象。

目标检测归根到底是对图像的检测,那对于一张图片,计算机可以如何理解呢?根据任务的需要,有图1中所示三个主要的层次:

图1:机器理解图像的三个层次

一是分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是最权威的评测集,每年的ILSVRC催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务。

二是检测(Detection)。分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得该目标的类别信息和位置信息(classification + localization)。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。

三是分割(Segmentation)。分割包括语义分割和实例分割,前者是对前背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。  

    为了实现不同的要求,开发出了不同的算法,其中R-CNN就是早期实现目标检测的算法,它在VOC 2007测试集上mAP达到了58.5%,打败当时所有的目标检测算法。R-CNN算法的基本流程如下所示:

1.预训练模型。选择一个预训练神经网络。

2.重新训练全连接层。使用需要检测的目标重新训练,最后全连接层。

3.提取 proposals并计算CNN 特征。利用选择性搜索算法提取所有proposals(大约2000幅images),调整它们成固定大小,以满足 CNN输入要求,然后将feature map 保存到本地磁盘。

4.训练SVM。利用feature map 训练SVM来对目标和背景进行分类,需要对每个类分配一个二进制SVM。

5.边界框回归。训练将输出一些校正因子的线性回归分类器。

    当然,作为一个早期的算法它也有不少缺点,如

1.重复计算,每个region proposal,都需要经过一个AlexNet特征提取,为所有的RoI提取特征大约花费47秒,占用空间。

2.selective search方法生成region proposal,对一帧图像,需要花费2秒

3.三个模块是分别训练的,并且在训练时候,对于存储空间消耗较大

    R-CNN方法是2013被提出的,优缺点都比较明显,问题已经提出,亟待人们去解决。当时有许多人都致力于对其的改进,本文所引用的《Max-Margin Object Detection》就是在2015年提出MMOD方法对R-CNN方法进行了改进。

  • 最大间隔物体检测(MMOD)方法的原理


在目标检测过程中要确定目标在图片中的位置,因此我们需要将图片分成许多个子区域,并用模型检测子区域中目标存在的情况。如果置信度很高,我们就相信目标在这个子区域内,并用方框标出。因此就会衍生出两个问题,一个是子区域怎么选择,一个是当多个子区域都通过了模型检测时,选择哪个子区域。常见的子区域选取采用滑动窗口技术,其基本原理就是采用不同大小和比例的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,从而实现对整张图片的检测。如图1所示。

图1

但是这个方法有个致命的缺点,就是不知道要检测的目标大小是什么规模,所以要设置不同大小和比例的窗口去滑动,并且还要选取合适的步长。这样就会产生很多的子区域,如果这些子区域都要经过模型去做预测,就需要很大的计算量,为了确保分类的速度,常用的解决方法是选取子区域中的一个子集,只对这个子集进行检测。这样虽然提高了分类的速度,但是减少了检测的子区域,会导致检测器性能并不能达到最优。

本文的MMOD方法就解决了上述问题,MMOD方法对子区域不进行任何子集的选取,而是选择优化所有子窗口。并且MMOD算法的公式中推导出了一个凸优化问题,因此MMOD算法是一个可以找到全局最优解的算法。

接下来介绍MMOD算法的具体思路。


对于一张图片,首先将其分成许多个子区域,使用 r 来表示图像的子区域,并用 R 表示目标检测系统扫描的所有矩形区域的集合。为了能够使用非极大值抑制的方法,会对部分子区域进行标记,如果有一种标记方式使得标记的每个元素都“不重叠”于彼此,就定义其为有效标记,可见一个图像的有效标记是 R 的子集。接下来定义元素的“不重叠”:如果矩形 r1 和 r2 的交集面积与总面积的比值小于 0.5,则矩形 r1 和 r2 不重叠。用数学公式表示为


最后,我们使用 Y 来表示所有有效标记的集合。因此,对于一个给定的图像 x 和窗口评分函数 f,我们可以将目标检测过程定义为

也就是说,


对于所有有效标记的集合Y,我们想找到其中的一种有效标记,使得它具有最大分数。这通常是通过贪婪排名方法来完成的,如算法 1 所示。

现在怎么找到一个理想的窗口评分函数成了一个新的问题,我们想要该函数在算法 1 的实际使用中能够同时减少误报和没有检测到具有最大分数的有效标记的次数。


还需要注意到一点,精确解决方程(2)在计算上是不可行的。因此,该算法并不总是找到(2)的最优解。图 1 中显示了导致次优结果的示例。但是这种次优行为并不会导致困难。接下来将提供一种能够找到适用于算法 1 的适当窗口评分函数的优化算法。

图 1. 三个滑动窗口及其 f 分数。假设非极大值抑制会拒绝任何相接触的矩形。那么最佳探测器将选择两个外部矩形,总分为 12,而贪婪探测器将选择中心矩形,总分仅为 7。


在这项工作中,我们只考虑线性参数的窗口评分函数。特别地,我们使用形式为下图的函数


其中 φ 是从图像 x 的滑动窗口位置 r 所提取的特征向量,w 是参数向量。如果我们将一组矩形 y 的窗口得分总和表示为 F(x, y),那么方程 (2) 就变为


然后,需要寻找一个参数向量 w,它能够导致最少的检测错误。也就是说,给定一个随机选择的图像和标签对 (xi, yi) ∈ X × Y,我们希望对 xi 的正确标记的得分大于所有不正确标记的得分。因此,应尽可能经常满足方程(5)。


我们的算法接受图像集合 {x1, x2, ..., xn} ⊂ X 和相关标签集合 {y1, y2, ..., yn} ⊂ Y,并尝试找到一个 w ,使得检测器在每个训练样本上都能做出正确的预测。我们采用最大间隔方法,要求每个训练样本的标签都以较大的间隔被正确预测。这就导致了以下凸优化问题:


其中 △(y, yi) 表示在真实标签为 yi 时预测标签为 y 的损失。特别地,我们定义损失为

其中 Lmiss 和 Lfa 分别在控制高召回率和高精确度起到重要性作用。


方程 (6) 是我们问题的硬间隔形式,但是由于真实世界的数据通常存在噪声,并不是完全可分的,也可能包含异常值,因此我们将其扩展为软间隔设置。在这样做的过程中,我们得到了最大间隔目标检测(MMOD)的定义优化:

在这种设置下,C 类似于通常的支持向量机参数,控制着试图拟合训练数据或获得较大间隔之间的权衡。


考虑每个 ξi 都是由训练样本 (xi, yi) 引起的损失的上界,我们可以通过如下公式来理解。

从(9)到(10)的步骤中,我们用特定元素 g(xi) 替换了 Y 的最大值。因此,不等式仍然成立。从(10)到(11)的步骤中,我们注意到 F(xi, g(xi)) − F(xi, yi) ≥ 0,因为根据定义g(xi)是使 F(xi, ·) 最大化的 Y 中的元素。


因此,由方程(8)定义的 MMOD 目标函数是每个训练图像的平均损失的凸上界.

这意味着,例如,如果方程(8)中的 ξi 被近似为零,那么检测器将保证能够从相应的训练样本中产生正确的输出。

这种最大间隔方法已经成功地应用在许多其他领域。一个例子是隐马尔可夫支持向量机 ,它在序列标记任务上取得了最先进的结果。


接下来将使用切割平面方法来解决由方程(8)定义的最大间隔目标检测优化问题。需要注意的是,MMOD等价于以下无约束问题:


其中Remp(w)是


注意到 Remp 是有关 w 的凸函数,因此它受到任何切线平面的下界限制。切割平面方法利用这一点来找到 J 的最小化检测器。它通过构建逐渐精确的下界逼近来实现这一点,这些逼近是由切线平面构成的。算法的每一步都找到一个新的 w,使得这个逼近达到最小值。然后它获得 Remp 在 w 处的切线平面,并将这个新平面合并到下界函数中,从而收紧逼近。该过程的示意图如图2所示。

图2. 红色曲线由其切线平面下界决定。由绿线表示的切线平面进一步收紧了下界。


让∂Remp(wt)表示点wt处Remp的梯度。然后在wt处的Remp的切线平面由以下方程给出:


考虑到这些情况,我们使用的下界逼近是

其中P是下界平面集,即“切割平面”。


该方法的伪代码显示在算法2中。如下图所示


它不断执行直到真实MMOD目标函数与下界之间的差距小于ε。这将确保收敛到最优的w*小于ε。也就是说,我们将在算法2终止时有


算法2的关键步骤是解决第7步的argmin。这个子问题可以写成一个二次规划问题,并可以使用标准方法高效地解决。在这里推导了一个简单的二次规划求解器,首先将第7步写成一个二次规划问题,得到


其中w的数量通常比上述问题中的约束数量更多。因此,求解该问题的对偶问题将更加高效。由于Lagrangian函数是

因此,该二次规划的对偶问题是


经过一些运算,对偶问题可以简化为如下形式

其中λ和b是λi和bi的列向量,并且Qij=<ai,aj>。


使用普拉特的顺序极小值的简化变体来求解对偶二次规划的优化方法。如算法3所示。

算法3包含伪代码。在每次迭代中,将选择最违反KKT条件的拉格朗日乘子对(λb,λl),然后对选定的拉格朗日乘子对进行优化。当对偶间隙小于一个阈值时,求解器的运行才会中止。


在求解最佳λ*后,算法2的第7步所需的wt为


计算收敛测试所需的minw K(w)的值可以方便地计算为

在这时有一些有用的技巧。尤其是应该使用前一次MMOD优化器迭代的 λ 来初始化起始λ。此外,切割平面通常在少数迭代后变为非活动状态,如果一个切割平面连续20次迭代处于非活动状态,那么我们就将它移除。

算法的最后一个部分是计算Remp及其次梯度的方法。回想一下,F(x, y)和Remp为


然后,Remp的次梯度表示为


条件是


我们y*计算的方法如算法4所示。

它是对算法1中正常的目标检测过程的改进,可以用于解决方程(29)而不是方程(2)。因此,算法4的任务是找到一组矩形,它们有最大化总检测分数和损失。

有两种情况需要考虑。首先,如果一个矩形没有命中任何真实矩形,则每当其分数加上Lfa损失为正时,它对方程(29)中的argmax产生积极贡献。其次,如果一个矩形命中了一个真实矩形,那么我们推理如下:如果我们拒绝第一个匹配匹配到的一个真实矩形,由于矩形按得分降序排序,我们将拒绝所有其他匹配它的矩形。这种结果会产生Lmiss的一个单一值。另外,如果我们接受第一个与真实矩形匹配的矩形,就会得到它的检测得分。此外,我们可能还会从后续的重复检测中获得额外的分数,每个重复检测都会贡献其窗口评分函数的值加上Lfa。因此,算法4将会计算接受情况的总分,并将其与Lmiss进行比较。然后选择具有最大值的结果。在伪代码中,这些分数被累积到sr变量中。

这个算法属于贪婪算法,因此可能无法找到符合方程(29)的最优y∗i。但是它的贪婪性与算法1的检测方法非常相似。此外,我们的目标是找到一组能够使算法1表现良好的参数,因此我们应该使用一种遵守优化算法特性的训练程序。例如,如果在图1的情况下,正确的输出是选择两侧的方框,那么算法1会犯一个错误,而一个最优的方法不会。因此,学习程序要考虑到这一点,并学会在这种情况下,如果算法1要产生正确的输出,两侧的矩形需要比中间的矩形得分更高。最终,算法4只需要给出一个Remp的值,它能够限制每个训练图像的平均损失。

  • MMOD-CNNHOG+线性SVM的测试比较。


为了测试MMOD的有效性,作者在FERET,Colorferet数据集上进行评估。为了保证评估效果的普遍性,作者特意将图片进行了分类,将图片分成了三类,第一类,可能有1人,明显无2人;第二类,可能有2人,明显无3人;第三类可能有3人三人以上。分别示例如下:

第一类                              第二类                                                  第三类

        测试的内容有三个方面,分别是小样本检测MOD-CNN与HOG+线性SVM在检测侧脸时的表现,计算MOD-CNN与HOG+线性SVM检测多张图片所花的平均时间,计算MOD-CNN与HOG+线性SVM检测多张图片的ROC。

  1. 检测MOD-CNN与HOG+线性SVM在检测侧脸时的表现

在日常生活中,所拍摄到的照片有不少都是侧脸,侧脸的检测难度又要高于正脸,因此检测侧脸的能力时是判断模型优劣的关键一环。

这是用HOG检测。

这是MMOD检测。

在这里插入图片描述

        笔者特别选取了20张包含侧脸的图片让MOD-CNN与HOG+线性SVM分别检测,结果是MOD-CNN选择正确了17张,HOG选择正确了12张,可见MOD-CNN检测侧脸的能力强于HOG。

  1. 计算MOD-CNN与HOG+线性SVM在检测过程中所化的时间

检测速度也是判断检测器性能的重要一环

为了确定HOG描述符对应的视觉词,许多研究人员计算其到每个bin的样本的距离,并将向量分配给最近的bin。然而,这是计算昂贵的,所以我们使用一种快速的近似方法来确定bin的分配。具体而言,我们使用基于随机投影的局部敏感哈希[7]。这是通过使用11个随机平面来实现的。HOG向量通过记录描述其落在每个平面的哪一侧的位模式来进行哈希。然后,这个11位数表示了视觉词的bin。

最后,可以使用一组积分图像有效地实现滑动窗口分类。我们还扫描图像金字塔中的每个位置,每层都按4/5进行降采样。为了确定两个检测在非最大抑制的目的下是否重叠,我们使用方程(1)。类似地,我们使用方程(1)来确定一个检测是否命中真实框。最后,所有实验都在一台台式工作站上运行。

最后,我们在人脸检测数据集和基准(FDDB)挑战上评估了我们的方法。这个具有挑战性的数据集包含在室内和室外环境中捕捉到的人脸多种姿势的图像。为了测试MMOD,我们使用它来学习基本的HOG滑动窗口分类器。因此,特征提取器(φ)接收一个窗口,并输出描述整个窗口的HOG向量,就像Dalal和Triggs的开创性论文[3]中所做的那样。为了说明学习的模型,来自第一个FDDB折叠的HOG滤波器在图4中进行了可视化展示。

为了进行检测,这个单一的HOG滤波器在图像金字塔的每个级别上扫描图像,并在执行非最大抑制后输出通过阈值测试的窗口。通过扫描这个阈值,我们创建了一个比较学习的HOG滤波器与其他方法的ROC曲线,如图5所示。为了创建ROC曲线,我们遵循了FDDB评估协议,进行了10折交叉验证,并使用提供的FDDB评估软件将结果合并为单个ROC曲线。图6中还显示了具有检测输出的示例图像。

从图5中可以看出,通过MMOD学习的HOG滤波器在性能上远远优于通过典型的线性SVM“硬负样本挖掘”方法[12]学习的HOG滤波器,以及经典的Viola Jones方法[19]。此外,我们通过MMOD学习的单一HOG滤波器的准确性略高于Zhu的复杂可变部分模型[22]。

五、总结与体会

本学期的《机器学习》课让我第一次了解到了有于机器学习的知识,在学习的过程中,可能是因为天赋的不足,学习的比较吃力,但在胡老师的帮助下,经过几次上机课的练习,也学会了使用机器学习中的一些常见模型来对数据进行分析处理,但对其中的算法理论与代码编写还是不太了解。但在大作业中,通过对所给论文的仔细研读,对算法原理有了更加深刻的理解,所引《Max-Margin Object Detection》中所用的拉格朗日函数,KKT条件,都已经在平时的课程中学习过,却没想到将其在计算机上的实现,实在是惭愧,好在的是,经过十周的学习,《机器学习》这门课激发了我对于用计算机编程来解决现实问题的兴趣,尤其是对本文所提及的人脸识别的兴趣,在接下来的学习过程中,我会积极寻求胡老师和同学的帮助,将所学的数学知识运用到实践中,来提高自己编写算法的能力,以求制作出更好的人脸识别模型。本文也将放到CSDN上,贡献自己的研究成功,也让自己在大家的批评中改进。

参考文献:

[1] King, Davis E. Max-Margin Object Detection. In arXiv:1502.00046 [cs.CV] ,2015.

[2] Y. Altun, I. Tsochantaridis, and T. Hofmann. Hidden markov support vector machines. In International Conference on Machine Learning (ICML), 2003.

[3] M. B. Blaschko and C. H. Lampert. Learning to localize objects with structured output regression. In European Conference on Computer Vision (ECCV), 2008.

[4] N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. In Computer Vision and Pattern Recognition (CVPR), pages 886–893, 2005.

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PCA算法是一种常见的数据分析和降维方法,被广泛应用于图像和人脸识别领域。ORL人脸数据库是一个常用的人脸识别测试集,其中包含400张人脸图像,每张图像大小为112x92像素。下面我将介绍基于PCA算法和ORL人脸数据库的Matlab代码实现。 首先,我们需要导入ORL人脸数据库。可以使用Matlab内置的imread函数读取图像文件。然后将图像数据转换为向量,并将所有向量堆叠成一个矩阵。 ``` ORL_path = 'path/to/ORL/database'; % ORL数据库路径 img_num = 400; % 图像数量 width = 92; % 图像宽度 height = 112; % 图像高度 X = zeros(img_num, width*height); % 初始化图像矩阵 % 读取所有图像文件,并将图像数据转换为向量 for i=1:img_num img_file = fullfile(ORL_path, sprintf('s%d/%d.pgm', floor((i-1)/10)+1, mod(i-1, 10)+1)); img = double(imread(img_file)); X(i,:) = img(:)'; end ``` 接下来,我们将对图像数据进行降维处理。首先需要求出数据矩阵的均值向量,然后计算数据的协方差矩阵,并对其进行特征值分解。特征向量即为我们所需的主成分。 ``` % 求出数据矩阵的均值向量 mean_vec = mean(X); % 将数据矩阵的每一行都减去均值向量 X = X - repmat(mean_vec, img_num, 1); % 计算协方差矩阵 cov_mat = X*X'/(img_num-1); % 对协方差矩阵进行特征值分解 [pcs, eigvals] = eig(cov_mat); ``` 我们可以画出所有特征向量的图像,以便观察主成分的质量及所占比例。 ``` % 显示前20个特征向量对应的图像 figure; for i=1:20 subplot(4,5,i); imshow(reshape(pcs(:,end-i+1)', height, width), []); title(sprintf('PC%d', i)); end ``` 接着,我们可以根据所需的维数选择主成分,并计算出每幅人脸图像在这些主成分上的投影值,即为特征向量。 ``` % 选择前k个特征向量,即前k个主成分 k = 50; % 计算每幅人脸图像在k个主成分上的投影值,即为特征向量 features = X'*pcs(:,end-k+1:end); ``` 最后,我们可以对新的人脸图像进行识别。对于给定的未知人脸图像,将其转换为特征向量,并计算其与数据库中所有人脸图像的欧氏距离。距离最小的图像即为最接近的匹配数据。 ``` % 加载未知人脸图像 unknown_img = double(imread('path/to/unknown/image.pgm')); unknown_vec = unknown_img(:)'; % 将未知人脸图像减去均值向量并投影到k个主成分上,得到特征向量 unknown_feat = (unknown_vec-mean_vec)*pcs(:,end-k+1:end); % 求出每个数据库图像与未知人脸图像的距离 distances = sum((features-repmat(unknown_feat, img_num, 1)).^2, 2); % 找到距离最小的图像,即为最接近的匹配数据 [min_dist, match_idx] = min(distances); % 显示匹配结果 figure; subplot(1,2,1); imshow(unknown_img,[]); title('Unknown image'); subplot(1,2,2); imshow(reshape(X(match_idx,:), height, width), []); title(sprintf('Matched image (dist=%.2f)', min_dist)); ``` 以上代码仅为简化版示例,实际应用中需要进行更多的优化和改进。例如,可以使用更先进的算法来提高识别的精度和速度,或者对数据库中的图像进行预处理、去噪等操作以提高质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值