64. 基于Yale数据集的刷脸识别

2019-11-14  本文已影响0人  十里江城

opencv数据预处理与神经网络实现刷脸识别

import numpy as np
import scipy.io as sio
import tensorflow as tf 
 
    
# 1) 导入数据 
f = open('Yale_64x64.mat', 'rb')  # 打开将Yale人脸数据集转换为matlab的文件
mdict = sio.loadmat(f) # scipy.io读取matlab文件为一个字典
train_data = mdict['fea'] # 读取其中的特征字段
train_label = mdict['gnd'] # 读取其中的类别字段

# 随机排列训练数据和训练标签, 取部分作为测试数据与测试标签
train_data = np.random.permutation(train_data)
train_label = np.random.permutation(train_label)
test_data = train_data[0 : 64]
test_label = train_label[0 : 64]
print("start0")  

# 使用相同参数的seed法,将测试数据与标签对应排列
np.random.seed(100)
test_data = np.random.permutation(test_data)
np.random.seed(100)
test_label = np.random.permutation(test_label)


# 2) 产生训练和测试数据
# 使训练数据为Nx32x32x1维,数据类型为np.float32,归一化( / 255)
train_data = train_data.reshape(train_data.shape[0], 64, 64, 1).astype(np.float32) / 255
train_labels_new = np.zeros((165, 15)) # 15人的165张图片

for i in range(0, 165): # 遍历165张图片
    j = int(train_label[i, 0]) - 1  # 图片对应的人
    train_labels_new[i, j] = 1   # 第i图属第j人

test_data_input = test_data.reshape(test_data.shape[0], 64, 64, 1).astype(np.float32) / 255
test_labels_input = np.zeros((64, 15))  # 测试数据为64张图
for i in range(0, 64):
    j = int(test_label[i, 0]) - 1
    test_labels_input[i, j] = 1
    

# 3) cnn设计与acc计算 使用tf.layers
data_input = tf.placeholder(tf.float32, [None, 64, 64, 1]) # 设置数据的占位符
label_input = tf.placeholder(tf.float32, [None, 15])    # 设置标签的占位符

print("start") 
layer1 = tf.layers.conv2d(inputs =  data_input, filters = 32, kernel_size = 2, 
                        strides = 1, padding = 'SAME', activation = tf.nn.relu)
# strides= 2使行列均减为一半
layer1_pool = tf.layers.max_pooling2d(layer1, pool_size = 2, strides = 2) 

layer2 = tf.reshape(layer1_pool, [-1, 32 * 32 * 32]) # 转为N x 32 x 32 x 32维
layer2_relu = tf.layers.dense(layer2, 1024, tf.nn.relu)  # 全连接层

output = tf.layers.dense(layer2_relu, 15)  # 输出15人

# 设计损失函数  onehot_labels:一值为1其余为0
loss = tf.losses.softmax_cross_entropy(onehot_labels = label_input, logits = output) 
# 梯度下降  每次梯度下降0.01,目的减小loss
train  = tf.train.GradientDescentOptimizer(0.01).minimize(loss)  
# 计算准确度  取第二个值作为准确度(TP+TN)/total
accuracy = tf.metrics.accuracy(labels = tf.argmax(label_input, axis = 1),
                                                  predictions = tf.argmax(output, axis  =  1))[1]  
# 4) run acc
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
with tf.Session() as sess:
    sess.run(init) # 初始化变量
    
    for i in range(0, 200):
        train_data_input = np.array(train_data)
        train_labels_input = np.array(train_labels_new)
        
        sess.run([train, loss], feed_dict = {data_input : train_data_input, label_input : train_labels_input})
        acc = sess.run(accuracy, feed_dict = {data_input : test_data_input, label_input : test_labels_input})
        # 小数点后保留两位有效数字
        print('acc : %.2f' %acc)

print("END")  

准确度收敛过程如下:


image.png
上一篇下一篇

猜你喜欢

热点阅读