ニューラルネットワーク キャベツとレタスの識別

ゆうき( @BASEBALLY15 )です^^

キャベツとレタスの見分けがつかないのですが,何か方法はないのですか・・・?

それでは,AIで判定してみましょう^^

畳み込みニューラルネットワークで精度を検証したいと思います.

(Udemy『画像判定AIアプリ開発・パート1』を参考,AnacondaのSpyderを使用)

ニューラルネットワークとは?

簡単に言うと,人間の脳の動きをコンピュータ上で扱ってみよう!ということです.

例えば,人間の脳の場合,下の図のように数億個の神経細胞(ニューロン)があり,

この複数のニューロンが連結することで,思考や認識などの処理を行っています.

ニューロンの仕組み
(画像をクリックすると,引用元を確認できます.)

これを,コンピュータ上で表したものが下の図です.

写真や文字を読み込むと,複数のニューロンが集まった『層』と呼ばれる内部構造で学習が行われます.

これによって,画像の判別を行うことが出来ます.

ニューラルネットワーク
(画像をクリックすると,引用元を確認できます.)

この技術を使って,今回はキャベツとレタスの判別を行っていきます^^

ニューラルネットワークによって,判別を行ってみよう!

判別で使うデータ

今回の判別では,前回の投稿でご紹介した『Flickr』というサイトの画像を使います.

このサイトから,キャベツとレタスの画像をそれぞれ150枚読み込み,

ニューラルネットワークにょって, 以下の図のように判別を行っていきたいと思います.

キャベツレタス(ニューラルネットワーク)

それでは,コードを見ていきましょう^^

ライブラリ

保存名:veg_cnn.py

import keras

#ニューラルネットワークのモデルを定義するためのライブラリ
from keras.models import Sequential

#畳み込みの処理やプーリングの処理をするためのライブラリ
from keras.layers import Conv2D, MaxPooling2D

#Activationは活性化関数,Dropoutはドロップアウト処理,
#Flattenはデータを1次元に変換,Denseは全結合
from keras.layers import Activation, Dropout, Flatten, Dense

#Yの値を0と1に分割するために使う

from keras.utils import np_utils
import numpy as np

そして,前回の投稿で,全データを学習用とテスト用に分けたので,それを使っていきたいと思います.

コード

まずは,クラスの作成と画像のサイズを指定します.

#クラスを作成
veg_classes = ["cabbage", "lettuce"]


#クラスの数(=2)
num_veg_classes = len(veg_classes)


#画像のサイズを指定
image_size = 50

そして,学習用モデルの関数を作ってきます.

今回は,GitHubというサイトのデータを使い,学習用モデルの関数を作ります.

これからご紹介するコードがニューラルネットワークの肝となる部分です!

###学習用の関数を用意する###
def train_model(X, Y):
    
    model = Sequential()
    #------------------------------------------------
    model.add(Conv2D(32, 
                     kernel_size=(3,3), 
                     padding="same",
                     input_shape=X.shape[1:]))
    
    #マイナスの値を除去
    model.add(Activation("relu"))
    #------------------------------------------------ 
    model.add(Conv2D(32, 
                     kernel_size=(3,3)))
    
    model.add(Activation("relu"))
    
    model.add(MaxPooling2D(pool_size=(2,2))) 
    
    #過学習の抑制(ランダムでニューロンを無効化)
    #偏ったニューロンに依存しないため
    model.add(Dropout(rate=0.25))#25%無効化
    
    
    #------------------------------------------------
    model.add(Conv2D(64, 
                     kernel_size=(3,3), 
                     padding="same"))
    
    model.add(Activation("relu"))
    #------------------------------------------------
    model.add(Conv2D(64, 
                     kernel_size=(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))
    
    model.add(Dense(num_veg_classes))
    
    model.add(Activation("softmax"))
    
    
    #------------------------------------------------
    #オプティマイザーを作成
    opt = keras.optimizers.RMSprop(learning_rate=0.0001, 
                                   decay=1e-6)
    
    #コンパイル
    model.compile(loss="categorical_crossentropy", 
                  optimizer=opt, 
                  metrics=["accuracy"])
    
    #学習
    model.fit(X, Y, batch_size=32, epochs=100)
    
    #モデルの保存
    model.save("./vegetables_cnn.hs")
    
    return model

このコードの説明は今後,別途ご紹介します.

次に,テスト用の関数を作ります.

###テスト用の関数を用意する###
def evaluate_model(model, X, Y):
    
    scores = model.evaluate(X, Y, verbose=1)
    
    print("Test Loss:", scores[0])

    print("Test Accuracy:", scores[1])

そして,学習用とテスト用のデータを一つにまとめたいと思います.

main()という関数を作り,その中で,学習用とテスト用の関数を呼びます.

###メインの関数###
def main():
    #ファイルからデータの配列に読み込む
    X_train, X_test, Y_train, Y_test = np.load("./vegetables.npy", allow_pickle=True)
    
    #読み込んだデータの正規化
    X_train = X_train.astype("float")/256

    X_test = X_test.astype("float")/256
    
    #ラベルを1と0に分ける
    Y_train = np_utils.to_categorical(Y_train, num_veg_classes)

    Y_test = np_utils.to_categorical(Y_test, num_veg_classes)
    
    
    #学習用とテスト用の関数を持ってくる
    model = train_model(X_train, Y_train)

    evaluate_model(model, X_test, Y_test)


if __name__ == "__main__":
    main()

そして,Anaconda Promptを開き,以下の文字を記述します.

  • activate tf140
  • cd Desktop\写真があるディレクトリ名
  • python veg_cnn.py

すると,このように,精度の検証が始まります.

最初は,40%くらいの精度ですが,検証を繰り返すことで,精度が上がっていきます.

最終的には,95%近くまで精度を上げることが出来ています.

全体的な精度としては70%程度なので,さらに向上させていこうと思います.

終わりに

今回は,ニューラルネットワークを使って,キャベツとレタスの判別を行いました.

最終的な精度としては,90%近くあったのですが,全体の精度が70%と,少し低い結果となってしまったので,

今後,さらに精度を上げていこうと思います.

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA