人脸识别与仿真

来源:互联网 发布:淘宝卖家常用语 编辑:程序博客网 时间:2024/05/17 13:41

第一章 绪论

本章提出了本文的研究背景及应用前景。首先阐述了人脸图像识别意义;然后介绍了人脸图像识别研究中存在的问题;接着介绍了自动人脸识别系统的一般框架构成;最后简要地介绍了本文的主要工作和章节结构。

就从目前和将来来看,可以预测到人脸图像识别将具有广阔的应用前景,如表1-1中所列举就是其中已经实现或逐步完善的应用。

表1-1 人脸识别的应用

应用

优点

存在问题

信信用卡、汽车驾照、护照以及个人身份验证等

图像摄取可控

图像分割可控

图像质量好

需要建立庞大的数据库

嫌疑犯照片匹配

图像质量不统一

多幅图像可用

潜在的巨大图像库

互联网应用

视频信息价值高多人参与

存在虚假

银行/储蓄安全

监控效果好

图像分割不可控

图像质量较差

人群监测

图像质量高

可利用摄像图像

图像分割自由

图像质量低、实时性

 

第二章本文研究的问题

本文介绍了人脸图像识别中所应用MATLAB对图像进行预处理,应用该工具箱对图像进行经典图像处理,通过实例来应用matlab图像处理功能,对某一特定的人脸图像处理,进而应用到人脸识别系统。本文在总结分析人脸识别系统中几种常用的图像预处理方法基础上,利用MATLAB实现了一个集多种预处理方法于一体的通用的人脸图像预处理仿真系统,将该系统作为图像预处理模块可嵌入在人脸识别系统中,并利用灰度图像的直方图比对来实现人脸图像的识别判定。

其中涉及到图像的选取,脸部定位,特征提取,图像处理和识别几个过程。

 

 识别系统构成

广义的讲,自动人脸识别系统具有如图1.1所示的一般框架并完成相应功能的任务。

 

                   图1.1 人脸识别系统一般框架

(1)人脸图像的获取

一般来说,图像的获取都是通过摄像头摄取,但摄取的图像可以是真人,也可以是人脸的图片或者为了相对简单,可以不考虑通过摄像头来摄取头像,而是直接给定要识别的图像。

(2)人脸的检测

人脸检测的任务是判断静态图像中是否存在人脸。若存在人脸,给出其在图像中的坐标位置、人脸区域大小等信息。而人脸跟踪则需要进一步输出所检测到的人脸位置、大小等状态随时间的连续变化情况。

 (3)特征提取

通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛、眉毛、鼻子、嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。

根据人脸特征点检测与标定的结果,通过某些运算得到人脸特征的描述(这些特征包括:全局特征和局部特征,显式特征和统计特征等)。

   

第三章 人脸图像识别计算机系统

3.1系统基本机构

人脸识别是一个复杂的过程,一个计算机人脸识别的流程如图3-1所示。它包括几个步骤:对采集到的图像,首先进行人脸检测(在输入图像中寻找人脸),给出人脸有无的结果;然后进行人脸定位,确定人脸的位置并提取出来。对人脸的定位在输入是图像序列时一般也称之为人脸跟踪。通常检测和定位结合进行。对提取出来的人脸借助人脸描述就可以进行(狭义的)人脸识别,即通过提取特征来确定其身份。

                            图3.1  基本框架图

3.2人脸检测定位算法

人脸检测定位算法大致可分为两大类:基于显式特征的方法和基于隐式特征的方法。

所谓显式特征是指对人类肉眼来说直观可见的特征,如肤色、脸部轮廓、脸部结构等。基于显式特征的方法是指由人通过肉眼观察,总结出人脸区别于“非人脸”区域的特征,然后根据被检测区域是否满足这些“人脸特征”,来判定该区域是否包含人脸。根据所选择的“人脸特征”,基于显式特征的方法分为三类:基于肤色模型的方法、模板匹配的方法、基于先验知识的方法。

以上三种方法的优缺点比较见表3-1。

表3-1 基于显示特征方法的特点

检测方法

优点与适用场合

缺点与需要改进的地方

肤色模型

检测速度快

高光和阴影会造成人脸区域被分割而被漏检;肤色区域的存在提高了预警率

模板匹配

直观性好,具有较好的适应性

对表情、尺度变换敏感;可变模板的选择和参数的确定非常困难

基于知识的方法

适用复杂图像中的人脸检测

依赖先验知识;多尺度空间遍历工作量大,运算时间长

 

基于隐式特征的方法将人脸区域看成一类模式,使用大量“人脸”、“非人脸”样本训练、构造分类器,通过判别图像中所有可能区域是否属于“人脸模式”的方法来实现人脸检测。这类方法有:特征脸法、人工神经网络法、支持向量机法;积分图像法。

以上四种方法的优缺点比较见表3-2

表3-2 基于隐式特征方法的特征

检测方法

优点

缺点与需要改进的地方

本征脸法

标准人脸模板能抽象人脸全部信息,运算不涉及迭代耗费时间短

但模板检测效率低,多模板提高了效率也增加了检测时间

神经网络法

