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.說明
- fddb資料在這裡擷取,包括所有人臉\非人臉資料以及對應的标簽
- 提供的模型對應的網絡結構在這裡擷取(alexnet_inference)(博文7隻是為了說明訓練的程式,并沒有使用其訓練出來的模型)
- 驗證的圖檔(lena.jpg)在這裡擷取
結語:
如果對你有幫助,就給我一個贊吧,如何有問題,可以在評論區進行讨論。
上一篇:[基于tensorflow的人臉檢測] 基于神經網絡的人臉檢測7——神經網絡的訓練
下一篇:[基于tensorflow的人臉檢測] 基于神經網絡的人臉檢測9——人臉檢測