基于MATLAB编程的卷积神经网络人脸识别

目录
背影
卷积神经网络CNN的原理
卷积神经网络CNN的定义
卷积神经网络CNN的神经元
卷积神经网络CNN的激活函数
卷积神经网络CNN的传递函数
卷积神经网络CNN人脸分类识别
基本结构
主要参数
MATALB代码
结果图
展望

背影

图像识别是机器学习的难点与方向之一,

卷积神经网络CNN的原理

卷积神经网络CNN的定义

在这里插入图片描述

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”

卷积神经网络CNN的基本结构

基本BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出节点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。误差反传是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据。通过调整输入节点与隐层节点的联接强度和隐层节点与输出节点的联接强度以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。

输入层

卷积神经网络的输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样;二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组 。由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和RGB通道。
与其它神经网络算法类似,由于使用梯度下降算法进行学习,卷积神经网络的输入特征需要进行标准化处理。具体地,在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布于 的原始像素值归一化至 区间 。输入特征的标准化有利于提升卷积神经网络的学习效率和表现。

隐含层

卷积神经网络的隐含层包含卷积层、池化层和全连接层3类常见构筑,在一些更为现代的算法中可能有Inception模块、残差块(residual block)等复杂构筑。在常见构筑中,卷积层和池化层为卷积神经网络特有。卷积层中的卷积核包含权重系数,而池化层不包含权重系数,因此在文献中,池化层可能不被认为是独立的层。以LeNet-5为例,3类常见构筑在隐含层中的顺序通常为:输入-卷积层-池化层-全连接层-输出。

卷积层

卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),类似于一个前馈神经网络的神经元(neuron)。卷积层内每个神经元都与前一层中位置接近的区域的多个神经元相连,区域的大小取决于卷积核的大小,在文献中被称为“感受野(receptive field)”,其含义可类比视觉皮层细胞的感受野 。卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量

池化层(pooling layer)
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制

全连接层(fully-connected layer)
卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层。全连接层位于卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。特征图在全连接层中会失去空间拓扑结构,被展开为向量并通过激励函数

输出层
卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签 。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类 。在图像语义分割中,输出层直接输出每个像素的分类结果

基于卷积神经网络的人脸分类识别

基本模型

创建3层的卷积神经网络
其中卷积核33,池化层22

数据

直接读取ORL人脸库

在这里插入图片描述

MATLAB编程代码

%训练样本集26个英文字母(输入向量和目标向量)
clc;
clear all;
t=zeros(30,5);