检测效率高,错误报警数目不多,训练成熟的网络监测速度快

多样本训练耗费时间多,但网络监测错误报警数目多

支撑向量机机法

比神经网络方法具有更好的泛化能力,能对为观测到的例子进行有效分类

“非人脸”样本复杂多样,造成支持向量数目多,运算复杂度大

基于积分图像分析法

检测速度快,基本满足实时检测要求,检测效率可以与神经网络法比较

错误报警数目少时,检测率不高

                                                                                   

运用matlab仿真进行人脸检测定位实例:

人脸检测定位程序:

%%%%% Reading of a RGB image

 

i=imread('face1.jpg');

I=rgb2gray(i);

BW=im2bw(I);

figure,imshow(BW)

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% minimisation of backgroundportion

 

[n1 n2]=size(BW);

r=floor(n1/10);

c=floor(n2/10);

x1=1;x2=r;

s=r*c;

 

for i=1:10

   y1=1;y2=c;

    for j=1:10

       if (y2<=c | y2>=9*c) | (x1==1 | x2==r*10)

           loc=find(BW(x1:x2, y1:y2)==0);

           [o p]=size(loc);

           pr=o*100/s;

           if pr<=100

                BW(x1:x2, y1:y2)=0;

                r1=x1;r2=x2;s1=y1;s2=y2;

                pr1=0;

           end

           imshow(BW);

       end

           y1=y1+c;

           y2=y2+c;

    end

   

 x1=x1+r;

 x2=x2+r;

end

 figure,imshow(BW)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%% detection offace object

 

L = bwlabel(BW,8);

BB  =regionprops(L, 'BoundingBox');

BB1=struct2cell(BB);

BB2=cell2mat(BB1);

 

[s1 s2]=size(BB2);

mx=0;

for k=3:4:s2-1

   p=BB2(1,k)*BB2(1,k+1);

    if p>mx & (BB2(1,k)/BB2(1,k+1))<1.8

       mx=p;

       j=k;

    end

end

figure,imshow(I);

hold on;

rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j+1)],'EdgeColor','r' )

              

           原始图片                    灰度图片

              

 

        均衡化灰度图片                人脸定位

 

3.4人脸图像的预处理

不同的人脸识别系统根据其采用的图像来源和识别算法需要不同,采用的预处理方法也不同。常用的人脸图像预处理方法有:滤波去噪、灰度变换、图像二值化、边缘检测、尺寸归一化、灰度归一化等。用在同一系统中的可能只有其中一种或几种预处理方法,但一旦库中采集到的原始图像质量发生较大变化(如人脸大小、光照强度、拍摄条件、成像系统等方面变化),原有的预处理模块便不能满足特征提取的需要,还要更新,这是极不方便的。鉴于此,作者在总结分析了滤波去噪、边缘检测、灰度变换三种广泛应用于不同人脸识别系统中的预处理方法基础上,设计了一个通用的人脸图像预处理仿真系统。该系统可对不同条件下的原始图像进行相应的预处理。如,用户可根据需要选择使用不同的滤波方法去除噪声、不同的边缘检测算子检测人脸边缘、选择不同的灰度变换算法实现图像的灰度校正和灰度归一化,仿真系统同时还实现了尺寸归一化、二值化等其他常用的图像预处理算法。

3.4.1 仿真系统中实现的人脸图像预处理方法

根据所查阅文献资料,常应用于人脸图像的预处理方法有:图像类型转换、滤波去噪、灰度变换、边缘检测及二值化、尺寸归一化、灰度归一化等。作为通用人脸图像预处理模块,要能够充分适应不同人脸库中图像在人脸大小、光照强度、成像系统等方面的任意性和差异性,不能单独采用某种单一的滤波、灰度变换和边缘检测方法。在本仿真系统中,对灰度变换实现。

灰度变换

灰度变换是图像增强技术中的一种。通过灰度变换,可对原始图像中的光照不均进行补偿,使得待识别人脸图像遵循同一或相似的灰度分布。只有这样,不同图像在特征提取和识别时才具有可比性。这一过程,也被称作灰度归一化。常用在人脸识别系统中的灰度变换方法主要有:基于图像统计特征的直方图均衡化、直方图规定化和灰度均值方差标准化三种方法。直方图均衡化和直方图规定化的灰度变换原理和实现方法可由matlab仿真来实现,如下:

i=imread('face1.jpg');j=rgb2gray(i);

imshow(j);imwrite(j,'face1.tif');

i=imread('face1.tif');

j=histeq(i);imshow(j);

figure,subplot(1,2,1),imhist(i);

subplot(1,2,2),imhist(j)

 

 

 

第四章 基于直方图的人脸识别实现

4.1识别理论

用灰度直方图增强图像对比度是基于图像灰度值统计的一种重要方法,它以概率论为基础的,常用的实现算法主要是直方图均衡化和直方图规定化。

