こんにちは。
コンピュータビジョンを勉強していて、この技術をどのように具体的に使えるようにするのが良いか模索しています。その中でAPIを作るという手法は色々な環境・言語で共通モジュール的に使えて良い案の1つと思います。勿論デメリットもありますが。
APIを簡単に作れるPythonフレームワークが無いか探していたところ、FastAPIというものを見つけたので、FastAPIを使って顔検出APIを作成し、それをせっかくなのでHerukuで公開まで一気に行きたいと思います。
FastAPIとは
FastAPIは、標準のPython型ヒントをベースにPython 3.6+でAPIを構築するための、モダンで高速(ハイパフォーマンス)なWebフレームワークです。とても使いやすいフレームワークなので是非とも沢山の人に利用してほしいです。
公式サイトはこちら(https://fastapi.tiangolo.com/)です。
顔検出APIとは?
顔検出したい画像をアップロードすると、JSONで検出できた数や矩形座標を返すAPIを作成します。その結果を利用して、よくある感じで枠を付けてみるとこんな感じになります。
画像:http://gahag.net/
前提
予め以下を実施して下さい。
以下は実施した方がいいと思いますが、今回は必須ではありません。
- デバッグ用にPCにPythonインストール
- VSCodeなどのデバッグ環境インストール
手順
- GitHubリモートリポジトリ作成
- Herokuにデプロイ
- API完成!?
①GitHubリモートリポジトリ作成
ソースコードの詳細は後程別記事にて書きたいと思います。今回使用するソースコードはGithubにあります。自分のGithubリモートリポジトリを作成してソースを置いて下さい。
構成は以下のようになっています。
. ├── cascades │ └── haarcascade_frontalface_default.xml ├── detect │ └── detect_face.py ├── .gitignore ├── Aptfile ├── Procfile ├── const.py ├── main.py ├── requirements.txt └── women.jpg
「cascades/haarcascade_frontalface_default.xml」は顔検出できるカスケード識別器の学習済みファイルです。「detect/detect_face.py」には顔検出するロジックが書いてあります。「.gitignore」はgit管理したくないものを書いてます。「Aptfile」はHerokuでOpenCVを使うのに必要なファイルです。詳細は後述しています。「Procfile」はHerokuでFastAPIを動かすのに必要なファイルです。「const.py」はCONSTを使うのに楽なので使用しています。「main.py」はuvicorn により実行されるファイルです。「requirements.txt」は依存ライブラリを管理するファイルです。HerukuでDeployするために必要です。「women.jpg」はサンプル用画像です。
②Herokuにデプロイ
さて、ソースの準備が出来たので、HerokuでAPI公開の準備をします。
まずはCreatNewAppをします。
アプリ名を付けます。
Deployタブを選択して、自身のGithubアカウントと接続した後、デプロイするリポジトリを選択します。
OpenCVは「opencv-contrib-python」パッケージをインストールしていますが、これだけだとimportエラーが出てしまいます。「ImportError: libSM.so.6: cannot open shared object file: No such file or directory」そのため、「buildpacksの追加」と「Aptfileファイル作成」が必要になります。Aptfileはソース一式の中に用意してありますので、Herokuでbuildpacksの追加のみ実施します。
SettingsタブのBuildpacksにて「https://github.com/heroku/heroku-buildpack-apt」を追加します。
Deployタブに戻って、Deployします。今回はManualDeployを選択します。
③API完成!?
Deployが運よく成功しましたら、Herokuの画面右上にある「Open app」を押します。
{“detail”:”Not Found”}
ような表示が出ましたでしょうか。エラーじゃん!!という方ごめんなさい。
作成したAPIを呼び出すには、URLの後ろに/docsを付けると簡単です。
「Try it Out」を押すと、実際に試せます。
顔検出したい画像を選択して、Executeします。こんな感じで結果が返ってきましたでしょうか?
画像サイズについて
画像サイズは0.2Mb以下のものを使用しています。サイズが大きいときちんと検出できないです。色々調整が必要なようです。
コメント