一、人脸识别介绍
人脸识别技术(FRT)是当今模式识别和人工智能领域的一个重要研究方向。虽然人脸识别的研究已有很长的历史,各种人脸的识别技术也很多,但由于人脸属于复杂模式而且容易受表情、肤色和衣着的影响,目前还没有一种人脸识别技术是公认快速有效的。人脸朝向识别是一个复杂的模式识别问题,当人脸朝向不同的方向时,眼睛在图像中的位置差别较大。本文将图片中描述眼睛位置的特征信息通过Sobel边缘算子提取出来作为LVQ神经网络的输入,人脸朝向作为神经网络的输出,利用Matlab工具箱通过对训练集的图片进行训练,得到具有预测识别功能的网络,从而可以对任意给出的人脸图像进行判断和识别。
二、LVQ神经网络介绍
学习向量量化LVQ(Learning Vector Quantization)神经网络,属于前向神经网络类型,在模式识别和优化领域有着广泛的的应用,其网络结构图如图所示。
LVQ网络结构图

  • LVQ神经网络由三层组成,即输入层、隐含层和输出层,网络在输入层与隐含层间为完全连接,而在隐含层与输出层间为部分连接,每个输出层神经元与隐含层神经元的不同组相连接。隐含层和输出层神经元之间的连接权值固定为1。输入层和隐含层神经元间连接的权值建立参考矢量的分量(对每个隐含神经元指定一个参考矢量)。在网络训练过程中,这些权值被修改。隐含层神经元(又称为Kohnen神经元)和输出神经元都具有二进制输出值。当某个输入模式被送至网络时,参考矢量最接近输入模式的隐含神经元因获得激发而赢得竞争,因而允许它产生一个“1”,而其它隐含层神经元都被迫产生“0”。与包含获胜神经元的隐含层神经元组相连接的输出神经元也发出“1”,而其它输出神经元均发出“0”。产生“1”的输出神经元给出输入模式的类,由此可见,每个输出神经元被用于表示不同的类。

  • 在MATLAB神经工具箱中提供的与算法相关的LVQ神经网络工具函数和基本功能如下表所示。

  • 在MATLAB的命令行窗口中输入“help lvq”,便可得到与LVQ神经网络相关的函数,进一步利用help命令又能得到相关函数的详细介绍。
    这里写图片描述
    三、LVQ神经网络在人脸朝向识别中的应用
  • 问题描述

    现采集到一组人脸朝向不同角度时的图像,图像来自不同的20个人,每人5幅图像,人脸的朝向分别为:左方、左前方、前方、右前方和右方,如图所示。试创建一个LVQ神经网络,对任意给出的人脸图像进行朝向预测和识别。
    人脸识别图像

  • 设计思路与步骤
    通过观察不难发现,当人脸面朝不同方向时,眼睛在图像中的位置差别较大。因此,可以考虑将图片中描述眼睛位置的特征向量提取出来作为LVQ神经网络的输入,5个朝向分别用1,2,3,4,5表示,作为LVQ神经网络的输出。通过对训练集的图像进行训练,得到具有预测功能的网络,便可以对任意给出的人脸图像进行朝向判断和识别[12]。
    根据上述设计思路,设计步骤主要包括以下几个部分,如图所示。

这里写图片描述

  • 人脸特征向量的提取
    当人脸朝向不同时,眼睛在图像中的位置会有明显的差别。因此,只需要将描述人眼位置信息的特征向量提取出来即可。方法是将采集到的100幅图像先进行预处理,将图片按320×360的尺寸对人脸部位进行裁剪,然后将裁剪得到的图像按“人员编号_人脸朝向”的格式进行命名,再将其转换成二值灰度图像,接着将图像划分成6行8列,人眼的位置信息可以用第2行的8个子矩阵来描述,用Sobel边缘算子进行边缘检测后8个子矩阵中的值为“1”的像素点个数与人脸朝向有直接关系,只要分别统计出第2行的8个子矩阵中的值为“1”的像素点即可。
    (1) 图像预处理
    将采集到的不同大小的图像利用美图秀秀将其裁剪成320×360尺寸大小的人脸图像,如图3-3所示。

这里写图片描述

(2) 图像转换
利用MATLAB图像处理工具箱中的rgb2gray函数将RGB图像转换为灰度图像,实现程序如下:
%读取图像
I=imread(‘2_2.bmp’);
%将RGB图像转换为灰度图像
j=rgb2gray(I);
figure,imshow(I),figure,imshow(j);
图像转换结果如图3-4所示。
这里写图片描述

