Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

ディープラーニングで近藤春菜、角野卓三、マイケルムーアを判別する(Kerasで画像分類)

ライブラリKerasを用い、ディープラーニングの1手法であるCNN(畳み込みニューラルネットワーク)による画像分類を行います。
Kerasはディープラーニングのライブラリであるtensorflowのラッパーです。tensorflowの記述は難易度が高いですがKerasを用いると簡単な記述でディープラーニングを実行できます。
近藤春菜、角野卓三、マイケルムーアの画像を学習させ3者を分類できるか試します。  f:id:T_A_T:20190802103730j:plain
f:id:T_A_T:20190802103804j:plain
f:id:T_A_T:20190802103843j:plain

準備

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を使用してオリジナル画像で画像認識を行ってみる

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村