大家好!我是来自华中科技大学的一名本科生,这是关于我大四上学期的机器视觉课程的一个大作业,两人一组完成的,因为组里同学忙于考研,因此绝大部分工作是我完成的,写这篇文章希望能记录一下大作业的过程,能给大家起到一点参考作用。
本项目要解决的问题有以下几点:
在系统最初使用时,通过采集使用者的姓名信息、多张多角度的人脸信息以生成分类器的训练样本,在生成分类器后,通过摄像头实时采集人脸信息,通过读取IC卡获取姓名信息,经由系统进行识别,如果姓名信息与人脸识别获取的姓名信息一致的话系统控制电磁锁使门打开,如果姓名信息与人脸识别获取的姓名信息不一致,系统将发出警告。
为了解决以上问题,达到以上目标,本项目基于MATLAB环境编写算法进行人脸检测,分类,识别。通过MATLAB与硬件进行通讯,实现对电磁锁的控制。对于人脸的检测拟采用MATLAB自带的算法实现,对图像的特征提取拟采用2DPCA(二维主成分分析)自编算法完成,对图像分类器的生成,拟采用SVM(支持向量机)算法,使用MATLAB自带的函数实现。最终的用户界面采用MATLAB自带的GUI实现。
人脸识别系统最前端的是图像采集设备,该设备采集图像作为图像处理的材料。采集到的图像数据可以是连续的视频也可以是静态的图片。为减小工作难度,本项目使用的图像数据是基于电脑自带标准CCD摄像头采集的静态图像,可多次采集。
人脸检测的目的是从图像中找到人脸的位置,确定人脸的大小。这一阶段得到的结果是人脸识别阶段的材料基础,因此人脸检测的精确度直接影响整个系统的性能。目前人脸检测的方法主要有人工神经网络方法、AdaBoost算法、特征脸检测算法、样本学校方法。本项目使用MATLAB自带目标检测算法中的人脸检测算法,以笔者已知的知识推测该算法使用的是基于肤色模型的人脸检测和 A d a B o o s t AdaBoost AdaBoost算法相结合的办法。
图像预处理是针对它的下一环节的要求,对图像进行相应的处理。本项目在人脸检测环节之后对图像进行处理,主要处理方法是对人脸检测后的图像,将检测到人脸的区域从图像中分割出来,再将所有的图像对齐为 112 ∗ 92 112*92 112∗92的人脸图像。
特征提取是人脸识别系统的关键技术,通过计算分析等得到一定数据用来表征人脸的过程。常用的特征提取方法主要可以分为基于几何结构特征的方法、模板匹配方法、统计模型的方法等。本项目使用的是一种基于 2 D P C A 2DPCA 2DPCA的特征提取方法。
本设计利用MATLAB环境实现人脸识别,其中涉及到图像的采集,人脸检测,图像预处理,特征提取,分类器生成和人脸识别几个过程。
人脸检测模块使用的MATLAB自带的函数,对采集的图像先对其检测人脸,找到人脸所在的区域后将其从图像中分割出来,由于每张人脸分割出来后尺寸不一不利于下一步的处理,因此将所有的人脸归一化到 112 ∗ 92 112*92 112∗92.
特征提取模块采用 2 D P C A 2DPCA 2DPCA算法[1]。 2 D P C A 2DPCA 2DPCA算法直接对人脸图像矩阵进行相关运算,避免了 P C A PCA PCA算法的行列向量转换而生成一个巨大维数的矩阵给后面带来复杂的运算[2]。 2 D P C A 2DPCA 2DPCA算法提取特征的原理和 P C A PCA PCA算法类似,都是为了寻找最优的投影特征子空间。
2 D P C A 2DPCA 2DPCA算法步骤如下:
假设训练样本图像总数为 M M M,每一幅人脸图像为矩阵 A i A_i Ai。
这里 d d d的值可以选择,选择的原则为前 d d d个特征值的总和与特征值总和的比为85%-90%。
实验中 d d d值的选取使用自己编写的脚本,2DPCA特征提取使用自己编写的函数完成。
SVM分类器是一种基于统计学习理论和结构风险最小原理的分类算法,用来提高学习机的泛化能力,实现经验风险和期望风险最小化[3]。 SVM的学习策略是间隔最大化,寻找能够分开两类样本并具有最大分类间隔的最优分类超平面。
SVM分类器的原理是通过非线性变换将低维空间中的非线性分类的样本映射成高维空间中的线性可分样本,然后在映射后的高维空间线性样本中构建最优的分类超平面。其非线性变换是由选择适当的内积函数得到的,内积函数称为SVM 核函数,即 K ( x j , x j ) = ψ ( x i ) ⋅ ψ ( x j ) 其 中 ψ : R n → R D K(x_j ,x_j )=ψ(x_i )·ψ(x_j )其中ψ:R^n → R^D K(xj,xj)=ψ(xi)⋅ψ(xj)其中ψ:Rn→RD即低维空间到高维空间的非线性变换,这样将低维空间中非线性的样本变换到高维空间中的线性样本,并且把高维空间中的内积运算简化为通过核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj)来计算。
对于多分类的情况,SVM分类器可采用一对一分类的方式,即每两类之间生成一个超平面的方法来实现多分类。
本项目中使用MATLAB自带的分类器函数实现分类。
为方便操作者使用,本项目对所有内容进行了良好的集成,将其所有内容接入到了GUI界面中,如图1所示。
其中,输入姓名信息是为了获得样本的标签名称,显示采集张数是为了是操作者易知已采集样本的张数以使得每个样本的数量一致,统一处理样本图像集成了人脸检测与图像预处理,最终的结果是得到一系列尺寸为 112 ∗ 92 112*92 112∗92的样本集。清除按钮是为了清除输入的姓名信息和显示的张数以及显示的采集图像,以方便下一个样本的采集工作,进入识别模块按钮会关闭本模块界面进入人脸识别模块。
图2所示是本系统人脸识别模块。生成分类器按钮是调用 l i b v s m libvsm libvsm工具箱的函数运用 S V M SVM SVM生成分类器,输入姓名信息是为了获取识别图像的标签,处理图像按钮与图1中统一处理样本图像的原理相同,将采集的图像变为 112 ∗ 92 112*92 112∗92的图像,识别按钮是为了对采集的图像进行预测。
本项目经过多次实验发现存在以下问题:
由于本项目对输入分类器的 112 ∗ 92 112*92 112∗92的图像未进行处理,因而光照对其影响较大,所以对其改进可集中在对输入图像的处理方面。
可通过 G a m m a Gamma Gamma校正来减弱光照对图像的影响,对低灰度像素范围采用 γ < 1 γ<1 γ<1的灰度校正,对于高灰度像素范围采用 γ > 1 γ>1 γ>1的灰度校正[4],实现了低灰度像素范围向高灰度拉伸,高灰度像素范围向低灰度拉伸,公式如下:
Y ( x , y ) = { [ I ( x , y ) / 0.5 ] 0.2 ∗ 0.5 , if I ( x , y ) ≤ 0.5 { [ I ( x , y ) − 0.5 ] / 0.5 } 3 ∗ 0.5 + 0.5 if I ( x , y ) > 0.5 Y(x,y)= \begin{cases} [I(x,y)/0.5]^{0.2}*0.5, & \text {if $I(x,y) \leq 0.5$ } \\ \{\ [I(x,y)-0.5]/0.5 \}^3*0.5+0.5 &\text{if $I(x,y)>0.5$} \end{cases} Y(x,y)={[I(x,y)/0.5]0.2∗0.5,{ [I(x,y)−0.5]/0.5}3∗0.5+0.5if I(x,y)≤0.5 if I(x,y)>0.5
其中 I ( x , y ) I(x,y) I(x,y)为原图像像素灰度值, Y ( x , y ) Y(x,y) Y(x,y)为处理后图像像素灰度值。图像 I I I为双精度图像,像素值为0到1.
[1]谭子尤,梁靖.基于PCA+2DPCA的人脸识别方法分析[J].吉首大学学报(自然科学版),2011,32(03):55-58.
[2]李德福,黄新.基于二维PCA和SVM算法的人脸识别系统[J].桂林电子科技大学学报,2017,37(05):391-395.
[3]郑岚.支持向量机在人脸识别中的应用研究[J].计算机仿真,2010,27(12):271-274.
[4]慕春雷. 基于HOG特征的人脸识别系统研究[D].电子科技大学,2013.
代码部分由人脸识别门禁系统(二)给出
GUI界面代码由人脸识别系统(三)给出
由于第一次写博客,时间、能力、精力有限,文中尚有很多不足或者错误之处,还望读者可以指出。笔者联系方式 360812049 @ q q . c o m [email protected] 360812049@qq.com
未经允许,禁止转载!