1
1

More than 3 years have passed since last update.

LINEボット3 画像識別チャットボット開発

Posted at

Aidemy 2020/12/13

はじめに

 こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
 今回は、LINEボットの3つ目の投稿になります。どうぞよろしくお願いします。

*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・画像データを渡された時の処理を追加

学習済みモデルの保存

CIFER-10を転移学習

・今回は、ユーザーから送られた画像について、それが何の画像であるかを判別するLINEチャットボットを作成していく。
・まずは分類したい画像を学習させたモデルを作成するCIFER-10を転移学習させて作成する。作成したコードは以下に記載するが、詳細は既に「CNN」で学習済みであるので省略する。

・コードスクリーンショット 2020-12-13 22.33.27.png

スクリーンショット 2020-12-13 22.33.44.png

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に記録して完成である。

今回は以上です。最後まで読んでいただき、ありがとうございました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1