欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-28 17:55:58
1.数据集验证神经网络2.图片验证神经网络3.说明正文:1.数据集验证神经网络上一篇博文已经训练好了神经网络模型,下面就要利用训练好的模型进行验证。由于WIDER FACE数据的集的测试集仅提供了图片,没有给标签,所有这里使用FDDB数据集对WIDER FACE数据基训练的模型进行准确率测试,当然也可以用其他的数据进行评估。首先是加载数据程序,这个程序是对博文6中进行修改的,增加了FDDB数据集选项。def get_image_arrary(image_h, image_w, image_c,...

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的概率比较大就是人脸。

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

3.说明
  1. fddb数据在这里获取,包括所有人脸\非人脸数据以及对应的标签

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

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

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

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

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

相关标签: 人脸检测