目标:虽然已经说过了,还是再说一遍趴。TensorFlow2.0 + CNN + keras + 人脸识别。
即基于TensorFlow2.0使用CNN(卷积神经网络)实现人脸识别。数据集为来自sklearn的datasets的fetch_olivetti_faces。
划重点:我这个是tf2.0
我这个是tf2.0
我这个是tf2.0!!!重要的事情说三遍
好了不多说了,下面贴上源代码
# python环境下通过TensorFlow2.0集成的keras进行人脸识别
import numpy as np
from sklearn import datasets
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
import tensorflow.keras as keras
# 数据准备
# 筛选数据来自sklearn的datasets的fetch_olivetti_faces,只有400张,在cnn训练时,占用时间少,方便测试。
faces = datasets.fetch_olivetti_faces()
# print(faces.images.shape)
i = 0
plt.figure(figsize=(20, 20))
for img in faces.images:
# 总共400张图,把图像分割成20X20
plt.subplot(20, 20, i + 1)
plt.imshow(img, cmap="gray")
# 关闭x,y轴显示
plt.xticks([])
plt.yticks([])
plt.xlabel(faces.target[i])
i = i + 1
# plt.show()
# 人脸数据
X = faces.images
# 人脸对应的标签
y = faces.target
# print(X[0])
# print(y[0])
# 数据预处理
# 首先要reshape一下数据格式,由原本的[一次的训练数量,长,宽],变为[一次的训练数量,长,宽,通道数], 通道数实际上就是深度,我们本次样本是黑白图,所以深度只有1, 如果是RGB彩色照片,通道数就是3,这个通道数也可以自己设计。
X = X.reshape(400, 64, 64, 1)
# 随机分割30%的数据做测试验证的数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 构建模型
model = keras.Sequential()
# 第一层卷积,卷积的数量为128,卷积的高和宽是3x3,激活函数使用relu
model.add(keras.layers.Conv2D(128, kernel_size=3, activation='relu', input_shape=(64, 64, 1)))
# 第二层卷积
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu'))
# 把多维数组压缩成一维,里面的操作可以简单理解为reshape,方便后面Dense使用
model.add(keras.layers.Flatten())
# 对应cnn的全链接层,可以简单理解为把上面的小图汇集起来,进行分类
model.add(keras.layers.Dense(40, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练
model.fit(X_train, y_train, epochs=8)
# 验证
# 先进行预测,发现这里的方法和sklearn很相似。
y_predict = model.predict(X_test)
# 预测后,然后和测试标签进行比对:
print(y_test[0], np.argmax(y_predict[0]))