当前位置:   article > 正文

人脸识别特征提取的三种方法-HoG、Dlib、卷积神经网络特征_人脸特征提取

人脸特征提取

人脸图像特征提取的各种方法(包括HoG、Dlib和卷积神经网络特征)

1. HOG提取人脸图像特征

用于行人检测的 HOG 特征描述子,是基于 64×128 大小的图像。但图像可能是任何尺寸的,对于这些之后用于分析的图像,唯一需要进行的处理是调整纵横比图像大小。例如需要调整纵横比为1:2,图像可以被调整为 100×200, 128×256, 或者 1000×2000,比如原始图像大小是 720×475,我们截切出来 100×200 大小图像用来计算 HOG 特征描述子,然后重新调整大小到 64×128。
为了计算 HOG 特征描述子,需要计算水平和垂直方向的梯度。我们可以通过下面的核来处理图像,很容易计算出梯度的直方图。然后计算梯度的幅值和方向,在OpenCv 中,可以使用 cartToPolar 函数来计算该数值。在图中, x 方向的梯度代表垂直方向的变化趋势,而 y 方向代表的是水平方向的变化;如果图像像素变换迅速的话,在梯度图中可以明显看出,而当区域内变化缓慢时,则不会出现梯度幅值;梯度图像去除了很多不必要的信息,保留了关键信息。也就是说,你可以看着梯度图,然后轻松的辨别出来照片里的人。每一个像素点,都有一个幅值和方向;对于彩色的图像,三种通道的梯度都会被评估计算,取的是最大的梯度。
接下来,会将图像分割成88大小的格子,分别计算梯度直方图。一个 88 的子图像包含 883 = 192 个像素值。每个像素梯度有两个值(幅值和方向),所以每个子图像会有 882=128 个数值。
在这里插入图片描述
中间图片用箭头来代表颜色和梯度的变化;右边图片用数字来代表子图像中的梯度。中间的图通过箭头来表示图像中梯度的变化,箭头的方向表示着像素强度变化的方向,幅值表示变化的缓慢;通过右边的图,我们可以看到 88 子图像中提取出来的代表梯度的数值,这些角度从 0~180 度,这些被称之为无符号梯度,因为一个梯度和它取负之后得到的是同样的数值。然后根据梯度的方向来选择使用填充到哪一位,然后根据梯度的幅值来填充数值。88 子图像提取出来的数值,经过处理,可以得到一个 9 位的直方图。
最后,归一化直方图,让其不受亮度的影响。使用16*16的块来进行归一化。

2 . dlib 提取人脸图像特征

