'21/03/23更新:
本記事では、自前の画像を分類する学習器を作成する雛形コードを載せました。kerasを利用したシーケンシャルなコードです。
#####
tensorflow2.4.1で動作確認しています。tensorflow2系のインストール方法は、Anacondaのverによっては、pip install tensorflow で行う必要もありました。anaconda環境で行う場合は仮想環境で行うことをおススメします。
#####
はじめに、お試し用にjpg画像ファイルを作成するのは大変なためにネットから入手する方法です。例えば、手書き数字のjpg画像ファイル群は、Kaggleのhttps://www.kaggle.com/scolianni/mnistasjpgにあるDownloadボタンから、圧縮ファイル「archive.zip」を入手できます。このarchive.zipを展開すると、更に圧縮ファイル「trainingSet.tar.gz」と「testSet.tar.gz」の2つがあります。
trainingSet.tar.gzを展開すると、フォルダ「trainingSet」の中に下図のように「0」~「9」の数字のフォルダがあり、各フォルダ内に各数字のjpg画像ファイルが格納されています。これらを教師データとして学習させることになります。
本プログラム内で上記「trainingSet」のフォルダパスを指定して実行すると、下図のように分類学習器とその重みのデータをバイナリファイルとして保存します。
そして、下図のように学習履歴をグラフで画像ファイルに保存します。
■本プログラム
import os, glob
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 18
def plot_history(history, save_graph_img_path):
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.figure(figsize=(10, 8))
plt.subplot(1, 2, 1)
plt.plot(history.epoch, acc, label='Training Accuracy')
plt.plot(history.epoch, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Accuracy')
plt.xlabel('Epochs')
plt.grid()
plt.subplot(1, 2, 2)
plt.plot(history.epoch, loss, label='Training Loss')
plt.plot(history.epoch, val_loss, label='Validation Loss')
plt.legend(loc='lower left')
plt.title('Loss')
plt.xlabel('Epochs')
plt.grid()
plt.legend()
plt.tight_layout()
plt.savefig(save_graph_img_path)
plt.close()
def main():
data_x = []
data_y = []
for label_data in label_data_list:
label_path, label_no = label_data
file_path_list = glob.glob(label_path + '/*.jpg')
for file_path in file_path_list:
img = img_to_array(load_img(file_path, target_size=(img_width, img_height, img_ch)))
data_x.append(img)
data_y.append(label_no)
x_np = np.asarray(data_x)
y_np = np.asarray(data_y)
x_train, x_test, y_train, y_test = train_test_split(x_np, y_np, test_size=test_size)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train = x_train / 255.0
x_test = x_test / 255.0
y_train = to_categorical(y_train, myclasses)
y_test = to_categorical(y_test, myclasses)
print(r'x train, y_train')
print(x_train.shape, x_train.shape)
print(r'x test, y_test')
print(x_test.shape, y_test.shape)
model = keras.Sequential([
keras.layers.Conv2D(filters = 32,
kernel_size = (3,3),
padding = "same",
activation = "relu",
input_shape = x_train.shape[1:]),
keras.layers.MaxPooling2D(pool_size=(2,2)),
keras.layers.Flatten(),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dropout(drop_rate),
keras.layers.Dense(myclasses, activation='softmax')
])
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(x_train,
y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_split=0.3)
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
plot_history(history, save_graph_img_path = 'history.png')
open('model.json', 'w').write(model.to_json())
model.save_weights('model_weight.hdf5')
if __name__ == '__main__':
print(tf.__version__)
dir_path_for_set_label = './trainingSet'
label_data_list = []
cnt = 0
for dirpath, dirnames, fnames in os.walk(dir_path_for_set_label):
parent_dirname = dirpath.split(os.path.sep)
if len(parent_dirname) >= 2:
label_data_list.append((dirpath, cnt))
cnt += 1
print(label_data_list)
myclasses = len(label_data_list)
print(myclasses)
test_size = 0.3
epochs = 50
batch_size = 16
drop_rate = 0.3
img_width = 28
img_height = 28
img_ch = 3
main()
分類学習器を作成後、これを使用して手書き画像を分類することになります。ここで、もう一方のtestSet.tar.gzを展開すると、testSetというフォルダがひとつあって下図のように0~9のjpg画像ファイルが格納されています。
これを分類する雛形コードは次のリンク先を参照下さい。
hk29.hatenablog.jp
以上
<広告>
リンク
リンク
リンク