AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築
概要
AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築を行います。機械学習の推論モデルをAWS Lambdaを用いて構築することにより、コストの軽減を目指します。
以下の記事を参考にさせていただいています。
リポジトリの内容の更新や、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
デプロイ
冒頭で述べた通り、以下の記事の成果を利用させていただいています。
ここでは、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でも試すことができます。
カスタムドメインの設定
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を用いて構築する際などに、本記事が参考になりましたら幸いです。
Discussion