
ゆうき( @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%と,少し低い結果となってしまったので,
今後,さらに精度を上げていこうと思います.
それでは・・・