LoginSignup
2
10

More than 5 years have passed since last update.

Kerasを使った画像判定AI

Posted at

概要

画像処理をする AI を作ってみたかったので、とりあえず動物の種類を見分けるためのニューラルネットワークを作った。

開発環境

  • python 3.5

  • keras 2.2.2

使用したライブラリ


# ニューラルネットワークの定義用のモジュール
from keras.models import Sequential
# 畳み込みやプーリングの処理用モジュール
from keras.layers import Conv2D, MaxPooling2D
# 活性化関数、ドロップアウト処理、データを一次元に返還する、全結合層のていぎ
from keras.layers import Activation, Dropout, Flatten, Dense
# numpyデータを扱うモジュール
from keras.utils import np_utils
import keras
import numpy as np

 識別する画像のラベル


# ラベルの設定
classes = ["monkey", "boar", "crow"]
# 0をmonkey,1をboar,2をcrowとする
NumClasses = len(classes)
# 画像の大きさを50ピクセルとする
ImageSize = 50

学習モデル

基本的に活性化関数にはrelu,


def model_train(X, y):
    # モデルの作成
    model = Sequential()
    # 第一層の定義
    # 32個の3*3のフィルター
    # 畳み込み結果が同じサイズになるように畳み込む
    # 入力の形を50*50*3(0番目は枚数なので不要)
    model.add(Conv2D(32, (3, 3), padding='same', input_shape=X.shape[1:]))

    model.add(Activation('relu'))
    # 2層目
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    # プーリングの大きさを2*2(最大値を取り出す)
    model.add(MaxPooling2D(pool_size=(2, 2)))
    # 25%のデータを捨ててデータの偏りをなくす
    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))
    # 出力は3つ(画像が3パターンなので)
    model.add(Dense(3))
    # softmaxを使って確率を計算する
    model.add(Activation('softmax'))
    # 最適化の手法の定義
    opt = keras.optimizers.RMSprop(lr=0.0001, decay=1e-6)
    # モデルの最適化の宣言
    # 損失関数を正解と推定値との誤差を指標にする
    model.compile(loss='categorical_crossentropy',
                  optimizer=opt,
                  metrics=['accuracy'])
    # 一回の学習で32枚、100回学習を行う
    model.fit(X, y, batch_size=32, epochs=100)
    # 結果の保存
    model.save('./animalCNN.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])

main 関数

学習データは事前にanimal.npyという形で事前に作っておいた numpy 配列を使っています。


def main():
    # 生成したnumpy配列を読み込む
    X_train, X_test, Y_train, Y_test = np.load("./animal.npy")
    # データの正規化(0~1に収める)
    # 整数を浮動小数点に変換して255で割る
    X_train = X_train.astype("float")/256
    X_test = X_test.astype("float")/256
    # one-hot-vectorに変換する
    # 正解は1,それ以外は0にする
    # [0,1,2]を[1.0.0][0.1.0][0.0.1]に変換する
    Y_train = np_utils.to_categorical(Y_train, NumClasses)
    Y_test = np_utils.to_categorical(Y_test, NumClasses)
    # モデルの学習
    # 学習データとラベルを引数として渡す
    model = model_train(X_train, Y_train)
    # モデルのトレーニング
    # テストデータと学習データを渡す
    model_eval(model, X_test, Y_test)

    plot_model(model, to_file="model.png")

実行結果

Test Loss 0.9219977560344043
test Accuracy 0.7207207207207207

できた!!!

最後に

kerasでモデルの可視化ができるのてやってみました。
model.png
縦に長い...

2
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
10