得到模型经过训练得到68个特征数据,将其写入.csv文件。计算特征数据集的欧氏距离做对比。
One Millisecond Face Alignment with an Ensemble of Regression Trees算法(以下简称GBDT)是一种基于回归树的人脸对齐算法,这种方法通过建立一个级联的残差回归树(GBDT)来使人脸形状从当前形状一步一步回归到真实形状。每一个GBDT的每一个叶子节点上都存储着一个残差回归量,当输入落到一个节点上时,就将残差加到改输入上,起到回归的目的,最终将所有残差叠加在一起,就完成了人脸对齐的目的。
基本概念:人脸识别按顺序可以大体上分为四个部分,即人脸检测,人脸对齐,人脸校验和人脸识别。 人脸检测就是在一张图片中找到人脸所处的位置,即将人脸圈出来,比如拍照时数码相机自动画出人脸。人脸对齐就是在已经检测到的人脸的基础上,自动找到人脸上的眼睛鼻子嘴和脸轮廓等标志性特征位置。人脸校验就是判断两张脸是不是同一个人。人脸识别就是给定一张脸,判断这张脸是谁。
提取特征点主要就是人脸对齐。 其中几个关键词: 形状:形状就是人脸上的有特征的位置,如下图所示,每张图中所有黄点构成的图形就是该人脸的形状。 特征点:形状由特征点组成,图中的每一个黄点就是一个特征点。人脸对齐的最终目的就是在已知的人脸方框(一般由人脸检测确定人脸的位置)上定位其准确地形状。人脸对齐的算法主要分为两大类:基于优化的方法和基于回归的方法。 本文的方法属于基于回归的方法。
从“树”的概念开始。树的思想在机器学习算法中很常见,常用的决策树、二叉树等,以及由树构成的随机森林等算法,都在各种领域被广泛使用。树不仅多种多样,其应用也绝不仅仅局限于分类,例如本文就将树的思想应用在回归的领域,非常流行的CART分类回归树也是其中一种,甚至还有采用树的结构来提取特征的方法(3000FPS)。
如果大家理解随机森林,那么对本文的GBDT可能会更好理解一点。简单来说随机森林就是将很多棵决策树联合在一起,其中每一棵树的训练采用的是随机数量的样本和随机的特征,其实也是集成学习的思想的表现之一。而本文的GBDT,相比与随机森林,其实本质上差别不是很大,主要差别在于:
1)每一棵树之间的关系是串行的,并非是并行的关系,也就是说后一棵树的建立在前一棵树的基础之上。
2)每一棵树的叶子节点上存的是残差,这也是GBDT的特点之一,也只有通过叶子节点上保存的残差,才能使形状不断地回归,从而回归到真实形状。
假设我们要开始构建一棵GBDT,注意,这里的一棵GBDT(不是指一棵树)的概念是指很多棵树,很多棵树构成一个GBDT,所以说GBDT的地位类似与随机森林,都是由树集成构成的。
构建一棵GBDT要实现的目的是:通过这棵树,将人脸的初始形状回归到其真实形状上去。假设我们一共有N幅图像,将它们作为训练集,我们知道这N幅图像的每一个真实形状。首先我们要获得一个回归的初始形状,假设我们用所有图像的平均形状来作为这个初始形状(初始形状就是回归的起点,之后在测试时无论给出怎样一幅图像,我们都通过这个初始形状来进行预测和回归)。
现在开始构建GBDT的第一棵树。
有了初始形状,这里就会发现一个问题,假如使用平均形状来作为每一幅图像的初始形状,那么对所有图像来说,初始输入都是相同的,这如何分裂树呢?是的,对所有图像来说,初始形状相同,但我们分裂树时,采用的输入并非是当前形状,而是依据当前形状从该图片中提取出的特征。对于每一幅图像来说,初始形状虽然相同,但每一幅图片都不同,因此提取出的特征也就不同,论文中是使用的像素差作为特征,下一节会详细讲这种特征的提取方式。我们依据特征来进行节点的分裂操作,直至到达树的叶子节点。
当我们把N张图片都输入第一棵树,自然每一张图片最终都会落入其中的一个叶子节点,比如第1张图片落入了第3个叶子节点,第2张图片落入了第1个叶子节点,第3张图片落入了第三个叶子节点等等。这样,每一个叶子节点中都会有图片落入,当然也可能没有,这并不重要。这时,我们就要计算残差,计算每一个图片的当前形状和真实形状的差值,之后,在同一个叶子节点中的所有图片的差值作平均,就是该叶子节点应当保存的残差。当所有叶子节点都保存了残差后,第一棵树也就构造完毕了。
在构造第二棵树之前,我们要把每张图片的当前形状做一个更新,也就是要将当前形状更新成:当前形状+残差。对应到第一棵树,即是初始形状加上残差,这样每一张图片的当前形状就从初始形状变成了初始形状加残差,距离真实形状又更近了一步。之后再用同样的方法构建第二棵树,依据特征进行节点分裂,直到叶子节点。在叶子节点中计算每一张图片当前形状和真实形状的差,然后取平均,将这个平均值保存在该叶子节点中,作为残差。之后更新每一张图片的当前形状,即将叶子节点中保存的残差加上其当前形状,作为新的当前形状,然后就可以建立第三棵树了。直至建立的树足够多,可以最后的当前形状表示真实形状,那么这一个GBDT也就建立完成了。

3.卷积神经网络提取人脸图像特征

简言之,可以理解为将输入的人脸图像,转换成一个向量的表示。
具体来说:
如果一个图片是256色的,那么图像的每一个像素点,都是0到255中间的一个值,这样可以把一张图像转换成一个矩阵。如何去识别这个矩阵中的模式?用一个相对来讲很小的矩阵在这个大的矩阵中从左到右,从上到下扫一遍,每一个小矩阵区块内,你可以统计0到255每种颜色出现的次数,以此来表达这一个区块的特征。通过这一次“扫描”,得到了另一个由很多小矩阵区块特征组成的矩阵。这一个矩阵比原始的矩阵要小一些。然后对这个小一点的矩阵,再进行一次上面的步骤,进行一次特征“浓缩”。也就是把它抽象化。最后经过很多次的抽象化,你会将原始的矩阵变成一个 1 维乘 1 维的矩阵,这就是一个数字。而不同的图片,比如一个猫、一个狗或者一个熊,它们最后得到的这个数字会不同。于是你把一个猫、一个狗、一个熊都抽象成了一个数字,比如 0.34, 0.75, 0.23,这就达到让计算机来直接辨别的目的了。人脸,表情,年龄,这些原理都是类似的,只是初始的样本数量会很大,最终都是通过矩阵将具体的图像抽象成了数字,因为计算机只认识数字。但是抽象的函数,会有所不同,达到的效果也会不同。

参考:《One Millisecond Face Alignment with an Ensemble of Regression Trees 》 Vahid Kazemi ,Josephine Sullivan
https://blog.csdn.net/jiajinrang93/article/details/72297975

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/231671
推荐阅读
相关标签
  

闽ICP备14008679号