[基于tensorflow的人脸检测] 基于神经网络的人脸检测8——验证训练好的神经网络
正文:
1.数据集验证神经网络
上一篇博文已经训练好了神经网络模型,下面就要利用训练好的模型进行验证。由于WIDER FACE数据的集的测试集仅提供了图片,没有给标签,所有这里使用FDDB数据集对WIDER FACE数据基训练的模型进行准确率测试,当然也可以用其他的数据进行评估。
首先是加载数据程序,这个程序是对博文6中进行修改的,增加了FDDB数据集选项。
def get_image_arrary(image_h, image_w, image_c, flag):
"""输入参数:图片的三个维度(神经网络输入维度)"""
#初始化列表
images = []
labels = []
if flag == 'train':
root_path = r"C:\Users\user\Desktop\wider_data" #图片根目录
images_txt = 'train_images.txt' #图片地址文件
labels_txt = 'train_labels.txt' #对应的标签文件
elif flag == 'validation':
root_path = r"C:\Users\user\Desktop\wider_val_data" #图片根目录
images_txt = 'validation_images.txt' #图片地址文件
labels_txt = 'validation_labels.txt' #对应的标签文件
elif flag == 'fddb':
root_path = r"C:\Users\user\Desktop\all_face_data"
images_txt = 'all_face_iamge.txt'
labels_txt = 'all_face_label.txt'
...
return images_array, labels_array
有了数据以后,其次就需要搭建验证框架,数据集验证评估框架和训练框架有相似的地方。不同的是验证评估不需要定义损失函数、不需要优化参数、也无需指定学习率和正则化,除此之外,验证和评估比训练多的就是需要加载模型。模型的加载遵循下面的步骤。
指定加载器 → 获取模型地址 → 加载器根据地址把模型加载到会话 → 在会话中进加载数据进行验证评估
import tensorflow as tf
import numpy as np
from data_save_load import get_image_arrary,get_batch
from alexnet_inference import alexnet #导入网络结构
MODEL_SAVE_PATH = r"C:\Users\user\Desktop\alex_model"
BATCH_SIZE = 100
IMAGE_SIZE = 227
NUM_CHANNELS = 3
OUTPUT_NODE = 2
def evalute():
accuray = []
#获取测试数据
images_test, labels_test = get_image_arrary(
IMAGE_SIZE,
IMAGE_SIZE,
NUM_CHANNELS,
'fddb')
with tf.Graph().as_default() as g:
#定义输入输出格式
x = tf.compat.v1.placeholder(tf.float32,[
BATCH_SIZE,
IMAGE_SIZE,
IMAGE_SIZE,
NUM_CHANNELS],
name='x-input')
y_ = tf.compat.v1.placeholder(tf.float32,[None, OUTPUT_NODE],
name='y-input')
#计算传播结果 测试无需正则 无需dropout
y = alexnet(x,False,None,0.5)
#计算正确率
correct_prediction = tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))
#将布尔值转为实行再计算平均值 即正确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
saver = tf.train.Saver() #初始化加载模型【1】
validate_num = 12954 #验证数据集的个数
for i in range(int(validate_num / BATCH_SIZE)):
with tf.compat.v1.Session() as sess:
#函数直接找到目录中的最新模型【2】
ckpt = tf.train.get_checkpoint_state(
MODEL_SAVE_PATH)
if ckpt and ckpt.model_checkpoint_path:
#加载模型【3】
saver.restore(sess, ckpt.model_checkpoint_path)
#根据batch设置输入结构
testx, testy = get_batch(
BATCH_SIZE,
images_test,
labels_test ,
IMAGE_SIZE,
IMAGE_SIZE,
NUM_CHANNELS,)
#【4】
validate_feed = {x: testx,y_: testy}
validate_acc = sess.run(accuracy,
feed_dict=validate_feed)
accuray.append(validate_acc)
else:
print('No checkpoint file found')
return
print(np.mean(accuray)) # 0.8904651
#主程序
def main(argv=None):
evalute()
if __name__=='__main__':
tf.compat.v1.app.run()
【】内的数字和步骤相对应。
2.图片验证神经网络
图片验证神经网络就是用一张图片进行测试。由于训练出来的神经网络模型是一个人脸/非人脸的二分类器,所以输入到模型的图片应是人脸或是非人脸。而不是这个人的全身照,因为这样做就没有什么意义。另外,在进行图片预处理时,对图片进行了归一化操作,所以一张图片输入到模型之前,应该先进行归一化。除此之外,输入的图片大小(模型的输入大小)应该和训练神经网络时的图片输入大小一样。
下面是输入图片的预处理函数。
import numpy as np
import cv2
def uniform(image_array):
"""归一化函数"""
img_mean = np.mean(image_array)
img_std = np.std(image_array)
uniform_img = (image_array - img_mean) / img_std
return uniform_img
def imput_iamge(image, image_size):
shape=(1, image_size, image_size, 3) #创建数组
images_array = np.zeros(shape,dtype='uint8')
image = cv2.resize(image, (IMAGE_SIZE, IMAGE_SIZE)) #调整大小
image = uniform(image) #归一化
images_array[0] = image
return images_array
结合数据集验证框架,把数据集的加载变成图片的加载,就可以把图片输入到神经网络模型中。下面是图片验证程序。
import tensorflow as tf
import numpy as np
import cv2
from alexnet_inference import alexnet #导入网络结构
IMAGE_SIZE = 227
NUM_CHANNELS = 3
OUTPUT_NODE = 2
MODEL_SAVE_PATH = r"C:\Users\user\Desktop\alex_model" #模型存储地址
def evalute(image):
with tf.Graph().as_default() as g:
input_img = imput_iamge(image,IMAGE_SIZE)
#定义输入输出格式
x = tf.compat.v1.placeholder(tf.float32,[
1, #batch=1
IMAGE_SIZE,
IMAGE_SIZE,
NUM_CHANNELS],
name='x-input')
y = alexnet(x,False,None,0.5)
answer = tf.argmax(y,1)
soft = tf.nn.softmax(y)
saver = tf.train.Saver()
with tf.compat.v1.Session() as sess:
#函数直接找到目录中的最新模型
ckpt = tf.train.get_checkpoint_state(
MODEL_SAVE_PATH)
if ckpt and ckpt.model_checkpoint_path:
#加载模型
saver.restore(sess, ckpt.model_checkpoint_path)
validate_acc = sess.run(answer, {x:input_img})
softmax = sess.run(soft, {x:input_img})
print(softmax) #[[0.00168279 0.99831724]]
if validate_acc==0:
print('非人脸')
else:
print('人脸')
name = 'lena.jpg'
image = cv2.imread(name, 1)
evalute(image) #人脸
经过神经网络的输出是一个1*2维的数组,经过softmax层就可以输出对应的概率值,对比两个概率,哪一个概率较大,就认为神经网络判定输入为哪一个。因为在处理数据标签以及在训练时,认为[0,1]代表人脸,[1,0]代表非人脸,所以若神经网络的输出中,索引下标为0的概率比较大就是非人脸,索引下标为1的概率比较大就是人脸。
3.说明
结语:
如果对你有帮助,就给我一个赞吧,如何有问题,可以在评论区进行讨论。
上一篇:[基于tensorflow的人脸检测] 基于神经网络的人脸检测7——神经网络的训练
本文地址:https://blog.csdn.net/qq_43260356/article/details/107667719