今回の記事ではKerasを使って、任意画像を画像分類する方法をご紹介する記事です。データの準備からモデル学習までの流れを解説していきます。初学者でもすぐに理解できるように、サンプルソースを用いて解説していきます。
モデル学習用のデータ作成
画像格納用のフォルダは下記の様に設定する必要があります。
test
├── test1_folder
└── test2_folder
このフォルダ数が要は、識別用のクラスになっているので、識別の要素が4つになる場合は下記の様に変更します。
test
├── test1_folder
└── test2_folder
├── test3_folder
└── test4_folder
このフォルダの元に識別クラスにあたる画像を格納します。
これで下準備は完了ですので、コードを書いていきましょう。
モデル学習
import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Dense, Dropout, Activation, Flatten
import numpy as np
from sklearn.model_selection import train_test_split
from PIL import Image
import glob
#folders = [”このリストは識別用のフォルダ名を記載する”]
#上記の様にtest1~4を識別さえる場合は下記
folders = ['test1_folder','test2_folder','test3_folder','test4_folder']
X = []
Y = []
image_size = 50
# 対象の画像サイズで最終的にリサイズのサイズにもなります。
index = 0
for folder in folders:
files = glob.glob('./[自身の指定フォルダ]'+ str(folder) + '/*.JPG')
#print(files)
for file in files:
#print(file)
image = Image.open(file)
image = image.convert("RGB")
image = image.resize((image_size, image_size))
data = np.asarray(image)
X.append(data)
Y.append(index)
index = index + 1
X = np.array(X)
Y = np.array(Y)
#Xの配列が画像の要素を全て格納するlistになっている
#Yは対応するクラス画像に番号をふるだけのもの
X = X.astype('float32')
X = X / 255.0
# 正解ラベルの形式を変換
Y = np_utils.to_categorical(Y, 16)
# 学習用データとテストデータ
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20)
# CNNを構築
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense([自身のクラス分けする際の数]))
model.add(Activation('softmax'))
# コンパイル
model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=200)
print("完了")
model.save('/[自身の保存したいフォルダパス].hdf5')
print("保存完了")
コードを順に説明していきます。
まずは、任意画像を全て読み込み、Xリストに配列として格納します。
次に、モデルの元となるニューラルネットを作成しコンパイルします。
最後に、そのモデルを学習させます。
こちらで任意画像の識別学習モデルが作成できます。このモデルを使用して画像を分類する方法に関しては別記事で解説いたしますので気になる方は是非参考にしてください。
コメント