ここでは、画像データの数値化を行っていきます。
画像データの数値化
Pillowのインストール
まず、画像のデータ化をするために、画像処理ライブラリPillowをインストールしていきます。
以下のようにして、"pip install pillow"とPillowをインストールします。

scikit-learnのインストール
次に、機械学習用のライブラリのskleranを"pip install sklearn"としてインストールしておきます。

画像の数値化
画像データを数値化していくためのプログラムが以下のようになります。また、機械学習のトレーニング用データと結果を評価するためのテストデータの2つに分ける処理がプログラムにあります。
from PIL import Image
import os,glob
import numpy as np
from sklearn import model_selection
image_path = "./image"
classes = os.listdir(image_path)
image_size = 50
X = []
Y = []
for index,classlabel in enumerate(classes):
photos_dir = "./image/" + classlabel
files = glob.glob(photos_dir + "/*.jpg")
for i,file in enumerate(files):
if i > 300: break
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)
X = np.array(X)
Y = np.array(Y)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, Y)
xy = (X_train, X_test, y_train, y_test)
np.save("./image_data.npy", xy)
Kerasのインストール
まず、"pip install keras"としてKerasをインストールします。

そして畳み込み処理をするプログラムが以下となります。
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np
import os
image_path = "./image"
classes = os.listdir(image_path)
num_classes = len(classes)
image_size = 50
def main():
X_train, X_test, y_train, y_test = np.load("./image_data.npy")
X_train = X_train.astype("float") / 256
X_test = X_test.astype("float") / 256
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
model = model_train(X_train, y_train)
model_eval(model, X_test, y_test)
def model_train(X, y):
model = Sequential()
model.add(Conv2D(32,(3,3), padding='same',input_shape=X.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(num_classes))
model.add(Activation('softmax'))
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])
model.fit(X, y, batch_size=32, epochs=100)
model.save('./image_cnn.h5')
return model
def model_eval(model, X, y):
scores = model.evaluate(X, y, verbose=1)
print('Test Loss: ', scores[0])
print('Test Accuracy: ', scores[1])
if __name__ == "__main__":
main()
上のプログラムを実行する前に、imageの中に"tiger"以外のフォルダを作って画像を保存しておきます。
画像フォルダの数はいくつでも良いですが、多すぎると処理に時間がかかってしまうので、今回は3つだけ用意しました。

"python gen_data.py"と実行すると、新しく画像フォルダの数値化されたファイル"image_data.npy"が作成されます。


先の畳み込み処理を実行していきます。"python image_cnn.py"と実行します。

このように、最後までプログラムが実行できれば成功です。
右側のデータから最終的に訓練用のデータのaccuracyが99%に達していますが、下側のデータからテスト用のデータではaccuracyが79%となっています。まだ改善の余地がありそうですね。プログラムの改善は後で考えることにします。

もし実行しても上手くいかないときは、一度コンピュータを再起動することでできる可能性があるので、もう一度実行してみてください。