基于BP神经网络的人脸识别系统设计:包含Matlab源程序、原始图片数据及算法实验说明书
基于BP神经网络的人脸识别系统设计,包含matlab源程序、原始图片数据和算法实验说明书。 采用matlab软件进行设计,基于BP神经网络对人脸进行识别。
凌晨三点的实验室键盘声格外清脆,屏幕荧光里跳动着人脸矩阵。这次要搞的BP神经网络人脸识别系统,就像在教AI认人——只不过教具是Matlab和一堆证件照。别被高大上的名字唬住,咱们先来点实际的。

基于BP神经网络的人脸识别系统设计,包含matlab源程序、原始图片数据和算法实验说明书。 采用matlab软件进行设计,基于BP神经网络对人脸进行识别。
先从数据下手。我习惯把图片统一处理成256x256灰度图,用imread批量导入时记得加个循环:
faceData = [];
for i =1:40
for j=1:10
img = imread(['att_faces/s' num2str(i) '/' num2str(j) '.pgm']);
faceData = [faceData; double(img(:)')];
end
end
这里有个坑要注意:原始像素值0-255直接喂给神经网络容易梯度爆炸。老规矩,归一化走起。别用复杂的,直接(x-min)/(max-min)搞定:
faceData = (faceData - min(faceData(:))) ./ (max(faceData(:)) - min(faceData(:)));
网络结构才是重头戏。三层网络足够应付中小规模数据集,输入层节点数得和图片像素数对齐。隐藏层我一般取输入节点的三分之二,这里取了150个节点,输出层对应40个人的分类:
net = feedforwardnet([150], 'trainscg');
net.layers{1}.transferFcn = 'logsig';
net.layers{2}.transferFcn = 'softmax';
激活函数的选择有讲究。隐层用logsig比tanh收敛更快,输出层softmax配合交叉熵损失函数,分类效果比单纯用sigmoid好很多。参数设置别照搬教科书,learning rate调成0.01,迭代次数控制在500次以内防过拟合:
net.trainParam.lr = 0.01;
net.trainParam.epochs = 300;
net.divideParam.trainRatio = 0.7;
net.divideParam.valRatio = 0.15;
训练过程像坐过山车,loss曲线前50轮骤降,后面开始磨磨蹭蹭。这时候可以祭出早停法(Early Stopping),验证集误差连续10次不降就直接收工。测试阶段记得把混淆矩阵画出来看看哪里翻车:
pred = net(testInputs);
[~,predIndex] = max(pred);
confusionchart(testTargets, predIndex);
跑完实验发现,侧脸和戴眼镜的样本容易识别错误。这时候别急着调参,先检查训练数据是否足够——每个人至少要有10张不同角度的照片。最后封装成GUI时,加个实时摄像头采集功能会更有意思,不过那是另一个故事了。

源码包里我塞了个彩蛋:当识别到自己照片时,会自动播放《难忘今宵》——毕竟调参的夜,确实难忘。(代码见附件train.m)
更多推荐


所有评论(0)