Aidemy 2020/12/13
はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、LINEボットの3つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・画像データを渡された時の処理を追加
学習済みモデルの保存
CIFER-10を転移学習
・今回は、ユーザーから送られた画像について、それが何の画像であるかを判別するLINEチャットボットを作成していく。
・まずは分類したい画像を学習させたモデルを作成する。CIFER-10を転移学習させて作成する。作成したコードは以下に記載するが、詳細は既に「CNN」で学習済みであるので省略する。
LINEチャットボットに学習済みモデルを組み込む
keras
・画像の読み込みはOpenCVの「cv2.imread()」を使うことが多いが、Herokuはこれに対応していないので、今回は「keras.prosessing.image」を使って画像を読み込む。今回はこのうち「load_img()」と「img_to_array()」を使用する。
・load_img()は第一引数に画像のURLを指定する。第二引数以降は任意であり、例えば「color_mode='grayscale'」とすれば画像が白黒で読み込まれ、「target_size」を指定すれば、そのサイズにリサイズされて読み込まれる。
・img_to_array()は引数で渡された画像データをnp.array型にするものである。
・コード
#以下、送信された画像を保存するためのコード
class_label = ["飛行機","自動車","鳥","猫","鹿","犬","蛙","馬","船","トラック"]
graph = tf.get_default_graph()#kerasのバグでこのコードが必要.
model = load_model('my_model.h5')#学習済みモデルをロードする
@handler.add(MessageEvent, message=ImageMessage)
def handle_content_message(event):
global graph
with graph.as_default():
message_content = line_bot_api.get_message_content(event.message.id)
with tempfile.NamedTemporaryFile(dir=static_tmp_path, prefix="jpg" + '-', delete=False) as tf:
for chunk in message_content.iter_content():
tf.write(chunk)
tempfile_path = tf.name
dist_path = tempfile_path + '.' + "jpg"
dist_name = os.path.basename(dist_path)
os.rename(tempfile_path, dist_path)
filepath = os.path.join('static', 'tmp', dist_name)#ユーザから送信された画像のパスが格納されている
#以下、送信された画像をモデルで判別するためのコード
img = image.load_img(filepath, target_size=(32,32))#送信された画像を読み込み、リサイズする
img = image.img_to_array(img)#画像データをndarrayに変換する
data = np.array([img])#モデルは4次元データを受け取るのでnp.array()にimgをリストとして渡し、4次元のデータにする
result = model.predict(data)
predicted = result.argmax()
pred_answer = "これは" + class_label[predicted] + "です"
line_bot_api.reply_message(event.reply_token,TextSendMessage(text= pred_answer))
・ここまで行ったら、Chapter1で行ったときと同じように、herokuにデプロイすることで得られるURLをWebhookに記録して完成である。
今回は以上です。最後まで読んでいただき、ありがとうございました。