天天看點

[基于tensorflow的人臉檢測] 基于神經網絡的人臉檢測8——驗證訓練好的神經網絡

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——神經網絡的訓練

下一篇:[基于tensorflow的人臉檢測] 基于神經網絡的人臉檢測9——人臉檢測