魚の画像判定LINE Botを作ってみた
はじめに
ここ最近、LINE Bot開発について学んでおりました。
【ハンズオン】 LINE Bot つくってみた!
【LINE Bot開発】CI/CD環境を構築してみた。
学んだことを使って何か作りたいと思い、いろいろ検索してたところ、
awsのbuilders.flashで魚の画像判定LINE BOTが紹介されていたので挑戦してみました!
参考
以下の記事を参考に作ってみました!
機械学習を使って魚の画像判定アプリを作ってみた!
参考サイトでは、CI/CD パイプラインをGitLabとAWSのCode シリーズを用いてセットアップされていますが、今回はGitHub Actionsを利用してセットアップしました。
完成したもの
フォルダ構成
├── 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に記述されております。
{
"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