
ゆうき( @BASEBALLY15 )です^^
畳み込みニューラルネットワークについて,勉強していて,何か作品を作りたいです・・・
今回は,畳み込みニューラルネットワークを使って,花の画像から花言葉を表示させるAIを作ったので,紹介しますね^^
ありがとうございます^^

目次
花言葉とは?
花自体に,象徴的な意味を持たせるために与えられた言葉で,
有名なもので,バラの花ことばの「愛情」がある.

花言葉とは?(Wikipediaより)
今回は,
- アヤメ(iris)
- ブドウ(grape)
- カスミソウ(gypsophila)
の3種類の花言葉をAIによって判定してみたいと思います.
AIを使って花言葉を判定してみよう!
まずは,今回のAIによる判定で使った画像を紹介したいと思います.
判定で使った画像
・アヤメ(iris)
花言葉:希望
画像名:ayame1.jpg
・ブドウ( grape )
花言葉:思いやり
画像名:budou1.jpg
・カスミソウ( gypsophila )
花言葉:幸福
画像名:kasumi1.jpg
今回ご紹介するコードまでの流れは,前回の『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つを行っています.
- コマンドプロンプトから花の画像を読み込む.
- 読み込んだ画像を表示する.
- ニューラルネットワークのモデルから,花の画像の判定を行う.
- 花の種類のよって,それぞれの花言葉を表示させる.
(※この関数が実行されることで,判定を行うことが出来ます.)
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 ファイル名 画像名
すると,このように花の画像と,その花言葉が表示されます.

終わりに
今回は,畳み込みニューラルネットワークを使って,花の画像から花言葉を判定してみました.
今まで学習してきた内容に加えて,自分の持っている知識を使うと,簡単に作れるので,
ぜひ,試しに作ってみてください^^
分からないところがあれば,気軽に質問してください⤵