当前位置: 移动技术网 > IT编程>开发语言>JavaScript > [基于tensorflow的人脸检测] 基于神经网络的人脸检测8——验证训练好的神经网络

[基于tensorflow的人脸检测] 基于神经网络的人脸检测8——验证训练好的神经网络

2020年07月30日  | 移动技术网IT编程  | 我要评论

1.数据集验证神经网络

2.图片验证神经网络

3.说明

正文:

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.说明
  1. fddb数据在这里获取,包括所有人脸\非人脸数据以及对应的标签

  2. 提供的模型对应的网络结构在这里获取(alexnet_inference)(博文7只是为了说明训练的程序,并没有使用其训练出来的模型)

  3. 验证的图片(lena.jpg)在这里获取

结语:
如果对你有帮助,就给我一个赞吧,如何有问题,可以在评论区进行讨论。

上一篇:[基于tensorflow的人脸检测] 基于神经网络的人脸检测7——神经网络的训练

本文地址:https://blog.csdn.net/qq_43260356/article/details/107667719

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网