深度学习之眼睛状态识别混淆矩阵的绘制
本次實驗基于自己搭建的CNN網絡實現眼睛狀態(tài)的分類,本來是打算遷移學習利用VGG16網絡進行分類的,但是實驗效果特別差,而且速度很慢,應該是博主自己的問題。而自己搭建的CNN網絡的模型準確率也很高,運行速度很快。本文的重點在于混淆矩陣的繪制,這是之前沒有接觸過的東西。
1.導入庫
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import os,pathlib,PIL from tensorflow import keras from tensorflow.keras import layers,models,Sequential2.數據加載
數據所在文件路徑
data_dir = "E:/tmp/.keras/datasets/Eye_photos" data_dir = pathlib.Path(data_dir) img_count = len(list(data_dir.glob('*/*.jpg')))#圖片總數超參數的設置
height = 224 width = 224 epochs = 10 batch_size = 64構建一個ImageDataGenerator,在之前的實驗中,我通常在這一步會進行數據加強,包括左右翻轉、圖片翻轉某個角度,水平翻轉等。但是在本次實驗中,并沒有進行這一操作。因為本次識別的眼睛狀態(tài)包括左看、右看、前看、閉眼四種狀態(tài),如果進行數據增強的話,左看變?yōu)橛铱?#xff0c;這樣數據沒有達到增強的效果,反而引入噪聲數據,得不償失。
train_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,validation_split=0.2)#以8:2的比例劃分為訓練集和測試集分為訓練集和測試集
train_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,shuffle=True,class_mode='categorical',subset='training' ) test_ds = train_data_gen.flow_from_directory(directory=data_dir,target_size=(height,width),batch_size=batch_size,shuffle=True,class_mode='categorical',subset='validation' ) Found 3448 images belonging to 4 classes. Found 859 images belonging to 4 classes.查看標簽
all_images_paths = list(data_dir.glob('*'))##”*”匹配0個或多個字符 all_images_paths = [str(path) for path in all_images_paths] all_label_names = [path.split("\\")[5].split(".")[0] for path in all_images_paths] ['close_look', 'forward_look', 'left_look', 'right_look']3.CNN網絡搭建
model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,3,padding="same",activation="relu",input_shape=(height,width,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1024,activation="relu"),tf.keras.layers.Dense(512,activation="relu"),tf.keras.layers.Dense(4,activation="softmax") ])優(yōu)化器的設置,具體的原理可以參考車牌識別那篇博客。
initial_learning_rate = 1e-4 lr_sch = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=initial_learning_rate,decay_rate=0.96,decay_steps=20,staircase=True )計算loss值的方式我在上篇博客中講述了。
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=lr_sch),loss=tf.keras.losses.CategoricalCrossentropy(),metrics=['accuracy'] )history = model.fit(train_ds,validation_data=test_ds,epochs=epochs )結果如下所示:
在epochs=20的情況下,模型的準確率在93%左右,比較可觀。
保存模型:
model.save("E:/tmp/.keras/datasets/model.h5")加載模型
new_model = tf.keras.models.load_model("E:/tmp/.keras/datasets/model.h5")利用模型對圖片進行預測:
plt.figure(figsize=(10,5)) plt.suptitle("預測結果展示") for images,labels in test_ds:for i in range(8):ax = plt.subplot(2,4,i+1)plt.imshow(images[i])img_array = tf.expand_dims(images[i],0)#增加一維pre = new_model.predict(img_array)plt.title(all_label_names[np.argmax(pre)])plt.axis("off")break plt.show()4.混淆矩陣
混淆矩陣也稱誤差矩陣,是表示精度評價的一種標準格式,用n行n列的矩陣形式來表示。在圖像精度評價中,主要用于比較分類結果和實際測得值,可以把分類結果的精度顯示在一個混淆矩陣里面。混淆矩陣是通過將每個實測像元的位置和分類與分類圖像中的相應位置和分類相比較計算的。
我們最熟悉的混淆矩陣就是二分類的混淆矩陣:
TP = True Postive = 真陽性; FP = False Positive = 假陽性
FN = False Negative = 假陰性; TN = True Negative = 真陰性
至于多分類的混淆矩陣,與二分類的混淆矩陣相差不多。我們來繪制眼睛狀態(tài)識別的混淆矩陣。
sns.heatmap是用來繪制混淆矩陣的主要工具,這是seaborn包下面的一個方法,具體如下:
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)其實除了第一個參數data外,其余的參數都是缺省參數,可以不用管。這里的data,如果接收的是干干凈凈的numpy二維數組的話,可以看到行標就是0,1,2,如果是DataFrame,就可以用列名來標記了。
所需要的庫
from sklearn.metrics import confusion_matrix import seaborn as sns import pandas as pd定義一個繪制混淆矩陣的函數
#繪制混淆矩陣 def plot_cm(labels,pre):conf_numpy = confusion_matrix(labels,pre)#根據實際值和預測值繪制混淆矩陣conf_df = pd.DataFrame(conf_numpy,index=all_label_names,columns=all_label_names)#將data和all_label_names制成DataFrameplt.figure(figsize=(8,7))sns.heatmap(conf_df,annot=True,fmt="d",cmap="BuPu")#將data繪制為混淆矩陣plt.title('混淆矩陣',fontsize = 15)plt.ylabel('真實值',fontsize = 14)plt.xlabel('預測值',fontsize = 14)plt.show()得到預測值與實際值
test_pre = [] test_label = [] for images,labels in test_ds:for image,label in zip(images,labels):img_array = tf.expand_dims(image,0)#增加一共維度pre = new_model.predict(img_array)#預測結果test_pre.append(all_label_names[np.argmax(pre)])#將預測結果傳入列表test_label.append(all_label_names[np.argmax(label)])#將真實結果傳入列表break#由于硬件問題。這里我只用了一個batch,一共64張圖片。 plot_cm(test_label,test_pre)#繪制混淆矩陣
努力加油a啊
總結
以上是生活随笔為你收集整理的深度学习之眼睛状态识别混淆矩阵的绘制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在.NET项目中利用FluentVa
- 下一篇: 深度学习之基于GAN实现手写数字生成