Java中常见的人脸识别算法有:
Eigenface: 这是一种基于主成分分析的人脸识别算法,它将人脸图像映射到一个低维的特征空间。
Fisherface: 这是一种基衡猜于卜拦乎投影的人脸识别算法,它利用线性判别分析技术对人脸图像进行分类。
Local Binary Patterns (LBP): 这是一种基于二进制像素点比较的人脸识别算法,它提取了图像中的型悉纹理特征。
Haar-like特征: 这是一种基于积分图像的人脸识别算法,它检测图像中的边缘特征。
Convolutional Neural Networks (CNNs): 这是一种基于卷积神经网络的人脸识别算法,它模拟了人类大脑中的视觉识别过程。
这些算法都是广泛用于人脸识别应用中的,根据具体需求和应用环境选择合适的算法是很重要的。
❷ 纹理特征提取方法:LBP, 灰度共生矩阵
搬运自本人 CSDN 博客: 《纹理特征提取方法:LBP, 灰度共生矩阵》
注:本文中大量行内 Latex 公式在中不支持,如果想要仔细参阅,请移步上面的 CSDN 博客链接。
在前面的博文 《图像纹理特征总体简述》 中,笔者总结了图像纹理特征及其分类。在这里笔者对其中两种算法介绍并总结。
参考网址:
《纹理特征提取》
《【纹理特征】LBP 》
《灰度共生矩阵(GLCM)理解》
《灰度共生矩阵的理解》
《图像的纹理特征之灰度共生矩阵 》
参考论文:
《基于灰度共生矩阵提取纹理特征图像的研究》——冯建辉
《灰度共生矩阵纹理特征提取的Matlab实现》——焦蓬蓬
LBP方法(Local binary patterns, 局部二值模式)是一种用来描述图像局部纹理特征的算子;它的作用是进行特征提取,提取图像的局部纹理特征。
LBP是一个计算机视觉中用于图像特征分类的一个方法,用于纹理特征提取。后来LBP方法与HOG特征分类器与其他机器学习算法联合使用。
LBP算法的核心思想,是以某个像素点为中心,与其邻域像素点共同计算。关于邻域像素点的选择方法,其实并不唯一:
这里选择环形邻域的方法进行说明:
窗口中心的像素点作为中心,该像素点的像素值作为阈值。然后将周围8个像素点的灰度值与该阈值进行比较,若周围某像素值大于中心像素值,则该像素点位置被标记为1;反之,该像素点标记为0。
如此这样,该窗口的8个点可以产生8位的无符号数,这样就得到了该窗口的LBP值,该值反应了该窗口的纹理信息。如下图所示:
图中,中心像素点的像素值作为阈值,其值v = 3;周围邻域8个像素值中,有3个比阈值小的像素点置0,5个比阈值大的像素点置1。
LBP算法的计算公式如下:
$$ LBP_{P, R}(x_{c},y_{c}) = sum_{p=0}^{P-1}s(g_{p} - g_{c})2^p, s(x)=left{egin{matrix}1 : x geq 0 0 : x leq 0 end{matrix} ight. $$
LBP纹理特征向量,一般以图像分块LBP直方图表示。具体步骤如下:
得到了整幅图像的LBP纹理特征后,便可以利用SVM或者其他机器学习算法进行分类了。
这两天笔者将会对源码进行测试封装,以后会上传到我的GitHub网站上。
灰度共生矩阵法(GLCM, Gray-level co-occurrence matrix),就是通过计算灰度图像得到它的共生矩阵,然后透过计算该共生矩阵得到矩阵的部分特征值,来分别代表图像的某些纹理特征(纹理的定义仍是难点)。灰度共生矩阵能反映图像灰度关于<font color = red> 方向、相邻间隔、变化幅度等 </font>综合信息,它是分析图像的局部模式和它们排列规则的基础。
对于灰度共生矩阵的理解,需要明确几个概念:方向,偏移量和灰度共生矩阵的阶数。
计算纹理特征第一步,就是将多通道的图像(一般指RGB图像)转换为灰度图像,分别提取出多个通道的灰度图像。
纹理特征是一种结构特征,使用不同通道图像得到的纹理特征都是一样的,所以可以任意选择其一。
一般在一幅图像中的灰度级有256级,从0--255。但在计算灰度共生矩阵时我们并不需要256个灰度级,且计算量实在太大,所以一般分为8个灰度级或16个灰度级。
而且当分成8个灰度级时,如果直接将像素点的灰度值除以32取整,会引起影像清晰度降低,所以进行灰度级压缩时,首先我们会将图片进行直方图均衡化处理,增加灰度值的动态范围,这样就增加了影像的整体对比效果。
注:笔者后文中的例子中,为了简要说明,所以灰度等级简单设置为4。
计算特征值前,先选择计算过程中的一些参数:
下面分部且适当的使用一些例子说明计算过程:
为了达到简单说明计算纹理特征值的目的,笔者此处做简要的假设:灰度被分为4阶,灰度阶从0--3;窗口大小为6 × 6;
窗口A的灰度矩阵A如下:
窗口B的灰度矩阵B如下:
此处以左上角元素为坐标原点,原点记为(1, 1);以此为基础举例,第四行第二列的点记为(4, 2);
情景1:d = 1,求0°方向矩阵A的共生矩阵:
则按照0°方向(即水平方向 从左向右,从右向左两个方向 ),统计矩阵值(1, 2),则如下图所示:
$$
P_{A}(d=1, heta =0^o)=egin{vmatrix}
0 & 8 & 0 & 7
8 & 0 & 8 & 0
0 & 8 & 0 & 7
7 & 0 & 7 & 0
end{vmatrix}
$$
情景2:d = 1,求45°方向矩阵A的共生矩阵:
按照情景1,同理可得此时的统计矩阵结果如下:
$$
P_{A}(d=1, heta =45^o)=egin{vmatrix}
12 & 0 & 0 & 0
0 & 14 & 0 & 0
0 & 0 & 12 & 0
0 & 0 & 0 & 12
end{vmatrix}
$$
情景3:d = 1,求0°与45°方向矩阵B的共生矩阵:
与前面同理,可以得到矩阵B的统计及矩阵结果如下:
$$
P_{B}(d=1, heta =0^o)=egin{vmatrix}
24 & 4 & 0 & 0
4 & 8 & 0 & 0
0 & 0 & 12 & 2
0 & 0 & 2 & 4
end{vmatrix}
$$
$$
P_{B}(d=1, heta =45^o)=egin{vmatrix}
18 & 3 & 3 & 0
3 & 6 & 1 & 1
3 & 1 & 6 & 1
0 & 1 & 1 & 2
end{vmatrix}
$$
矩阵A, B的其余90°、135°矩阵与上面同理,所以笔者偷懒略去。
这样,我们就已经计算得到了单个窗口的灰度共生矩阵的各个方向的矩阵,下面就要用刚才算出的矩阵计算灰度共生矩阵特征值。
用P表示灰度共生矩阵的归一化频率矩阵,其中i, j表示按照某方向同时出现于两个像素的某两个级别的灰度值,所以P(i, j)表示满足这种情况的两个像素出现的概率。
以上述情景2中的矩阵为例:
原矩阵为:
$$
P(d=1, heta =45^o)=egin{vmatrix}
12 & 0 & 0 & 0
0 & 14 & 0 & 0
0 & 0 & 12 & 0
0 & 0 & 0 & 12
end{vmatrix}
$$
归一化后,矩阵形式变为:
$$
P(d=1, heta =45^o)=egin{vmatrix}
12/50 & 0 & 0 & 0
0 & 14/50 & 0 & 0
0 & 0 & 12/50 & 0
0 & 0 & 0 & 12/50
end{vmatrix}
$$
灰度共生矩阵理论的前辈Haralick等人用灰度共生矩阵提出了14中特征值,但由于灰度共生矩阵的计算量很大,所以为了简便,我们一般采用四个最常用的特征来提取图像的纹理特征:<font color=red> 能量、对比度、相关度、熵 </font>。
$ ASM = sum_{i} sum_{j}P(i, j)^2 $
能量是灰度共生矩阵各元素的平方和,又被称角二阶距。它是图像纹理灰度变化均一的度量,反映了图像灰度分布均匀程度和纹理粗细程度。
$ CON = sum_{i} sum_{j} (i-j)^2 P(i,j) $
对比度是灰度共生矩阵主对角线附近的惯性矩,它体现矩阵的值如何分布,反映了图像的清晰度和纹理沟纹的深浅。
$ CORRLN = [sum_{i} sum_{j}((ij)P(i,j)) - mu_{x} mu_{y}]/ sigma_{x} sigma_{y} $
相关度体现了空间灰度共生矩阵元素在行或列方向上的相似程度,反映了图像局部灰度相关性。
$ ENT = - sum_{i} sum_{j} P(i,j) log P(i,j) $
熵体现了图像纹理的随机性。若共生矩阵中所有值都相等,取得最大值;若共生矩阵中的值不均匀,则其值会变得很小。
求出该灰度共生矩阵各个方向的特征值后,再对这些特征值进行均值和方差的计算,这样处理就消除了方向分量对纹理特征的影响。
一个滑动窗口计算结束后,该窗口就可以移动一个像素点,形成另一个小窗口图像,重复进行上一步的计算,生成新窗口图像的共生矩阵和纹理特征值;
以此类推,滑动窗口遍历完所有的图像像素点后,整个图像就形成了一个由纹理特征值构成的一个纹理特征值矩阵。
之后,就可以将这个纹理特征值矩阵转换成纹理特征图像。
笔者已经对源码进行测试了封装,并上传到了笔者的GitHub网站上。
GitHub: https://github.com/upcAutoLang/GLCM-OpenCV
❸ 人脸识别有什么优化算法还请各位大神赐教,简单一点的。谢谢
人脸识别技术概述
广义的人脸识别主要分为人脸检测(face detection)、特征提取(feature extraction)和人脸识别(face recognition)三个过程,如图1所示。
人脸,人脸识别,人脸识别技术
图1 典型的人脸识别过程
其中,第三步提到的人脸识别是狭义的人脸识别,即将待识别人脸所提取的特征与数据库中人脸的特征进行对比,根据相似度判别分类。而人脸识别又可以分为两个大类:一类是确认(verification),这是人脸图像与数据库中已存的该人图像比对的过程,回答你是不是你的问题;另一类是辨认(identification),这是人脸图像与数据库中已存的所有图像匹配的过程,回答你是谁的问题。显然,人脸辨认要比人脸确认困难,因为辨认需要进行海量数据的匹配。在辨认过程中,海量数据的处理、特征提取和分类算法的选择变得非常重要。识别率和识别速度是人脸识别技术中主要的衡量算法性能的指标。本文后面提到的人脸识别,主要指的是人脸辨认。
人脸识别技术原理
人脸识别算法发展到今天,大致上可以分为两类:基于特征的人脸识别算法和基于外观的人脸识别算法。其中,多数基于特征的人脸识别算法属于早期的人脸识别算法,现在已经不再使用。不过近些年出现了一些新的基于特征的算法,并取得不错的效果。而基于外观的人脸识别算法是由于实现简单,受到广泛关注。接下来将分别介绍两类人脸识别算法。
基于特征的人脸识别算法:早期的人脸识别算法主要是基于特征模板和几何约束来实现的。这一类算法首先对输入图像进行处理,提取出如眼睛、鼻子和嘴等面部特征和外观轮廓。然后计算这些面部特征之间的几何关系,如距离、面积和角度等。这样将输入图像转换为几何特征向量后,使用标准的统计模式识别技术进行匹配分类。由于算法利用了一些直观的特征,计算量小。不过,由于其所需的特征点不能精确选择,限制了它的应用范围。另外,当光照变化、人脸有外物遮挡、面部表情变化时,特征变化较大。所以说,这类算法只适合于人脸图像的粗略识别,无法在实际中应用。
人脸,人脸识别,人脸识别技术
图2 一些典型的面部几何特征示意图
以上这些方法都是通过一些特征模板和几何约束来检测特定的面部特征,并计算特征之间的关系。还有一些方法使用了图像的局部表示来提取特征。其中最受关注的方法是局部二值模式(LBP)算法。LBP方法首先将图像分成若干区域,在每个区域的像素3x3邻域中用中心值作阈值化,将结果看成是二进制数。图3显示了一个LBP算子。LBP算子的特点是对单调灰度变化保持不变。每个区域通过这样的运算得到一组直方图,然后将所有的直方图连起来组成一个大的直方图并进行直方图匹配计算进行分类。
人脸,人脸识别,人脸识别技术
图3 LBP算子
基于特征的人脸识别算法主要的优势在于对姿态、尺度和光照等变化鲁棒。由于多数特征是基于手动选择和先验知识,受图像本身的成像质量影响较少。另外,提取出的面部特征往往维数较低,匹配速度快。这些方法的缺点是自动特征提取的难度较大。如果特征集的鉴别能力弱,再多的后续处理也无法补偿本身的不足。
基于外观的人脸识别算法:基于外观的人脸识别算法也称为整体方法。它们使用图像的全局信息来辨识人脸。最简单的整体方法是用二维数组来存放图像的灰度值,然后直接对输入图像和数据库中的所有图像进行相关性比较。这种方法的缺点非常多,如易受环境影响、计算耗时等。其中一个重要的问题是这样的分类是在一个非常高维的空间中进行的。为了克服维数问题,一些算法使用统计降维方法来获取和保留更有用的信息,最典型的算法就是主成分分析(PCA)算法和线性鉴别分析(LDA)算法。
PCA算法指出任何特定的人脸可以由一个低维的特征子空间表示,并可以用这个特征子空间近似地重建。将输入人脸图像投影到特征子空间上得到的特征与已知的数据库进行比对来确定身份。PCA算法选取的特征最大化了人脸样本间的差异,但也保留了一些由于光照和面部表情产生的不必要的变化。而同一个人由于光照产生的变化可能会大于不同人之间的变化,如图4所示。LDA算法在最大化不同个体之间的样本差异的同时,最小化同一个体内部的样本差异。这样达到了人脸特征子空间的划分。图5是PCA和LDA算法的示例。其中,PCA的特征脸是由组成PCA特征子空间的特征向量按二维图像来排列得到的类似人脸的图像。LDA的Fisher脸也是同样道理。经过特征脸和Fisher脸重构得到的人脸图像在第四行。可以看到,PCA重构脸与输入人脸差异较小,但LDA的Fisher脸很难辨认,但突出了该个体的显着特征。PCA和LDA方法都假设存在一个最优的投影子空间。这个子空间的每个区域对应唯一的一个人。然而,事实上在人脸空间中许多人经常会映射到相同的区域中,因此这种假设并不成立。
来源:海鑫科金
http://www.hisign.com.cn/news/instry/2699.html