【AWS関連】AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築

概要

AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築を行います。機械学習の推論モデルをAWS Lambdaを用いて構築することにより、コストの軽減を目指します。

以下の記事を参考にさせていただいています。

https://zenn.dev/gokauz/articles/72e543796a6423

リポジトリの内容の更新や、API Gatewayからの利用方法の追記などを行なっています。

Lambdaへの関数登録

以下のGitHubリポジトリをクローンします。

git clone https://github.com/ldasjp8/yolov5-lambda.git

ローカルで実行する

次に、venvを用いて仮想環境を作成して、モジュールをインストールします。

cd yolov5-lambda
python -m venv venv
source venv/bin/activate
cd yolov5
pip install --upgrade pip
pip install -r requirements.txt

その後、以下を実行すると、物体検出結果のjsonデータが出力されます。

python app.py

デプロイ

冒頭で述べた通り、以下の記事の成果を利用させていただいています。

https://zenn.dev/gokauz/articles/72e543796a6423

ここでは、Jupyter Notebookを利用します。

cd ../
jupyter notebook

Jupyter Notebookが起動した後、以下のbuild_and_test.ipynbを選択して、手順の通りに実行します。

今回作成したリポジトリで変更した点として、まずconf.jsonファイルをロードするようにしています。

cloneしたリポジトリconf.json.templateを格納していますので、conf.jsonに名前を変えて、profile項目に、AWS CLIにプロファイル名を与えてください。

mv conf.json.template conf.json
code conf.json

Notebookの実行にあたっては、dockerを起動しておく必要があります。

(オプション)AWS Lambdaでのテスト実行

以下、AWS Lambdaでのテストの実行方法を示します。なお、上記のNotebook内で推論まで実行するため、本作業は必須ではありません。(私の備忘録です。)

Lambdaの関数ページにアクセスし、「テスト」タブを選択します。

そして、以下に示すように、テンプレートで「agigateway-aws-proxy」を選択し、サンプルとして利用する画像のbase64エンコードされた文字列を、body項目に与えます。画像のbase64エンコードされた文字列の作成については、上記のNotebookの「推論してみる」の項目にありますので、参考にしてください。

以下のように実行結果を確認することができます。

API Gatewayの設定

API Gatewayの「APIを作成」から、REST APIの「構築」をクリックし、

API名を与えて、「APIの作成」ボタンをクリックします。

リソースの作成

今回は、「detect」というリソースを作成します。以下のように、「アクション」>「リソースの作成」を選択し、リソース名に「detect」を与えて「リソースの作成」ボタンをクリックします。

メソッドの作成

次に、「POST」メソッドの作成を行います。以下のように、「アクション」>「メソッドの作成」から、「POST」を入力します。

以下のメソッドのセットアップ画面において、「Lambda プロキシ統合の使用」にチェックを入れ、「Lambda関数」に作成したLambda関数の名前を入力して保存します。

以下のように、権限を追加するダイアログが表示されるため、「OK」ボタンを押します。

次に「メソッドリクエスト」を選択して、

「HTTP リクエストヘッダー」に「Content-Type」を追加します。

次に、画面左の「設定」を選択して、「バイナリメディアタイプ」に「/」を与えます。(これは用途に応じて設定を変更してください。)

次に、画面左の「リソース」を選択して、テストを選択します。

そして、リクエスト本文に以下の値を入力して、「テスト」ボタンをクリックします。

その結果、以下のような結果が得られたら成功です。

APIのデプロイ

テストが完了したら、「APIのデプロイ」を選択して、

ステージ名(例:dev)を与えて、「デプロイ」をクリックします。

その結果、以下のように、URLが発行されます。

そのURLを用いて、以下のように画像をpostして、結果が得られれば成功です。

curl --data-binary @bus.jpg  https://z7weh36vfg.execute-api.us-east-1.amazonaws.com/dev/detect

以下のGoogle Colabでも試すことができます。

https://colab.research.google.com/drive/1f0hUKi6Z6t0-zXaAwDW-j8fqshi43K8J?usp=sharing

カスタムドメインの設定

API Gateway

以下のように、「カスタムドメイン名」を選択して、「作成」ボタンを選択します。

そして、以下のように、「ドメイン名」の入力や、エンドポイントタイプやACM証明書を設定します。

その後に遷移する以下の画面において、タブ「APIマッピング」を選択し、画面右の「APIマッピング設定」を選択します。

そして、先ほど作成したAPI名やステージ名を入力して保存します。

Route 53

Route 53において、先に指定したカスタムドメイン名に基づき、情報を入力します。

その結果、以下のように、APIをカスタムドメインで公開することができます。

curl --data-binary @bus.jpg https://yolov5-lambda.hi-dd.com/detect

(参考)ECRとlambda関数の更新方法

今回新たに追加したNotebookとしてupdate.ipynbリポジトリに格納しています。一度作成したECRとlambda関数を更新するために使用します。

使用にあたっては、conf.jsonに作成済みのrepository_nameやfunction_nameを入力した上で、Notebookを実行してください。

まとめ

本記事では、AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築を行いました。

機械学習の推論モデルをAWS Lambdaを用いて構築する際などに、本記事が参考になりましたら幸いです。