APIの公開(GPU)
本項では、クライアントからアップロードされる画像を顔認識処理に受け渡し、サーバー側での処理結果をクライアントに返すためのAPIの作成と公開について説明します。 概要
チュートリアルでは簡単のため、以下の仕様のみを持つ簡単なAPIを設計します。 APIの仕様
リクエスト
- ボディ
リクエストボディはContent-Type: multipart/form-data
形式でリクエストを送信します。
multipartキー 値 必須 image_data 画像ファイルのバイナリ ○ -
image_data
画像ファイルをバイナリ化したものです。
-
レスポンス
- ボディ
ボディとしては以下のセットが配列として返ってきます。それぞれの値は、顔として認識された位置のx座標、 y座標を表す数値です。
JSONキー 値 必須 right 数値 ○ bottom 数値 ○ top 数値 ○ left 数値 ○
APIのソースコードの内容 ダウンロードしたソースコードの Server フォルダーにある app.py がAPIとして機能する部分になります。
@app.route('/process', methods=['POST']) のアノテーションつけられた process() は、{ベースURL}/process にPOSTメソッドでアクセスした際に行われる処理を書いています。
ここでは、リクエストボディから image_data という部分のデータを取り出し、それに画像認識の処理を行い、結果をJSON化して返す、ということをしています。
そこではそれぞれ
- recog(img) が process() でリクエストボディから取り出したデータを画像認識処理に受け渡す処理を行っています。
- jsonify(tuplelist) が recog(img) で画像認識処理を行った後に返ってきたデータに対し、中の数値に"top", "right", "bottom", "left" という名前を与えてJSONの形に整形しています。
ここでは、実際にAPIをサーバー上で機能させる方法について説明します。 APIのデプロイ
なお、このプロセスを行う際には、かならずファイアウォールの設定を確認し、アクセスが予定されたIPアドレスに制限されていることをご確認ください。
ファイアウォールの設定を行います。 ファイアウォールの設定
基本的な IP の制限等についてはファイアウォールの設定をご確認ください。
その後、ポートの設定を行います。
Flaskはデフォルトで5000番のポートを使用するため、ファイアウォールでその通信を許可します。
- エッジ (赤で囲われた部分)から MEC-XXX-XXX という名前のエッジ(青で囲われた部分)を選択します。
- アプリケーションポートファイルを選択し、カスタムアプリケーションの 新規 (赤で囲われた部分)を選択します。
- 新規アプリケーションポートプロファイルのウィンドウが開くので、名前(赤で囲われた部分)を Flask にし、プロトコルを TCP 、ポートを 5000 に設定し(青で囲われた部分)、保存します。
- ファイアウォールの作成を参考に、新しいルールを作成します。
- アプリケーション から先ほど作成した Flask を選択し、許可します。
最初に、Apache などの他のウェブサーバーが起動していないかを確認し、起動していた場合は以下のコマンドを実行し、停止してください。 サーバーの起動
$ sudo systemctl stop httpd順番に以下のコマンドを実行してください。
- Server フォルダーに移動する(face-recog の部分は最初にダウンロードしたzipファイルのファイル名にしてください。変更していない場合、face-recogのままです)。
$ cd $HOME/face-recog/Server
- python で app.py を実行する。
$ python app.py
* Serving Flask app 'app' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: xxx-xxx-xxx
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://xxx.xx.x.xx:5000/ (Press CTRL+C to quit)