🎣

魚の画像判定LINE Botを作ってみた

2024/10/05に公開

はじめに

ここ最近、LINE Bot開発について学んでおりました。
【ハンズオン】 LINE Bot つくってみた!
【LINE Bot開発】CI/CD環境を構築してみた。
学んだことを使って何か作りたいと思い、いろいろ検索してたところ、
awsのbuilders.flashで魚の画像判定LINE BOTが紹介されていたので挑戦してみました!

参考

以下の記事を参考に作ってみました!
機械学習を使って魚の画像判定アプリを作ってみた!

参考サイトでは、CI/CD パイプラインをGitLabとAWSのCode シリーズを用いてセットアップされていますが、今回はGitHub Actionsを利用してセットアップしました。

完成したもの

https://github.com/kusaka-dev/linebot-biwako-osakana

フォルダ構成

├── functions
│   ├── CallSFN
│   │   ├── callsfn.py
│   │   └── requirements.txt
│   ├── Error
│   │   ├── error.py
│   │   └── requirements.txt
│   ├── LINEImageS3
│   │   ├── lineimages3.py
│   │   └── requirements.txt
│   ├── RekognitionDB
│   │   ├── rekognitiondb.py
│   │   └── requirements.txt
│   └── Reply
│       ├── reply.py
│       └── requirements.txt
├── statemachine
│   └── sfn.asl.json
└── template.yaml

つまずいたところ

応答トークンのルール

【応答トークンは一度のみ使用できる。】というルールに気づかず、「Invalid reply token」がたくさん発生しました。
参考:応答メッセージを送る

対処法としては、、、
初めの返信「アップロードに成功しました」では、
【reply_message】を使用し

次の推論結果の返信では、
任意のタイミングでメッセージを送信できる。
【push_message】を使用しました。

初めて利用したAWSサービス

Step Function

今回、Step Functionを初めて利用しました。
学習には以下の記事を参考にさせていただきました。

Goで体験するAWS SAMとStep Functions:簡単なステップから学ぶ

ワークフローはstatemachine/sfn.asl.jsonに記述されております。

sfn.asl.json
{
    "StartAt": "LINEImageS3",
    
    "States": {
        "LINEImageS3": {
            "Type": "Task",
            "Resource": "${LineS3Function}",
            "Next": "RekognitionDB",
            "Catch":[
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "ErrorFunction",
                    "ResultPath": null
                }
            ]
        },
        "RekognitionDB": {
            "Type": "Task",
            "Resource": "${RekognitionFunction}",
            "Next": "Reply",
            "Catch":[
                {
                    "ErrorEquals": [
                        "States.ALL"
                    ],
                    "Next": "ErrorFunction",
                    "ResultPath": null
                }
            ]
        },
        "ErrorFunction": {
            "Type": "Task",
            "Resource": "${ErrorFunction}",
            "Next": "Reply"
        },
        "Reply": {
            "Type": "Task",
            "Resource": "${ReplyFunction}",
            "End": true
        }
    }
}

AWSコンソール上のイメージ図は以下のようになっていました。

callsfn.pyでStep Funtionが呼び出されます。
初めにLINEImageS3が実行されます。ここでは、送られた画像をS3に保存しています。
成功したら次にRekognitionDBが実行されます。このステップでは保存した画像をRekognition カスタムラベルで推論します。
最後にReplyで推論結果が返信されます。
LINEImageS3・RekognitionDBで何かエラーが発生するとErrorFunctionに移行されるようになっています。ErrorFunctionに移行されるとReplyで「エラーが発生しました。」と返信されます。

Discussion