for kk=0:29
%p1=ones(28,28);% 初始化28×28的二值图像像素值(全白)
m =strcat(‘ORL人脸库\train’,int2str(kk),‘.bmp’);% 形成训练样本图像的文件名(0~259.bmp)
x=imread(m,‘bmp’);% 读入训练样本图像文件
bw=im2bw(x,0.5);% 将读入的训练样本图像转换为二值图像
bw=im2uint8(bw);
% [i,j]= find(bw==0);% 寻找二值图像中像素值为0(黑)的行号和列号
% imin=min(i);% 寻找二值图像中像素值为0(黑)的最小行号
% imax=max(i);% 寻找二值图像中像素值为0(黑)的最大行号
% jmin=min(j);% 寻找二值图像中像素值为0(黑)的最小列号
% jmax=max(j);% 寻找二值图像中像素值为0(黑)的最大列号
% bw1=bw(imin:imax,jmin:jmax);% 截取图像像素值为0(黑)的最大矩形区域
% % rate=28/max(size(bw1));% 计算截取图像转换为28×28的二值图像的缩放比例(由于缩放比例
% % 大多数情况下不为28的倍数,所以可能存在转换误差)
% bw1=imresize(bw1,[28,28]);% 将截取图像转换为28×28的二值图像
% % [i,j]=size(bw1);% 转换图像的大小
% % i1=round((28-i)/2);% 计算转换图像与标准28×28的图像的左边界差
% % j1=round((28-j)/2);% 计算转换图像与标准28×28的图像的上边界差
% % p1(i1+1:i1+i,j1+1:j1+j)=bw1;% 将截取图像转换为标准的28×28的图像
% p1=bw1;
% p1= -1.p1+ones(28,28);% 反色处理 % 以图像数据形成神经网络输入向量
for m=0:91
p(m
112+1:(m +1)*112,kk+1)=bw(1:112,m+1);
end % 形成神经网络目标向量
switch kk
case{0,5,10,15,20,25,30,35} % 第一个人
t(kk+1,1)=1;
case{1,6,11,16,21,26,31,36} % 第二个人
t(kk+1,2)=1;
case{2,7,12,17,22,27,32,37} % 字母C
t(kk+1,3)=1;
case{3,8,13,18,23,28,33,38} % 字母D
t(kk+1,4)=1;
case{4,9,14,19,24,29,34,39} %字母E
t(kk+1,5)=1;
% case{5,32,57,83,109,135,161,187,213,239} %字母F
% t(kk+1,6)=1;
% case{6,33,58,84,110,136,162,188,214,240} % 字母G
% t(kk+1,7)=1;
% case{7,34,59,85,111,137,163,189,215,241} % 字母H
% t(kk+1,8)=1;
% case{8,35,60,86,112,138,164,190,216,242} % 字母I
% t(kk+1,9)=1;
% case{9,36,61,87,113,139,165,191,217,243} % 字母J
% t(kk+1,10)=1;
% case{10,37,62,88,114,140,166,192,218,244} % 字母K
% t(kk+1,11)=1;
% case{11,38,63,89,115,141,167,193,219,245} % 字母L
% t(kk+1,12)=1;
% case{12,39,64,90,114,142,168,194,220,246} % 字母M
% t(kk+1,13)=1;
% case{13,40,65,91,115,143,169,195,221,247} % 字母N
% t(kk+1,14)=1;
% case{14,41,66,92,116,144,170,196,222,248} % 字母O
% t(kk+1,15)=1;
% case{15,42,67,93,117,145,171,197,223,249} % 字母P
% t(kk+1,16)=1;
% case{16,43,68,94,118,146,172,198,224,250} % 字母Q
% t(kk+1,17)=1;
% case{17,44,69,95,119,147,173,199,225,251} % 字母R
% t(kk+1,18)=1;
% case{18,45,70,96,120,148,174,200,226,252} % 字母S
% t(kk+1,19)=1;
% case{19,46,71,97,121,149,175,201,227,253} %字母T
% t(kk+1,20)=1;
% case{20,47,72,98,122,150,176,202,228,254} % 字母U
% t(kk+1,21)=1;
% case{21,48,73,99,123,151,177,203,229,255} % 字母V
% t(kk+1,22)=1;
% case{22,49,74,100,124,152,178,204,230,256} % 字母W
% t(kk+1,23)=1;
% case{23,50,75,101,125,153,179,205,231,257} % 字母X
% t(kk+1,24)=1;
% case{24,51,76,102,126,154,180,206,232,258} % 字母Y
% t(kk+1,25)=1;
% case{25,52,77,103,127,155,181,207,233,259} % 字母Z
% t(kk+1,26)=1;
end
end