(3) Sobel算子进行边缘检测
Sobel算子是一组方向算子,从不同的方向检测边缘。Sobel算子不是简单求平均再差分,而是加强了中心像素上下左右4个方向像素的权重,运算结果是一幅边缘图像。该算子通常由下列计算公式表示:

这里写图片描述
这里写图片描述
适当调整常数T的大小来达到最佳效果。部分实现代码如下:
%读取图像
I=imread(‘2_2.bmp’);
%将RGB图像转换为灰度图像
j=rgb2gray(I);
figure,imshow(I),figure,imshow(j);
%Sobel算子进行边缘检测
ps=edge(j,’Sobel’);
figure,imshow(ps);
利用Sobel算子对图3-4进行边缘检测后的结果如图3-5所示。

这里写图片描述

(4) 统计像素点位置
人脸特征向量提取的任务是将图像中描述人眼位置的信息提取出来,即统计出划分网格第2行的8个子矩阵中的值为“1”的像素点的个数。具体实现程序如下:
%人脸特征向量提取
%人数
M=20;
%人脸朝向类别数
N=5;
%特征向量提取
pixel_value=feature_extraction(M,N);
其中,feature_extraction为人脸特征向量提取子函数。
提取出的像素点个数用一个100×8的矩阵表示出来,作为LVQ神经网络的输入层。

  • 训练集/测试集产生

图像库中所有图片的特征向量提取出来以后,将100个不同人脸朝向的特征向量作为训练集,测试集为随机抽取的20个不同人脸朝向的图片的特征向量。具体程序如下:
% 训练集/测试集产生
% 产生图像序号的随机序列
rand_label=randperm(M*N);
% 人脸朝向标号
direction_label=repmat(1:N,1,M);
% 训练集
train_label=rand_label(1:100);
P_train=pixel_value(train_label,:)’;
Tc_train=direction_label(train_label);
T_train=ind2vec(Tc_train);
% 测试集
test_label=rand_label(81:end);
P_test=pixel_value(test_label,:)’;
Tc_test=direction_label(test_label);

LVQ神经网络的优点是不需要将输入向量进行归一化、正交化,利用MATLAB自带的神经网络工具箱函数newlvq( )可以构建一个LVQ神经网络。本文中隐含层神经元个数设置为10。由于训练集数据是随机产生的,所以参数PC的设置需要事先计算得出,具体的程序为:
% 创建 LVQ 网络
for i=1:5
rate{i}=length(find(Tc_train==i))/100;
end
net=newlvq(minmax(P_train),10,cell2mat(rate),0.01,’learnlv1’);
% 设置训练参数
net.trainParam.epochs=1000;
net.trainParam.goal=0.001;
net.trainParam.lr=0.1;

  • 训练LVQ网络
    网络创建完毕后,便可以将训练集输入向量送入到网络中,利用MATLAB自带的网络训练函数train( )可以方便地对网络进行训练学习,具体程序为:
    % 训练网络
    net=train(net,P_train,T_train);
  • 人脸识别仿真测试
    网络训练收敛后,便可以对测试集数据进行预测,即对测试集的图像进行人脸朝向识别。对于任意给出的图像,只需要将其特征向量提取出来,便可对其进行识别。本文利用sim( )函数将测试集输入数据送入训练好的神经网络,便可以得到测试集的输出仿真数据,即测试集图像的人脸朝向识别结果。具体程序为:
    % 人脸识别测试
    T_sim=sim(net,P_test);
    Tc_sim=vec2ind(T_sim);
    result=[Tc_test;Tc_sim]

  • 结果显示与分析
    对随机抽取的20幅不同人脸朝向的测试集进行人脸朝向识别后结果见下图
    这里写图片描述
    结果集result的第1行为测试集图像的标准人脸朝向类别,第2行为测试集图像的预测人脸朝向类别。

这里写图片描述

这里写图片描述

以上就是LVQ神经网络在人脸朝向识别中的应用,自己是研一新手,通过上网查资料,一步一步的把它实现出来,并搞懂,只能说,这还是学习第一步,写出来给有兴趣者共享,没看懂的,欢迎私信我。

代码+源程序+图片数据集请前往LVQ神经网络之人脸朝向识别(源程序+图片数据集)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