AIによる花言葉の判定

ゆうき( @BASEBALLY15 )です^^

畳み込みニューラルネットワークについて,勉強していて,何か作品を作りたいです・・・

今回は,畳み込みニューラルネットワークを使って,花の画像から花言葉を表示させるAIを作ったので,紹介しますね^^

ありがとうございます^^

花言葉とは?

花自体に,象徴的な意味を持たせるために与えられた言葉で,

有名なもので,バラの花ことばの「愛情」がある.

バラの花言葉

花言葉とは?(Wikipediaより)

今回は,

  • アヤメ(iris)
  • ブドウ(grape)
  • カスミソウ(gypsophila)

の3種類の花言葉をAIによって判定してみたいと思います.

AIを使って花言葉を判定してみよう!

まずは,今回のAIによる判定で使った画像を紹介したいと思います.

判定で使った画像

・アヤメ(iris)

花言葉:希望

画像名:ayame1.jpg

アヤメの花言葉をAIによって判定
(画像をクリックすると,引用元を確認できます.)

・ブドウ( grape )

花言葉:思いやり

画像名:budou1.jpg

ブドウの花言葉をAIによって判定
(画像をクリックすると,引用元を確認できます.)

・カスミソウ( gypsophila )

花言葉:幸福

画像名:kasumi1.jpg

カスミソウの花言葉をAIによって判定
(画像をクリックすると,引用元を確認できます.)

今回ご紹介するコードまでの流れは,前回の『AIによるキャベツとレタスの判定』と同じなので割愛させていただきます.

今回ご紹介するコードまでの流れ

1. Flickrという無料の画像サイトからAPIを取得し,画像をダウンロードする.

2.ダウンロードした画像を学習用とテスト用に分ける.

3.畳み込みニューラルネットワークによって,学習用とテスト用に分けたデータの精度を検証する.

まずは,上の3つの記事を読んでから,今回の記事を読んでいただくと,理解しやすいのではないかと思います.

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

ライブラリ

ファイル名:f_predict_aug.py

#画像の処理を行うためのライブラリ
from PIL import Image

import numpy as np

#コマンドプロンプトから文字を取り出すためのライブラリ
import sys

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

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

コード

花言葉とクラスを作る

最初に,それぞれの花言葉とクラスを作ります.

また,読み込む画像のサイズも決めておきます.

#花言葉集
word1 = "希望"

word2 = "思いやり"

word3 = "幸福"


#クラスを作成
f_classes = ["iris", "grape", "gypsophila"]

f_japanese = ["アヤメ", "ブドウ", "カスミソウ"]


#クラスの数(=アヤメ,ブドウ,カスミソウの3つ)
num_f_classes = len(f_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_f_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("./flower_cnn.h5")
    
    return model

そして,メインとなる関数を作ります.

メインとなる関数を作る

この関数では,以下の4つを行っています.

  1. コマンドプロンプトから花の画像を読み込む.
  2. 読み込んだ画像を表示する.
  3. ニューラルネットワークのモデルから,花の画像の判定を行う.
  4. 花の種類のよって,それぞれの花言葉を表示させる.

(※この関数が実行されることで,判定を行うことが出来ます.)

def main():
    #コマンドプロンプトの2番目の引数
    image = Image.open(sys.argv[1])
    
    #画像を表示
    show_image = image.show(image)
    
    #RGB値に変換する
    image = image.convert("RGB")
    #リサイズ
    image = image.resize((image_size, image_size))
    
    #画像を数値に変換する
    data = np.asarray(image)
    
    #リストを用意
    X = []
    
    #Xにdataを入れる
    X.append(data)
    
    #XをTensorFlowが扱いやすいようにNumpy型に変換する
    X = np.array(X)
    
    #ニューラルネットワークのモデル関数を呼び出す
    model = neural_model()
    
    #画像をニューラルネットワークのモデルから予測する
    result = model.predict([X])[0]
    
    #一番値の大きい配列の添え字を返す
    pred = result.argmax()
    
    #精度を求める(?)
    percentage = int(result[pred]*100)
    
    #結果を表示
    print("\n{0} {1} %".format(f_classes[pred], percentage))
    
    
    #花言葉を表示
    if f_classes[pred] == "iris":
        
        print("\n{0}の花言葉は『{1}』です.".format(f_japanese[pred], word1))
        
    elif f_classes[pred] == "grape":
        
        print("\n{0}の花言葉は『{1}』です.".format(f_japanese[pred], word2))
    
    elif f_classes[pred] == "gypsophila":
        
        print("\n{0}の花言葉は『{1}』です.".format(f_japanese[pred], word3))
          

# コマンドプロンプト上で実行  
if __name__ == "__main__":
    main()

Anaconda Promptで実行する

最後に,Anaconda Promptを開き,以下の文字を書きます.

  • activate tf140
  • cd ファイルが存在するディレクトリ名
  • python ファイル名 画像名

すると,このように花の画像と,その花言葉が表示されます.

AIによる花言葉の判定

終わりに

今回は,畳み込みニューラルネットワークを使って,花の画像から花言葉を判定してみました.

今まで学習してきた内容に加えて,自分の持っている知識を使うと,簡単に作れるので,

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

分からないところがあれば,気軽に質問してください⤵

Q &A

コメントを残す

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

CAPTCHA