基于BP网络的模式识别系统的设计与实现
1.1 题目的主要研究内容
(1)工作的主要描述:
以IMDB-WIKI数据集为基础。利用BP神经网络方法进行训练,对IMDB-WIKI 数据集进行性别的二分类。由于该数据集太过庞大所以选取了该数据集中的3500张图片作为训练集。该系统包含数据读取,数据预处理,PCA降维,人脸特征提取,BP神经网络训练, 测试,训练过程的可视化等。
(2)系统流程图
1.2 题目研究的工作基础或实验条件
(1)硬件环境
Intel(R)Core(TM)*********************.50GHz8.00GB64位操作系统,基于x64的处理器。
(2)软件环境
Python语言
PyTorch深度学习框架
Pycharm开发工具
1.3 数据集描述
IMDB-WIKI这是一个包含20284名人的460723张以及上IMDB 的62328张共计523051张人脸图像的数据集,是目前开源的数据集中量级最大的,它给出了图像中人物的性别和出生时间、照片的拍摄时间等信息。原始的图片很大,分成了9个部分共计100多G,而裁剪出人脸的图片比较小,只有3G 多,因此我使用的是中的3500张图片,233个人的人脸,每个人有15张训练图片,117名男性和115名女性图片。
1.4 特征提取过程描述
在进行特征提取之前首先要对人脸图片进行预处理,先将测试集和训练集图片转化为灰度图,为了减少背景对实验结果的影响,使用OpenCV中继承好的CascadeClassifier级联分类器从原始的灰度图中识别并将人脸切取出来并保存。由于人脸的不规则性,所以切取出来的人脸数据图片的大小并不一致,将图片reshape为200×200的像素大小。处理后的人脸图片如图1所示。
图1.预处理后人脸
在人脸图片预处理后,我们要先将图片集转换为矩阵形式, 接着按行求图片矩阵的均值,即这个训练集的平均脸,计算协方差矩阵和特征向量, 选取部分特征值选取部分特征值,由于这些特征向量对应的特征值的大小不同造成特征脸的清晰度不同,也就是特征值越大,则人脸越“清晰”。所以我们可以将所得到的所有特征脸按照特征值的大小排序,选取累计贡献值大于90%的前k个特征脸,这样一来在尽可能小的影响模型精度的情况下对特征空间降维。所以最后的结果是前62 个特征脸可以保留90%的人脸信息,这62个特征向量就构成了我们需要的特征空间,所以降维后的人脸信息维度是62。选取前62个特征向量如图2所示。最后将降维后的测试集和训练集图片信息保存为.csv文件,方便BP神经网络的分类。
图2.选取前62个特征向量
1.5 分类过程描述
BP神经网络对人脸图片进行分类,首先定义一个标准的BP全连接神经网络,网络一共四层使用Relu函数作为激活函数。用的是交叉熵损失函数,参数优化使用随机梯度下降算法,在训练时先将模型改为训练模式,加载数据,然后进行前向传播并且得到损失函数的值,然后要把上一次的梯度清0,再进行反向传播,然后根据随机梯度下降算法更新相应的参数。记录分类的准确率。之后再在测试集上验证,记录在测试集上的准确率。
1.6 主要程序代码(要求必须有注释)
特征提取:
import cv2
import os
import numpy as np
from PIL import Image
import time
IMAGE_SIZE = (200, 200)
def getAllPath(dirpath, *suffix):
PathArray = []
label = []
for r, ds, fs in os.walk(dirpath):
for fn in fs:
if os.path.splitext(fn)[1] in suffix:
fname = os.path.join(r, fn)
PathArray.append(fname)
label.append(fn[1:4])
return PathArray, label
def LoadData(sourcePath, *suffix):
ImgPaths, label = getAllPath(sourcePath, *suffix)
imageMatrix = []
count = 0
for imgpath in ImgPaths:
count += 1
img = cv2.imread(imgpath, cv2.IMREAD_GRAYSCALE)
# 灰度图矩阵
mats = np.array(img)
# 将灰度矩阵转换为向量
imageMatrix.append(mats.ravel())
imageMatrix = np.array(imageMatrix)
return count, imageMatrix, label
def PcaTest(sourcePath, targetPath_Cas, *suffix):
# count是照片数目,imageMatrix是图片矩阵,label是照片的标签count, imageMatrix, label= LoadData(sourcePath, *suffix)
traib_lable = list(map(int, label))
np.savetxt('train_labl.csv', traib_lable, delimiter=',')
# 数据矩阵,每一列都是一个图像
imageMatrix = np.transpose(imageMatrix)
rows, cols = imageMatrix.shape
imageMatrix = np.mat(imageMatrix)
mean_img = np.mean(imageMatrix, axis=1)
mean_img1 = np.reshape(mean_img, IMAGE_SIZE)
im = Image.fromarray(np.uint8(mean_img1))
im.show()
imageMatrix = imageMatrix - mean_img
# W是特征向量,V是特征向量组(3458 X 3458)
imag_mat = (imageMatrix.T * imageMatrix) / float(count)
W, V = np.linalg.eig(imag_mat)
# V_img是协方差矩阵的特征向量组
V_img = imageMatrix * V
# 降序排序后的索引值
axis = W.argsort()[::-1]
V_img = V_img[:, axis]
number = 0网页设计html代码大全颜
x = sum(W)
for i in range(len(axis)):
number += W[axis[i]]
if float(number) / x > 0.9:
print('累加有效值是:', i) # 累加有效值是62
break
# 取前62个最大特征值对应的特征向量
V_img_finall = V_img[:, :62]
return V_img_finall, imageMatrix, mean_img, label, count
def recognize(TestsourthPath, V_img_finall, imageMatrix, mean_img, train_count, train_lable,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。