[Python] AI 28 Keras学習モデル png画像からの予測

ネットから入手したファッションアイテム画像について予測してみました。

入手した画像を正方形の背景に埋め込み、リサイズ、グレースケールに変換してから学習モデルに供しました。

正解率は67%でした。Tシャツをシャツと予測ミスしていますが、即席の学習モデルではそんなところでしょう。

import tensorflow.keras as keras
from PIL import Image
import numpy as np
import os,glob,re

labels = ['tshirt','trouser','pullover','dress','coat','sandal','shirt','sneaker','bag','boot']

# 画像ファイル名にはラベル(正解)が含まれている(tshirt1.pngなど)
files = glob.glob('/test/*.png')
print(files)

X = list()
y = list()
for file in files:
    image = Image.open(file)
    image = image.resize((28, 28))
    image = image.convert('L')
    data = np.asarray(image)

    label1 = re.search(r'[a-z]+',os.path.split(file)[1].replace('.png',''))
    label2 = label1.group()
    print(label2)
    label3 = labels.index(label2)
    print(label3)

    X.append(data)
    y.append(label3)

X_test = np.array(X)
# 白黒を反転させる
X_test2 = 255 - np.array(X)
print(X_test2)

y_test = np.array(y)
print(y_test)

model = keras.models.load_model('keras-fmnist-model.h5', compile=True)

y_prob = model.predict(X_test2)
print(y_prob)

y_pred = [ i for prob in y_prob for i,p in enumerate(prob) if p == max(prob)]
# predict_classesは廃止予定
# y_pred = model.predict_classes(X_test2)
print(y_pred)

y_pred2 = np.array(labels)[y_pred]
y_answer = np.array(labels)[y_test]

print(f'予測 {y_pred2} 正解 {y_answer}')
--------------------------------------------------

出力の一部
--------------------------------------------------
[[0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00
  0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.0000000e+00]
 [0.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00
  0.0000000e+00 1.0539890e-37 0.0000000e+00 0.0000000e+00 0.0000000e+00]
 [3.0448330e-03 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00
  0.0000000e+00 9.9695516e-01 0.0000000e+00 0.0000000e+00 0.0000000e+00]]
[9 1 6]
予測 ['boot' 'trouser' 'shirt'] 正解 ['boot' 'trouser' 'tshirt']

[Python] AI 27 Keras学習モデル 訓練, 検証, テスト

Fashion-MNISTを使ったKeras学習モデルでテストするところまで作成しました。訓練回数は30回です。テスト結果はグラフの右上に表示しています。

テストの結果データはhistory.historyにtestキーとして追加し、JSONファイルに保存しています。

import tensorflow.keras as keras
from tensorflow.keras import models
from keras.layers import Dense, Flatten
import matplotlib.pyplot as plt
import time,datetime,os,json

def plot_loss_accuracy_graph(history,eval):
	<略>
	return dt_now_str # グラフ作成日時

def main():
	epochs=30

	# データセット取得
	fashion_mnist = keras.datasets.fashion_mnist
	(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

	print(f'X_train_full.shape {X_train.shape}')
	print(f'X_test.shape {X_test.shape}')

	X_train = X_train / 255.
	X_test = X_test / 255.

	# モデル作成
	model = models.Sequential()
	model.add(Flatten(input_shape=[28, 28]))
	model.add(Dense(300, activation="relu"))
	model.add(Dense(100, activation="relu"))
	model.add(Dense(10, activation="softmax"))

	print(f'model.layers {model.layers}')

	model.summary()

	model.compile(loss="sparse_categorical_crossentropy",
				optimizer="sgd",
				metrics=["accuracy"])

	# 訓練
	history = model.fit(X_train, y_train, epochs=epochs,
						validation_split=0.1)
	print(f'history.history {history.history}')

	# 検証結果
	val_loss = history.history['val_loss'][-1]
	val_accuracy = history.history['val_accuracy'][-1]
	print('val_loss:', val_loss)
	print('val_accuracy:', val_accuracy)

	# テスト
	test = model.evaluate(X_test, y_test)
	print(f'test {test}')

	# グラフ化
	ret = plot_loss_accuracy_graph(history,test)

	test2 = {"test":test}
	history.history.update(**test2)

	json_file = f'{ret}_history_data.json'
	with open(json_file ,'w' ) as f:
		json.dump(history.history ,f ,ensure_ascii=False ,indent=4)

	model.save(f'{ret}_keras-mnist-model.h5')

if __name__ == "__main__":
	start = time.time()
	main()