AIは画像を完全に判定できるのか

ゆうき( @BASEBALLY15 )です^^

前回に,HSV色度によるキャベツとレタスの判定を行いました.

今回は,サイトなどから画像を持ってきて,その画像がどちらに判定されるのかを検証していきたいと思います.

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

コマンドプロンプト上で画像を判定してみよう!

まず,Googleなどのサイトから,キャベツとレタスの画像を何枚かダウンロードします.

そして,それらの画像がどちらに分類されるのかを検証していきます.

画像判定で使う画像

今回の画像判定では,キャベツの画像を2枚とレタスの画像を2枚用意しました.

キャベツ

画像名:cabetu.jpg

画像名:cabetu2.jpg

キャベツ2

レタス

画像名:letasu.jpg

レタス1

画像名:letasu2.jpg

レタス2
(画像をクリックすると,引用元を確認できます.)

それでは,ライブラリとコードを見ていきましょう^^

ライブラリ

まずは,新しくファイルを作成します.

ファイル名:veg_predict_HSV.py

import sys

from PIL import Image

import numpy as np

import keras

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

#ファイルをロードするためのライブラリ
from keras.models import load_model

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

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

コード

クラスの作成と画像サイズの指定

まずは,クラスの準備と,画像サイズを決めます.

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

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

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

ニューラルネットワークのモデルを作成

そして,ニューラルネットワークのモデルを作ります.

前回と同じく,『関数』として作っていきたいと思います.

GitHub内のサイトを参考にしています.)

###ニューラルネットワークのモデル関数を作成###
def neural_model():
    
    model = Sequential()

    #------------------------------------------------

    model.add(Conv2D(32, 
                     kernel_size=(3,3), 
                     padding="same",
                     input_shape=(50, 50, 3)))
    
    #マイナスの値を除去
    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 = load_model("./vegetables_cnn_HSVver.h5")
    
    return model

メイン関数を作成

次に,コマンドプロンプト上で画像を判定するためのコードを書いていきたいと思います.

###メイン関数を作成###
def main():
    
    image = Image.open(sys.argv[1])
    
    #画像を表示
    show_image = image.show(image)
    
  #読み込んだ画像をHSV形式に変換
    image = image.convert("HSV")

  #画像をリサイズ
    image = image.resize((image_size, image_size))
    
    #数値化
    data = np.asarray(image)
    
  #リストを作成
    X = []

  #リストにdataを追加
    X.append(data)

    #Numpy形式に変換
    X = np.array(X)
    
    #ニューラルネットワークのモデル関数を呼びだす
    model = neural_model()
    
  #予測した結果の0番目を取得
    result = model.predict([X])[0]
    
  #resultの中で,最も大きい値を取得
    pred = result.argmax()
  
  精度を求める
    percentage = int(result[pred]*100)
    
    #実行
    print("{} {} %".format(veg_classes[pred], percentage))   
    
    print("result=", result)
    
    print("pred=",pred)


if __name__ == "__main__":
    main()

それでは,コマンドプロンプト上でキャベツとレタスの画像を判定してみましょう^^

コマンドプロンプト上で実行

まずは,AnaConda Promptを開き,以下の文字を書きます.

  • activate tf140
  • cd Desktop
  • cd vegetables

そして,1枚ずつ,判定を行っていきます.

Anaconda Prompt上で,

python veg_predict_HSV.py cabetu.jpg

と書きます.

すると,このように,判定が行われ,画像も同時に表示されます.

キャベツ1の判定

同じく,他の3枚も判定を行っていきます.

python veg_predict_HSV.py cabetu1.jpg

キャベツ2判定

python veg_predict_HSV.py letasu.jpg

レタス1判定

python veg_predict_HSV.py letasu2.jpg

レタス2判定

終わりに

今回は,キャベツとレタスの画像をコマンドプロンプト上で判定してみました.

前回と同じく,今回も,画像をHSV形式に変換して判定を行いましたが,

画像の枚数を増やすなどすると,判定が難しい画像も高精度で判定できるのではないでしょうか.

ぜひ,試してみてください^^

それでは・・・

Q &A

コメントを残す

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

CAPTCHA