【Python深度学习】Tensorflow+CNN进行人脸识别实战(附源码和数据集)
admin 阅读: 2024-03-23
后台-插件-广告管理-内容页头部广告(手机) |
需要源码和数据集请点赞关注收藏后评论区留言私信~~~
下面利用tensorflow平台进行人脸识别实战,使用的是Olivetti Faces人脸图像 部分数据集展示如下
程序训练过程如下
接下来训练CNN模型 可以看到训练进度和损失值变化
接下来展示人脸识别结果
程序会根据一张图片自动去图片集中寻找相似的人脸 如上图所示
部分代码如下 需要全部源码和数据集请点赞关注收藏后评论区留言私信~~~
- from os import listdir
- import numpy as np
- from PIL import Image
- import cv2
- from tensorflow.keras.models import Sequential, load_model
- from tensorflow.keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
- from sklearn.model_selection import train_test_split
- from tensorflow.python.keras.utils import np_utils
- # 读取人脸图片数据
- def img2vector(fileNamestr):
- # 创建向量
- returnVect = np.zeros((57,47))
- image = Image.open(fileNamestr).convert('L')
- img = np.asarray(image).reshape(57,47)
- return img
- # 制作人脸数据集
- def GetDataset(imgDataDir):
- print('| Step1 |: Get dataset...')
- imgDataDir='faces_4/'
- FileDir = listdir(imgDataDir)
- m = len(FileDir)
- imgarray=[]
- hwLabels=[]
- hwdata=[]
- # 逐个读取图片文件
- for i in range(m):
- # 提取子目录
- className=i
- subdirName='faces_4/'+str(FileDir[i])+'/'
- fileNames = listdir(subdirName)
- lenFiles=len(fileNames)
- # 提取文件名
- for j in range(lenFiles):
- fileNamestr = subdirName+fileNames[j]
- hwLabels.append(className)
- imgarray=img2vector(fileNamestr)
- hwdata.append(imgarray)
- hwdata = np.array(hwdata)
- return hwdata,hwLabels,6
- # CNN模型类
- class MyCNN(object):
- FILE_PATH = "face_recognition.h5" # 模型存储/读取目录
- picHeight = 57 # 模型的人脸图片长47,宽57
- picWidth = 47
- def __init__(self):
- self.model = None
- # 获取训练数据集
- def read_trainData(self, dataset):
- self.dataset = dataset
- # 建立Sequential模型,并赋予参数
- def build_model(self):
- print('| Step2 |: Init CNN model...')
- self.model = Sequential()
- print('self.dataset.X_train.shape[1:]',self.dataset.X_train.shape[1:])
- self.model.add( Convolution2D( filters=32,
- kernel_size=(5, 5),
- padding='same',
- #dim_ordering='th',
- input_shape=self.dataset.X_train.shape[1:]))
- self.model.add(Activation('relu'))
- self.model.add( MaxPooling2D(pool_size=(2, 2),
- strides=(2, 2),
- padding='same' ) )
- self.model.add(Convolution2D(filters=64,
- kernel_size=(5, 5),
- padding='same') )
- self.model.add(Activation('relu'))
- self.model.add(MaxPooling2D(pool_size=(2, 2),
- strides=(2, 2),
- padding='same') )
- self.model.add(Flatten())
- self.model.add(Dense(512))
- self.model.add(Activation('relu'))
- self.model.add(Dense(self.dataset.num_classes))
- self.model.add(Activation('softmax'))
- self.model.summary()
- # 模型训练
- def train_model(self):
- print('| Step3 |: Train CNN model...')
- self.model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
- # epochs:训练代次、batch_size:每次训练样本数
- self.model.fit(self.dataset.X_train, self.dataset.Y_train, epochs=10, batch_size=20)
- def evaluate_model(self):
- loss, accuracy = self.model.evaluate(self.dataset.X_test, self.dataset.Y_test)
- print('| Step4 |: Evaluate performance...')
- print('===================================')
- print('Loss Value is :', loss)
- print('Accuracy Value is :', accuracy)
- def save(self, file_path=FILE_PATH):
- print('| Step5 |: Save model...')
- self.model.save(file_path)
- print('Model ',file_path,'is succeesfuly saved.')
- # 建立一个用于存储和格式化读取训练数据的类
- class DataSet(object):
- def __init__(self, path):
- self.num_classes = None
- self.X_train = None
- self.X_test = None
- self.Y_train = None
- self.Y_test = None
- self.picWidth = 47
- self.picHeight = 57
- self.makeDataSet(path) # 在这个类初始化的过程中读取path下的训练数据
- def makeDataSet(self, path):
- # 根据指定路径读取出图片、标签和类别数
- imgs, labels, clasNum = GetDataset(path)
- # 将数据集打乱随机分组
- X_train, X_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.2,random_state=1)
- # 重新格式化和标准化
- X_train = X_train.reshape(X_train.shape[0], 1, self.picHeight, self.picWidth) / 255.0
- X_test = X_test.reshape(X_test.shape[0], 1, self.picHeight, self.picWidth) / 255.0
- X_train = X_train.astype('float32')
- X_test = X_test.astype('float32')
- # 将labels转成 binary class matrices
- Y_train = np_utils.to_categorical(y_train, num_classes=clasNum)
- Y_test = np_utils.to_categorical(y_test, num_classes=clasNum)
- # 将格式化后的数据赋值给类的属性上
- self.X_train = X_train
- self.X_test = X_test
- self.Y_train = Y_train
- self.Y_test = Y_test
- self.num_classes = clasNum
- # 人脸图片目录
- dataset = DataSet('faces_4/')
- model = MyCNN()
- model.read_trainData(dataset)
- model.build_model()
- model.train_model()
- model.evaluate_model()
- model.save()
创作不易 觉得有帮助请点赞关注收藏~~~
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |