knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

ディープラーニングで画像認識 実装(4)、keras CNNで、自前準備した画像の学習(2)


index:

概要

前回は、自前で準備した画像で、ImageDataGenerator flow_from_directory()
を使用して、学習用/ 評価用データを準備しましたが。
評価時の、正解率などが。よく把握できなかったので
画像読み込み処理を含めて、全面的に再作成しました。

今回も、画像データの学習に時間がかかったので
google colabを、使用させて頂きました。(作業pcと比較して、かなり高速でした)

環境

keras : 2.1.3
tensorflow : 1.4
python : 3.5.2

画像データ

フォルダ構成は、前回と同じ
data フォルダ下に配置

train : 学習用
validation : 検証用
を作成し、
各フォルダの下に、
各クラス単位のフォルダ、その下に、学習用の画像を配置

・前処理は、前回と同じ手法で
 train 下に、水増し画像を多目に作成しておきます。

C:\tmp\2017_tmp\python35\tensorflow\img_data_test>tree data
フォルダー パスの一覧:  ボリューム Acer
ボリューム シリアル番号は 7221-E6BF です
C:\TMP\2017_TMP\PYTHON35\TENSORFLOW\IMG_DATA_TEST\DATA
├─train
│  ├─bird
│  ├─cat
│  ├─dog
│  └─flower
└─validation
    ├─bird
    ├─cat
    ├─dog
    └─flower

コード

https://github.com/kuc-arc-f/img_data_test2


・img_loader.py
 data/train , validation の下層
のフォルダを、クラスとして生成し、
画像データは、numpy arrayに変換します。

・train.py
 keras のNN で学習、
 モデルで、ニューロン数は
入力: 128 * 128 * 3
隠れ層: 64
出力層: クラスの数

・エポック数は,30~40 で、
 正解率は、95%以上まで上昇できました。

#モデルを構築
model=Sequential()

model.add(Conv2D(32,(3,3),padding='same',input_shape=(128, 128,3)))
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(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),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(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 ,activation='softmax'))

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

batch_size=32
epoch_num=20
#fit
history=model.fit(x_train,y_train
    ,batch_size=batch_size
    ,nb_epoch=epoch_num
    ,verbose=1,validation_split=0.1)

・評価
predict.py

    # モデルの評価
    loss, acc = model.evaluate(x_test, y_test, verbose=0)
    print('Test loss:', loss)
    print('Test acc:', acc)
    print("#end_acc")

実行ログ

・学習、エポック=30

((264, 128, 128, 3), (264,))
((24, 128, 128, 3), (24,))
dog
24
/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:70: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
Train on 237 samples, validate on 27 samples
Epoch 1/30
237/237 [==============================] - 3s 12ms/step - loss: 2.4715 - acc: 0.3291 - val_loss: 1.7619 - val_acc: 0.0000e+00
Epoch 2/30
237/237 [==============================] - 1s 4ms/step - loss: 1.2486 - acc: 0.4177 - val_loss: 1.3408 - val_acc: 0.0000e+00
Epoch 3/30
237/237 [==============================] - 1s 4ms/step - loss: 1.0142 - acc: 0.4852 - val_loss: 1.6289 - val_acc: 0.0741
Epoch 4/30
237/237 [==============================] - 1s 4ms/step - loss: 0.7425 - acc: 0.6667 - val_loss: 1.0257 - val_acc: 0.3333
Epoch 5/30
237/237 [==============================] - 1s 4ms/step - loss: 0.4779 - acc: 0.8354 - val_loss: 1.0483 - val_acc: 0.4815
Epoch 6/30
237/237 [==============================] - 1s 4ms/step - loss: 0.2758 - acc: 0.8945 - val_loss: 0.8937 - val_acc: 0.7037
Epoch 7/30
237/237 [==============================] - 1s 4ms/step - loss: 0.3764 - acc: 0.8354 - val_loss: 0.4036 - val_acc: 0.8519
Epoch 8/30
237/237 [==============================] - 1s 4ms/step - loss: 0.2776 - acc: 0.8903 - val_loss: 0.4373 - val_acc: 0.7778
Epoch 9/30
237/237 [==============================] - 1s 4ms/step - loss: 0.2141 - acc: 0.9367 - val_loss: 0.5481 - val_acc: 0.8148
Epoch 10/30
237/237 [==============================] - 1s 4ms/step - loss: 0.2487 - acc: 0.8987 - val_loss: 0.6807 - val_acc: 0.7778
Epoch 11/30
237/237 [==============================] - 1s 4ms/step - loss: 0.2253 - acc: 0.9030 - val_loss: 0.4038 - val_acc: 0.8148
Epoch 12/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0826 - acc: 0.9831 - val_loss: 0.8256 - val_acc: 0.7407
Epoch 13/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0598 - acc: 0.9747 - val_loss: 1.3040 - val_acc: 0.5556
Epoch 14/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0431 - acc: 0.9831 - val_loss: 0.6250 - val_acc: 0.7778
Epoch 15/30
237/237 [==============================] - 1s 4ms/step - loss: 0.3783 - acc: 0.8945 - val_loss: 2.8109 - val_acc: 0.1852
Epoch 16/30
237/237 [==============================] - 1s 4ms/step - loss: 0.3372 - acc: 0.9030 - val_loss: 0.4436 - val_acc: 0.8889
Epoch 17/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0945 - acc: 1.0000 - val_loss: 0.9048 - val_acc: 0.6296
Epoch 18/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0356 - acc: 0.9958 - val_loss: 0.5516 - val_acc: 0.7407
Epoch 19/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0263 - acc: 0.9916 - val_loss: 0.3969 - val_acc: 0.8148
Epoch 20/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0127 - acc: 0.9958 - val_loss: 0.5036 - val_acc: 0.8148
Epoch 21/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0073 - acc: 0.9958 - val_loss: 0.5929 - val_acc: 0.8148
Epoch 22/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0123 - acc: 0.9958 - val_loss: 0.5014 - val_acc: 0.8519
Epoch 23/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0783 - acc: 0.9958 - val_loss: 0.3049 - val_acc: 0.8889
Epoch 24/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0062 - acc: 1.0000 - val_loss: 0.7293 - val_acc: 0.8519
Epoch 25/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0058 - acc: 1.0000 - val_loss: 0.6191 - val_acc: 0.8148
Epoch 26/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0049 - acc: 1.0000 - val_loss: 0.4268 - val_acc: 0.8519
Epoch 27/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0056 - acc: 1.0000 - val_loss: 0.3985 - val_acc: 0.8889
Epoch 28/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0011 - acc: 1.0000 - val_loss: 0.5152 - val_acc: 0.8889
Epoch 29/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0714 - acc: 0.9958 - val_loss: 0.6255 - val_acc: 0.8519
Epoch 30/30
237/237 [==============================] - 1s 4ms/step - loss: 0.0013 - acc: 1.0000 - val_loss: 0.7043 - val_acc: 0.7778

・評価
正解: 約 95.83%

('Test loss:', 0.04905049502849579)
('Test acc:', 0.9583333134651184)