plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

自前の写真をKerasで学習したい [4/18コード追記]

お久しぶりのらずべりーです。

本業の方で忙しすぎてなかなか更新できずorz

最近は画像の深層学習も比較的手軽にできるようになってきているみたいなので、ちょっとやってみたい!とKerasを導入してみたのですが、Kerasでの画像の取り扱い方法がわからず苦戦して挫折したので、そのあたりを日本語で解説してくれているページをメモ。

qiita.com

www.mathgram.xyz

このあたりを参考にさせていただいて、ぼちぼち取り組んでみたいなー(予定は未定)。

追記 [2018/4/18]

最終的にフォルダ分けを工夫して、ImageDataGeneratorflow_from_directoryを使いました。めちゃ楽!

公式ドキュメントは以下。

画像の前処理 - Keras Documentation

フォルダ分け

フォルダ構造は以下の通り。A, B, Cの3つに分類する場合。

f:id:plant-raspberrypi3:20180418114254p:plain

このフォルダにそれぞれのカテゴリの画像データを入れていくだけ。

コード全文

ちょっと長いですが。説明入りです。

参考にさせていただいたページは以下。

qiita.com

前述の公式ドキュメントを見ながら改変を加えました。モデルはすでに設定してあるものを使っているので別途設定が必要です。(このコードだけでは走りません。注意!)

from keras.preprocessing.image import ImageDataGenerator

img_row,img_col = 100,100 #読み込み時の画像サイズ

train_path = "train/" #trainフォルダのpath
test_path = "test/" #testフォルダのpath

#訓練用のデータのインスタンス
#各画素の情報を0-255から0-1に変換
#画像を歪ませたり拡大縮小したり回したり反転したりして増やす
train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
    rotation_range=180,
        horizontal_flip=True)

#テスト用データのインスタンス
test_datagen = ImageDataGenerator(rescale=1./255)

#フォルダーごとにカテゴリーに分けて訓練用のデータとして読み込めるようにする
train_generator = train_datagen.flow_from_directory(
        train_path,
        target_size=(img_row,img_col),
        batch_size=32,
        class_mode='categorical')

#同様の処理をテストデータにも
test_generator = test_datagen.flow_from_directory(
        test_path,
        target_size=(img_row,img_col),
        batch_size=32,
        class_mode='categorical')

#すでに設定してあるモデルに対して上記訓練データで学習してテストデータで評価
epochs = 20

history = model.fit_generator(
    train_generator,
    samples_per_epoch=300,
    nb_epoch=epochs,
    validation_data=test_generator,
    nb_val_samples=100)