みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

「Kingyo AI Navi」のアプリ化を考える (5)

昨年3月(2019.3.16)にUrban Data Challenge 2018のファイナルが行われ, CODE for YAMATOKORIYAMAが金魚愛(AI)育成プロジェクトとして取り組んでいる「Kingyo AI Navi」が, アイデア部門の金賞[1]を受賞した.

f:id:moonlight-aska:20190324195724p:plain:w400

受賞を受け, 昨年は「Kingyo AI Navi」のアイデアを実現すべく, LINE x GCPでプロトタイプ開発を進めてきた.


関連記事:
「Kingyo AI Navi」のアプリ化を考える (1)
「Kingyo AI Navi」のアプリ化を考える (2)
「Kingyo AI Navi」のアプリ化を考える (3)
「Kingyo AI Navi」のアプリ化を考える (4)
・「Kingyo AI Navi」のアプリ化を考える (5)
「Kingyo AI Navi」のアプリ化を考える (6)


今回「Kingyo AI Navi」の金魚の種類識別で使用しているGoogleのCloud AutoML Visionの価格改定に伴い, クラウドサービスの利用は難しくなった.
(Cloud AutoML Visionを1か月利用すると約$900かかる.)
そこで, 代替手段を使用してプロトタイプを改良することにした.


1. システムの概要
代替手段として, AutoML Vision Edgeの学習済モデルを使ってローカルで金魚の分類を行うことにした.
これに伴い, 「Kingyo AI Navi」は, 以下のようなシステム構成になる.

f:id:moonlight-aska:20200126173852p:plain


2. AutoML Vision Edgeの利用[2]
AutoML Vision Edgeの学習済モデルをローカルで使用する方法については, こちらの記事を参照してほしい.
ここではLINEのImage Messageをハンドルする部分を紹介する.
主な処理は,
・LINEからの画像を受信して画像分類を行う処理で, tflite modelの予測を使用する.
・ 受信した画像を学習に使用できるように, 予測結果及びスコアをファイル名として保存する.

[コード]

from PIL import Image
from io import BytesIO

  (省略)

# Handle image message
@handler.add(MessageEvent, message=ImageMessage)
def handle_image_message(event):
    message_content = line_bot_api.get_message_content(event.message.id)
    try:
        # 受信した画像をImageオブジェクトに
        image = Image.open(BytesIO(message_content.content))
        # TFLite modelで画像分類
        image_info = tflite.get_info_by_tflite_recog(image)
        if len(image_info) == 0:
            image_info = 'ゴメン! よくわかんな〜い.'
        if isinstance(image_info, str):
            messages = [
		TextSendMessage(text=image_info)
            ]
            filename = get_filename('unknown')
        elif isinstance(image_info, list):
            # 予測結果から応答内容を生成
            messages = make_carousel_template(image_info)
            filename = get_filename(image_info[0]['Label'], image_info[0]['Score'])
        # 受信した画像を保存
        image.save(filename)
        reply_message(event, messages)

    except Exception as e:
        import traceback
        traceback.print_exc()
        reply_message(event, TextSendMessage(text='何か調子が悪いなー.'))


[動作例]
f:id:moonlight-aska:20200126175424p:plain:w300

一応動作するようになった.
しばらくテスト運用してみよう!!

今回は実装していないが, 受信した画像をInstagramへ自動投稿するといった機能も考えていきたい.

----
参照URL:
[1] UDC2018審査結果 | アーバンデータチャレンジ
[2] Cloud AutoML Vision Edgeを試してみる(2) - みらいテックラボ