直方图均衡化主要用于增强动态范围较小的图像的反差,基本思想是把原始图的直方图变换为均匀分布的形式,这样就增强了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。直方图均衡化的优点是能自动地增强整个图像的对比度,但它的具体的增强效果不好控制,处理的结果总是得到全局均衡化的直方图。实际中有时需要变换直方图使之成为某个需要的形状,从而有选择地增强某个灰度值范围内的对比度或使图像灰度值的分布满足特定的要求,这时可以采用比较灵活的直方图规定化方法。

4.2人脸识别的matlab实现

我们设置图库中对应每个人的那组图片的前5张为训练使用,后五张为测试使用,如果错误则显示特定的图片,若正确则显示出每组图片中标号为1.pgm的图片。具体实现如下:

 

训练机模块

global train_processed_bin;

global total_sub train_img sub_img max_hist_level bin_num form_bin_num;

 

train_processed_bin(form_bin_num,train_img)=0;

K=1;

train_hist_img=zeros(max_hist_level,train_img);

for Z=1:1:total_sub

for X=1:2:sub_img

I=imread(strcat('s',int2str(Z),'\',int2str(X),'.pgm'));

[rows cols]=size(I);

for i=1:1:rows

for j=1:1:cols

if(I(i,j)==0)

train_hist_img(max_hist_level,K)=train_hist_img(max_hist_level,K)+1;

else

train_hist_img(I(i,j),K)=train_hist_img(I(i,j),K)+1;

end

end

end

K=K+1;

end

end

 

[r c]=size(train_hist_img);

sum=0;

 

for i=1:1:c

K=1;

for j=1:1:r

if((mod(j,bin_num))==0)

sum=sum+train_hist_img(j,i);

train_processed_bin(K,i)=sum/bin_num;

K=K+1;

sum=0;

else

sum=sum+train_hist_img(j,i);

end

end

train_processed_bin(K,i)=sum/bin_num;

end

 

人脸锁定模块:

L = bwlabel(BW,8);

BB  = regionprops(L, 'BoundingBox');

BB1=struct2cell(BB);

BB2=cell2mat(BB1);

 

[s1 s2]=size(BB2);

mx=0;

for k=3:4:s2-1

    p=BB2(1,k)*BB2(1,k+1);

    if p>mx & (BB2(1,k)/BB2(1,k+1))<1.8

        mx=p;

        j=k;

    end

end

axes (handles.axes3)

imshow(J)

 

rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j+1)],'EdgeColor','r' )

msgbox ( 'Face Detection')

 

 

验证测试模块:

global train_img max_hist_level bin_num form_bin_num;

global train_processed_bin;

global filename  pathname I

 load 'train'

test_hist_img(max_hist_level) =0;

test_processed_bin(form_bin_num)= 0;

 

 

 [rows cols] = size(I);

 

    for i=1:1:rows

       for j=1:1:cols

           if( I(i,j) == 0 )

               test_hist_img(max_hist_level)=  test_hist_img(max_hist_level) +1;                           

           else

               test_hist_img(I(i,j)) =test_hist_img(I(i,j)) + 1;                         

           end

       end  

    end  

   

  [r c] = size(test_hist_img);

  sum = 0;

 

    K = 1;

    for j=1:1:c       

        if( (mod(j,bin_num)) == 0 )

            sum = sum + test_hist_img(j);           

            test_processed_bin(K) =sum/bin_num;

            K = K + 1;

            sum = 0;

        else

            sum = sum + test_hist_img(j);           

        end

    end

 

 test_processed_bin(K) = sum/bin_num;

   

sum = 0;

K = 1;

 

    for y=1:1:train_img

        for z=1:1:form_bin_num       

          sum = sum + abs(test_processed_bin(z) - train_processed_bin(z,y) ); 

        end        

        img_bin_hist_sum(K,1) = sum;

        sum = 0;

        K = K + 1;

    end

 

    [temp M] = min(img_bin_hist_sum);

    M = ceil(M/5);

    getString_start=strfind(pathname,'s');

    getString_start=getString_start(end)+1;

    getString_end=strfind(pathname,'\');

    getString_end=getString_end(end)-1;

   subjectindex=str2num(pathname(getString_start:getString_end));

 

    if (subjectindex == M)

      axes (handles.axes2)

      %imageno: 5 is shown for visualization purpose

      imshow(imread(STRCAT('s',num2str(M),'\1.pgm')))   

      msgbox ( 'Correctly Recognized');

    else

     display ([ 'Error==>  Testing Image ofSubject >>' num2str(subjectindex)'  matches with theimage of subject >> '  num2str(M)])

     axes (handles.axes2)

     %imageno: 5 is shown for visualization purpose

     imshow(imread(STRCAT('s',num2str(M),'\8.pgm')))   

     msgbox ( 'Incorrectly Recognized');

    end

 

实现结果如图

 

 

                       实现结果

 

4.3 实验小结

最初这种想法基于颜色直方图。 此算法提供我们的建议技术名为"直方图处理人脸识别"的第一部分。同时使用灰度图像。 第一,每个灰度级的频率是计算并存储在媒介作进一步处理。 第二,平均从存储载体的连续九个频率的计算,并存储在另一个载体,供以后使用,在测试阶段。此均值向量用于计算平均值的曾受训练的图像和测试图像绝对差异。

0 0
原创粉丝点击