【LINEbot】Pythonで女優識別botを作ろう Part5【Bot作成編】

こんにちは!

 

「女優識別botを作ろう」の第5回目かつ最終回となる今回は、前回までに作成した画像識別モデルをLINEbot化する方法を解説していきます。

 

 

 今回の内容

  • 推論用プログラム作成
  • モデルのLINEbot化

 

 

第4回目の記事はこちら。

>>【LINEbot】Pythonで女優識別botを作ろう Part4【モデル構築編】

 

では、さっそく見ていきましょう。

 

LINEbotの基本的な使い方を押さえていない方は、先にこちらの記事を読むことを推奨します。

>>【入門用】PythonによるLINEbot作り方

 

 

 

全体のイメージ

まずは、いきなりコードを確認する前に、全体的な処理手順について軽く確認していきます。

 

ざっくりしたイメージはこんな感じになります。

 

 

実際はサーバー側の処理が面倒だったりするんですけど、まあ大体こんな感じだと思ってもらえればOKです。

 

ちなみに、今回作成するLINEbotプログラムでは、サーバー側のプログラム(app.py)と推論用プログラム(pred.py)は別々のファイルとして作成します。

 

上の図で言うところの右の2つが別々のファイルで処理を行います。

サーバー側のファイルで推論用のファイルをインポートするだけですね。

 

では、次の章から実際のコードを見ていきます。

 

 

推論用コード

ここでは、推論用コードを確認します。

 

 

既にモデル構築編までの記事を読んだ方であれば、このコードの説明はほとんど必要ないかと思います。

なので、ここではポイントだけを説明します。

 

49行目に pred_actress という関数があります。

 

この関数の引数として画像配列を渡すことで、関数内で推論を行っています。

 

処理の流れとしては、まず受け取った画像配列に前処理をかけ、次に学習済みモデルに入力します。

出力されたスコアのsoftmaxを計算することで、推論結果を確率に変換しています。

 

これにより推論結果が表す女優名と、その確率を返り値として吐き出します。

 

内容自体は特に難しいことは行っていないため、こちらのコードの説明はここまでとします。

 

スポンサーリンク

 

サーバー側のコード

では、ここではサーバー側のコードを確認します。

 

 

ちょっと長いですが、ブロックごとで役割が分担されているので順を追って見ていきましょう。

 

まずは各関数の役割を確認した後、どのようにプログラムが動くのかを確認します。

 

 各関数の役割

  • save_img :画像の保存を行う
  • calc_score: LINEbotで出力する内容を取得する
  • handle_image:画像受け取ると呼び出される関数。
    内部で上の2つの関数を実行する。

 

プログラムの流れは以下のようになります。

ちなみに、これが最初に紹介したイメージ図の、サーバ側で行う処理になります。

 

 

ごちゃごちゃしてる気もしますが、単純に考えるとhandle_image関数内で受け取った画像の予測結果を求めて、それをLINEbotで表示しているだけです。

 

今はよくわからなくても、コードを何度か見てみればわかると思います。

 

ちなみに、画像を一時保存するのは、LINEbotから送られてきたデータの形式だとうまくモデルへ入力できないため、一度画像データとして保存しています。

 

では、ここからは各関数の中身を見ていきます。

 

まずは、32~38行目にある save_img関数から見てみましょう。

 

これは、 message_content = line_bot_api.get_message_content(message_id) の部分で、受信したデータ(ここでは画像データ)を message_contentという変数に格納しています。

 

その後、 with open()を用いて指定したパスに画像データを書き込みます。

これでひとまず画像の一時保存は完了です。

 

 

次に、42~47行目にある calc_score 関数を見ていきます。

 

まず、 pred_name, pred_score = pred.pred_actress(src_img_path) の部分で、先ほど保存した画像から女優名と、その確率をそれぞれ取得します。

 

pred_actress 関数は、推論用コードで紹介した関数ですね。

 

それぞれの情報を取得したら、すぐ下の行で確率を%表記に変換しています。

あとは、あらかじめ用意していたテンプレートに値を代入して、返り値として渡します。

 

 

最後は75~90行目にある handle_image 関数を見ていきます。

見ると言っても、LINEbot側で文字を出力するだけなので、先にLINEbotの記事を読んでいればさほど難しいことはありません。

 

 

80,81行目で上で見た2つの関数を使って、すでに出力用のテキストを生成しています。

 

後は、84~87行目でLINEbot側にテキストを送信して終わりです。

 

これでLINEbot側では、画像から予測した女優の名前とその確率が表示されます。

 

これでbot作成は終了です!

 

スポンサーリンク

 

おわりに

ここまで全部で5つに分けて「女優識別bot」の解説をしてきましたが、いかがだったでしょうか。

 

コードを全て解説しようとすると、かなりの労力になるためところどころ抜粋したのですが、ポイントは押さえてきたつもりです。

 

今回扱ったものは「女優識別」という限定的なものですが、自分でオリジナルbotを作る場合でも基本的な考え方は同じなので是非試してみてください。

 

では、お疲れさまでした。

 

 

P.S.

このコードを書いた時期はまだPyTorchの基本的な使い方しか知らない状態だったので、今見返すと汚いコードがいくつかありました、、

余裕があるときに修正します。