test_y=zeros(10,5);
for k=0:9
%p2=ones(28,28);% 初始化28×28的二值图像像素值(全白)
m2 =strcat(‘ORL人脸库\test’,int2str(k),‘.bmp’);% 形成训练样本图像的文件名(0~89.bmp)
x=imread(m2,‘bmp’);% 读入训练样本图像文件
bw=im2bw(x,0.5);% 将读入的训练样本图像转换为二值图像
bw=im2uint8(bw);
% [i,j]= find(bw==0);% 寻找二值图像中像素值为0(黑)的行号和列号
% imin=min(i);% 寻找二值图像中像素值为0(黑)的最小行号
% imax=max(i);% 寻找二值图像中像素值为0(黑)的最大行号
% jmin=min(j);% 寻找二值图像中像素值为0(黑)的最小列号
% jmax=max(j);% 寻找二值图像中像素值为0(黑)的最大列号
% bw2=bw(imin:imax,jmin:jmax);% 截取图像像素值为0(黑)的最大矩形区域
% % rate=28/max(size(bw1));% 计算截取图像转换为28×28的二值图像的缩放比例(由于缩放比例
% % 大多数情况下不为28的倍数,所以可能存在转换误差)
% bw2=imresize(bw2,[28,28]);% 将截取图像转换为28×28的二值图像
% % [i,j]=size(bw1);% 转换图像的大小
% % i1=round((28-i)/2);% 计算转换图像与标准28×28的图像的左边界差
% % j1=round((28-j)/2);% 计算转换图像与标准28×28的图像的上边界差
% % p1(i1+1:i1+i,j1+1:j1+j)=bw1;% 将截取图像转换为标准的28×28的图像
% p2=bw2;
% p2= -1.p2+ones(28,28);% 反色处理 % 以图像数据形成神经网络输入向量
for m=0:91
test_x(m
112+1:(m +1)*112,k+1)=bw(1:112,m+1);
end % 形成神经网络目标向量
switch k
case{0,5} % 第一个人
test_y(k+1,1)=1;
case{1,6} % 第二个人
test_y(k+1,2)=1;
case{2,7} % 第三个人
test_y(k+1,3)=1;
case{3,8} % 第四个人
test_y(k+1,4)=1;
case{4,9} %第四个人
test_y(k+1,5)=1;
% case{5,31} %字母F
% test_y(k+1,6)=1;
% case{6,32} % 字母G
% test_y(k+1,7)=1;
% case{7,33} % 字母H
% test_y(k+1,8)=1;
% case{8,34} % 字母I
% test_y(k+1,9)=1;
% case{9,35} % 字母J
% test_y(k+1,10)=1;
% case{10,36} % 字母K
% test_y(k+1,11)=1;
% case{11,37} % 字母L
% test_y(k+1,12)=1;
% case{12,38} % 字母M
% test_y(k+1,13)=1;
% case{13,39} % 字母N
% test_y(k+1,14)=1;
% case{14,40} % 字母O
% test_y(k+1,15)=1;
% case{15,41} % 字母P
% test_y(k+1,16)=1;
% case{16,42} % 字母Q
% test_y(k+1,17)=1;
% case{17,43} % 字母R
% test_y(k+1,18)=1;
% case{18,44} % 字母S
% test_y(k+1,19)=1;
% case{19,45} %字母T
% test_y(k+1,20)=1;
% case{20,46} % 字母U
% test_y(k+1,21)=1;
% case{21,47} % 字母V
% test_y(k+1,22)=1;
% case{22,48} % 字母W
% test_y(k+1,23)=1;
% case{23,49} % 字母X
% test_y(k+1,24)=1;
% case{24,50} % 字母Y
% test_y(k+1,25)=1;
% case{25,51} % 字母Z
% test_y(k+1,26)=1;
end
end

%save LT test_x test_y;
save LETTERS p t test_x test_y; % 存储形成的训练样本集(输入向量和目标向量)
disp(‘输入向量和目标向量生成结束!’)

效果图

在这里插入图片描述

结果分析

从效果图上看,CNN卷积神经网络进行图像分类,不需要进行预处理,直接对图像进行分类,准确率可以达到95%以上

展望

CNN是一种深度信念网络,优点在可以处理大输入数据,能训练中自动降维,训练的过程就是降维的过程,缺点是拟合逼近能力不强,收敛面比较平滑,基于这些,可以和其他拟合能力强的神经网络结合,比如极限学习机,RBF等,结合后的神经网络,即可处理大输入数据,又具有无限逼近的能力,有需要扩展的欢迎扫描文章下面的二维码

猜你喜欢

转载自blog.csdn.net/abc991835105/article/details/129762179