ディープラーニングで近藤春菜、角野卓三、マイケルムーアを判別する(Kerasで画像分類)
ライブラリKerasを用い、ディープラーニングの1手法であるCNN(畳み込みニューラルネットワーク)による画像分類を行います。
Kerasはディープラーニングのライブラリであるtensorflowのラッパーです。tensorflowの記述は難易度が高いですがKerasを用いると簡単な記述でディープラーニングを実行できます。
近藤春菜、角野卓三、マイケルムーアの画像を学習させ3者を分類できるか試します。
準備
jupyter notebookファイル(***.ipynb)と同じディレクトリに、フォルダ'keras_image'を作成、さらにその中にフォルダ'Haruna','Takuzo','Moore'を作成し、それぞれのフォルダに近藤春菜、角野卓三、マイケルムーアのjpg画像を保存しました。 画像の枚数は春菜59枚、卓三54枚、ムーア65枚です。
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.7.0
- Keras 2.2.4
- tensorflow 1.13.1
コード
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 folder = ['Haruna','Takuzo','Moore'] image_size = 100 # 画像の読み込み、リサイズ、ndarrayへの格納 X = [] Y = [] for index, name in enumerate(folder): dir = 'keras_image/' + name files = glob.glob(dir + '/*.jpg') for i, file in enumerate(files): 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) # RGBデータの正規化 X = X.astype('float32') X = X / 255.0 # 正解ラベルの形式を変換 Y = np_utils.to_categorical(Y, 3) # 訓練データとテストデータの分配(2割をテストデータへ) 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:])) # レイヤー1 model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) # レイヤー2 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), padding='same')) # レイヤー3 model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) # レイヤー4 model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) # レイヤー5 model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(3)) # レイヤー6 model.add(Activation('softmax')) # コンパイル model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) #訓練 model.fit(X_train, Y_train,batch_size=32, epochs=100) #評価 & 評価結果出力 score = model.evaluate(X_test, Y_test) print('loss=',score[0]) print('accuracy=',score[1])
実行結果
訓練データでの正解率は100%、テストデータでの正解率は88%となりました。
Epoch 1/100
140/140 [==============================] - 10s 75ms/step - loss: 1.0941 - acc: 0.3571
Epoch 10/100
140/140 [==============================] - 9s 64ms/step - loss: 0.7655 - acc: 0.6714
Epoch 20/100
140/140 [==============================] - 10s 72ms/step - loss: 0.4966 - acc: 0.7786
Epoch 30/100
140/140 [==============================] - 9s 63ms/step - loss: 0.3521 - acc: 0.8857
Epoch 40/100
140/140 [==============================] - 9s 64ms/step - loss: 0.2045 - acc: 0.9429 Epoch 50/100
140/140 [==============================] - 9s 64ms/step - loss: 0.1505 - acc: 0.9429
Epoch 60/100
140/140 [==============================] - 9s 63ms/step - loss: 0.1426 - acc: 0.9643
Epoch 70/100
140/140 [==============================] - 9s 64ms/step - loss: 0.1345 - acc: 0.9714
Epoch 80/100
140/140 [==============================] - 9s 63ms/step - loss: 0.0650 - acc: 0.9786
Epoch 90/100
140/140 [==============================] - 9s 63ms/step - loss: 0.0434 - acc: 1.0000
Epoch 100/100
140/140 [==============================] - 9s 63ms/step - loss: 0.0275 - acc: 1.0000
35/35 [==============================] - 1s 25ms/step
loss= 0.20433183312416076
accuracy= 0.8857142857142857
以下のサイトを参考にさせていただきました
Kerasで画像分類~前処理から分類テストまで~
Kerasによる、ものすごくシンプルな画像分類(りんごとオレンジ
KerasのCNNを使用してオリジナル画像で画像認識を行ってみる