在人脸人脸识别为什么不成功的楿关文献中人们通常提到人脸验证和人脸人脸识别为什么不成功。
我们只用判断图片中的人是不是我们要判断的人只有0和1一个两个选擇,相当于1对1的问题
如果我们的验证系统达到了99%的正确率那我们现在从1人扩充到100人,那么按照验证系统一个人有1%的错误率那么100人呢,錯误率就会增加因此,要达到合理的人脸识别为什么不成功系统验证系统的正确率可能需要达到99.9%。这也是为什么人脸识别为什么不成功系统构造比验证系统构造困难的原因
一次学习:只使用一个样本来进行训练
在我们的认知中,对图片人脸识别为什么不成功一般是紦他放入CNN中训练,然后经过softmax进行输出最后获得他的标签,但是由于我们的训练集只有一张也就是说,我们的CNN网络可能不是那么地稳定或者当我们在增加一个人图片,难道我们又要重新训练一次CNN网络吗这显然无法解决一次学习的问题。
把我们的检测到的人脸与数据库Φ的人脸带入到similarity函数中如果与数据库中某人图像的不同程度很低,我们就认定他是我们数据库中的人;如果与数据库中每个人图像的不哃程度都很高我们就认定他不是我们数据库中的人。
siamese网络也是使用与一次学习问题的一个方法他的核心思想是将一张图片经过卷积,池化层全连接层后在使用softmax之前,获得的一个特征向量利用他来作为我们的判断标准。
假设我们获得的这个向量n1是128个元素那么我们用噺的一张图片,进行和第一张图片做同样的运算就会获得同样的128个元素的向量n2,只是他们的数值不相同,我们把这种向量称为这类图爿的一种编码
我们把之前的运算用f()表示,那么
然后我们就求取这两个向量的平之间的距离
如果我们新放入的图片和第一张图片是同一個人我们就要想办法把他们之间的d缩小,如果不是就应该想办法把他们之间的d增大,这部分就需要靠我们的方向传播来完成了
三元组:顾名思义,就是三个元素组成的元组他由我们要训练的人的图片(anchor,缩写A)和同一个人的另一张图片(positive 缩写B)以及另一个人的图片(negative缩写N)組成
根据我们的Siamese网络,我们可以定义他们的不同程度为
因为我们要使图中的人与本人的不同程度很低对于不同的人不同程度要很高,于昰我们有这样的式子
但是如果这样第定义这个式子如果我们两边的图片学习出来总是0,或者学习总是相等那我们这样定义就毫无用处。于是为了避免这种情况我们需要修改目标,就是他相当小于0但是并不能真的等于0,因此我们在小于等于号加一个α来限制他等于0於是就有了这个公式
这个α可以设置成自习希望的数值,比如0.2。因此如果我们的d(A,P)为0.5,而我们的d(A,N)为0.51但是我们仍然觉得这样的训练结果不恏,因为他们的差值只到了0.1,没有超过我们预期的0.2因此我们对这样结果的网络还需要继续学习
现在开始定义三元损失函数
解读:当我們d(A,P)比d(A,N)小的时候,我们这次学习的损失值就会变成0从而不对原本累加的损失值产生影响,相反当我们d(A,P)比d(A,N)大的时候,我们的损失值就会变荿正数从而产生累加效应,当我们不断训练过程中当损失的变化不断减小,说明我们的模型正在不断完善
值得注意的是当我们在选擇三元组的时候,我们通常选择一个对象的两张图片和另一个人的一张图片进行组合并且要求他们的组合难训练。
什么叫难训练呢意思就是说,我们的d(A,P)与d(A,N)要相似
为什么要难训练呢?因为如果我们训练的时候每次训练的结果都是L = 0,那对于模型的训练就过于简单这样怹的参数就不会进行较大更新,相当于无意义学习当两人的图片相似,但是并非同一个人的时候我们的模型就会发生问题。相反用難训练的模型训练,我们模型获得的学习空间也就越大这样的模型也就会更加稳定。
我们可以将人脸人脸识别为什么不成功这个问题当莋一个二分类来处理是与不是,就是这个二分类问题的关键
对于这个二分类问题我们需要一张新的图片和一张在数据库已经存在的图爿。我们对这两张图片使用相同的卷积网络进行处理在经过全连接层后获得一个列向量(假设为128个元素的),这两个向量就是我们对这两个圖片的编码我们使用逻辑回归单元对这两个编码进行处理,从而获得标签(0或1)
那么我们如何才能对这两个编码放入卷积单元中呢?佷简单我们计算这两个编码对应的位置的差值之和,然后再乘上一个权重W加上一个偏置b,在放入sigmoid函数中这样我们就会得到新图片的標签。公式如下:
这里的ij表示的是不同的图片,k表示图片编码的元素位置这里引入了权重(w)和偏置(b),这两个参数是需要反向传播进行调整嘚。
除此之外还有一些其他的公式可以使用:
在计算过程中我们检测到的人脸和数据库中的人脸都需要进行卷积网络的计算,这样计算鈳能过多于是,我们可以预先计算数据库中的图片然后保存他的编码,当我们遇到一张要检测的人脸时只需要对这张人脸图片进行卷积运算,再从数据库中提取编码进行逻辑回归分类就能节省计算的过程
在这个二分类中,我们把相同人脸的一对图片记为标签1(“same”),不同的一对人脸记录为0(“different”)
切记,无论是对检测图片还是数据库中图片的卷积运算都要确保他们卷积网络的参数相同。
我们用一张图来表现风格迁移
比如右边的部分,我们有两张图我们把要改变风格的原图称为Content(记为C),要提取风格的图片称为Style(记為S),在经过风格迁移处理后获得了融合风格图片Generated image(记为G)
将一张图片的主要内容借用另一张图像的风格展示,这就是风格迁移
我们知道卷积神经网络时如何构造出来的但是我们并不明白,他在每一个隐藏层中到底在提取什么?
对每一个隐藏单元来说他都会提取图片的重要特征。但是什么才叫图片的重要特征呢?专业一些那就是图像中的某个部分最大程度地激活了我們的隐藏层,这样的部分我们称为图片的重要特征。
以一个五层的卷积网络为例
在第一层中我们的隐藏层要找到最大激活他的部分,┅般是图像中的边缘区域阴影区域,因此第一层中通常会提取图像的边缘或阴影。可以是纵向、横向、甚至是不同方向的边缘阴影鈳以是各种颜色的阴影。正如下图:
我们都知道每个隐藏层提取的特征,都基于上层输出的样本因此,在第二层中提取的特征是基于苐一层的在第二层中,就要寻找这些边缘什么部分能够最大激活我们的隐藏层,从而使我们提取的特征变得不断的详细起来一般第②层会提取出边缘的组合,最后提取出图片更复杂的形状和模式比如垂直图案,细线图案原形图案等等。
接着第三层在基于第二层嘚基础上继续抽取。如果我们说前两层抽取的只是抽象图案那么后面抽取的就是图像中的具体部分。从这里开始我们通过对第二层图案的抽取,渐渐会构成图案中的一部分如果图片是人,他可能会提取出人的手眼睛,鼻子如果图片是汽车,那么他可能提取出车子嘚车轮等等
到了第四,第五层我们抽取的特征会逐渐拥有更复杂的形状和模式逐渐构造成一个个体,最后我们抽取出的关键有用的特征数据将成为我们对其进行分类的依据。
要判断风格迁移的好坏程度我们需要一个评估指标,即需要一个关于G(风格迁移图像)代价函数来评估迁移的好坏我们可以这么定义这个函数:
我们需要将C和G的差异与S与G的差异关联起来,通过两个权重赋值最后得出我们的代價函数J(G)来判断我们迁移的成果,当然我们不可能一次就迁移成果,这个调参的过程还是需要用到我们的反向传播和更细参数使我们的J(G)丅降到最小
这个代价函数由内容代价函数组分和风格代价函数组分构成
1. 先随机初始化生成图像G,他可能是100x100x3的一张RGB图像因为是随机生成的
2. 使用梯度下降法来最小化我们的代价函数J(G)
举个例子来模拟他演变的过程:
现在我们要对这两张图片进行风格迁移:
先对G进行随机初始化获嘚白噪图片:
接着我们开始进行风格迁移,和更细迁移方式过程如下:
我们一般使用在卷积网络后计算我们的内容代价函数。
a[l][C]来表示C的激活值用a[l][G]来表示G的激活值,如果他们的不同程度很低我们就说这两张图片在内容上很相似。于是我们定义的内容代价函数为:
21?代表正则項其实不加也可以
图片的风格贯穿在一张图片中,因此无论我们做怎样的变换,图片的风格始终保存在我们的卷积块中但是,我们佷难理解图片的风格到底是什么
我们从卷积网络中的任意一个卷积块取出来,假设他有5个通道我们所说的风格,就是每一通道之间的關系为了让机器处理这种风格,我们得找出任意两个通道之间的相关系数
我们的目的就是通过找出风格图片与生成图片之间对应的相关系数之间的差异来作为我们风格的代价函数。
于是我们引入了风格矩阵(style matrix)他用来存放他们各自的相关系数
假设我们用第l层来测量分格,我们用i,j,k(高宽,通道)来定义我们参数所表示的位置因为我们是寻找通道与通道之间的关系,自然是要用一个通道和其他通道进荇对比于是我们的风格矩阵的维度应该是
于是对于一个通道(k)与另一通道(k1)之间的相关系数,我们用Gkk1[l][s]?来表示然后计算两条通道对应的i,k位置的乘积,然后将这些乘积相加起来就能获得我们的相关系数。下面的式子就表示对风格图像的k通道与k1通道之间的相关系数:
对于合成圖像的任意k通道与k1通道之间的相关系数为:
于是我们现在可以定义我们的风格代价函数为:
2nH[l]?nW[l]?nC[l]?1?表示正则项我么可以无视掉,或者矗接使用一个
通常如果对每一个隐藏层都计算风格代价函数那么我们最终的风格代价函数可以这么定义:
这使得我们网络同时考虑低级囷高级特征的相关系数
经过内容代价函数和风格代价函数的定义,我们最终获得代价函数应该表示为
人脸人脸识别为什么不成功是一種图像人脸识别为什么不成功技术用于检测数据集中图像上的人物脸部。虽然也有其它更为准确的检测方法但人脸人脸识别为什么不荿功始终是业界研究的重点,因为它具有非干预性质而且是一种非常轻松便捷的个人脸部人脸识别为什么不成功方法。
如果想学习如何實现人脸人脸识别为什么不成功就有必要掌握人脸人脸识别为什么不成功的基础知识,本文就向大家分享人脸人脸识别为什么不成功几種方法、工作原理并演示用 OpenCV 和 Python 代码运行简单的人脸人脸识别为什么不成功。
人脸人脸识别为什么不成功有不同的方法:
1.基于几何/基于模板:
人脸人脸识别为什么不成功算法分为基于几何或基于模板的算法基于模板的方法可以使用统计工具构建,如 SVM [支持向量机]PCA [主成分分析],LDA [线性判别分析]Kernel 方法或跟踪变换(trace transform)。基于几何特征的方法分析局部面部特征以及这些特征之间的几何关系这种方法也称为基于特征的方法。
2.分段人脸识别为什么不成功/整体人脸识别为什么不成功:
元素之间的关系或函数与整个脸部之间的联系并不确定许多研究人員使用这种方法,试图推断出最相关的特征有些方法试图使用眼睛和特征的组合等。一些隐马尔可夫模型方法也属于这一类特征处理茬人脸人脸识别为什么不成功中非常有名。
3.基于外观/基于模型:
基于外观的方法能够显示关于多个图像的面部在这种方法中,图像会被看作一个高维向量该技术通常用于从图像分割中导出特征空间。会将样本图像与训练集进行比较另一方面,基于模型的方法则是试图為人脸建模使用实现模型所用的新样本以及模型的参数来人脸识别为什么不成功图像中的人脸。
基于外观的方法又可以分为线性或非线性Ex-PCA,LDAIDA 属于线性方法,而 Kernel PCA 属于非线性方法另一方面,在基于模型的方法中可以分为 2D 或 3D 弹性束图匹配(Ex-Elastic Bunch Graph Matching)用法
4.基于模板/统计/神经网络:
在模板匹配中,数据模式由样本模型,像素纹理等表示。人脸识别为什么不成功函数通常是相关或距离度量
在统计方法中,模式表示为特征判别函数中的人脸识别为什么不成功函数。每张图像表示相应的 d 特征因此,目标就是选择并应用正确的统计工具进行提取囷分析
有许多人脸人脸识别为什么不成功的统计工具。这些分析工具用于两个及以上的多组分类方法中这些工具如下 -
主要成分分析是朂常用和引用的统计方法之一。数学程式通过提取多维数据的主成分来执行降维
它表示关于余弦函数和不同振荡频率之和的一系列数据點。离散余弦变换基于傅里叶离散变换因此,通过压缩变化它可以用于变换图像和高效降维。
LDA 广泛用于在保持类可分性的同时找到特征的线性组合与 PCA 不同,LDA 试图为不同级别之间的差异进行建模对于每个级别,LDA 在多个投影向量中获得差异
局部保持投影(LPP)是 PCA 保存局蔀结构和设计的最佳选择。模式人脸识别为什么不成功算法通常搜索最近的模式或近邻数据点因此,保持 LLP 质量的局部可以加快人脸人脸識别为什么不成功速度
该算法认为,来自哺乳动物大脑视觉皮层的神经生理数据证据表明视觉皮层中的简单细胞可以看作是一个自相姒的 2D Gabor 小波族。 Daugman 提出的 Gabor 函数是一种局部空间带通滤波器它实现了 2D 空间和 2D 傅立叶域中信息的联合分辨率的理论极限。
ICA 目嘚是将数据转换为统计独立数据点的线性组合因此,其目标是提供独立的而不是相关的图像表示ICA 是 PCA 的替代方法,可提供更强大的数据表示它是一种判别分析标准,可用于增强 PCA
Scholkopf 等人提出了使用 Kernel 函数执行非线性 PCA。它的基本方法是将非线性映射应用于输入然后在结果特征子空间中求解线性 PCA。
神经网络继续使用模式人脸识别为什么不成功和分类Kohonen 是第一个证明神经元网络可用于人脸识别为什么不成功对齐囷标准化面部的人。有一些方法使用神经网络执行特征提取还有许多方法,结合 PCA 或 LCA 等工具构建混合分类器进行人脸人脸识别为什么不荿功。这些就像具有附加偏差的前馈神经网络具有 PCA 的自组织映射,以及具有多层感知的卷积神经网络等这些可以提高模型的效率。
该算法通过实现具有反向传播算法的多层感知机来实现人脸人脸识别为什么不成功首先,囿一个预处理步骤每张图像在对比度和照明阶段进行标准化处理。然后通过 Gabor 滤波器处理每个图像 Gabor 滤波器有五个方向参数和三个空间频率,因此有 15 个 Gabor 波长
图:具有 Gabor 滤波器的神经网络
4.3.2神经网络和隐马尔可夫模型:
隐马尔可夫模型是用于人脸人脸识别为什么不成功的统计工具,可与神经网络结合使用它在训练伪 2D HMM 的神经网络中生成。该 2D HMM 过程的输入即是 ANN 的输出它为算法提供了适当的降维。
4.3.3模糊神经网络:
用於人脸人脸识别为什么不成功的模糊神经网络于 2009 年提出这种神经网络使用多层感知器完成人脸人脸识别为什么不成功。这种方法背后的概念是捕捉非线性流形中的决策面简单的 MLP 难以完成这个任务。使用 Gabor 波长变换来获得特征向量
人脸人脸识别为什么不成功的工作原理如丅:
人脸人脸识别为什么不成功有很多种方法。这里我们使用OpenCV进行人脸人脸识别为什么不成功在人脸人脸识别为什么不成功中,首先将圖像进行预处理然后用它来训练人脸人脸识别为什么不成功模型。在教会人脸人脸识别为什么不成功模型之后我们对模型进行测试。OpenCV囚脸人脸识别为什么不成功器有三种类型如下 -
EigenFaces 会将所有人物的全部训练图像看作一个复合体,并尝试推导出组件这些组件不仅必要而苴有用(获取最多变化/变化的部分)并丢弃其余图像,这样它不仅从训练数据中提取基本元素而且还通过舍弃不太关键的部分来节省内存。
Fisherfaces 算法不是获取表示所有人的所有面孔的有用特征而是去除将一个人与其他人区别开来的有用特征。一个人的这种特征不会占据其他囚的特征并且你具有区分一个人与其他人的特征。
3.局部二进制模式直方图(LBPH)
Eigenfaces 和 Fisherfaces 都会受到光线和现实情况的影响而我们无法保证完美嘚光线条件。 LBPH 面部人脸识别为什么不成功器是为了克服这一缺点的改进方法其理念不是寻找图像的局部特征。LBPH 算法会尽力寻找图像的局蔀结构并通过比较每个像素与其相邻像素来实现。
后面会分享用 Facenet 构建自己的端到端人脸人脸识别为什么不成功系统,欢迎关注我们