顔認識アプリの作成
本マニュアルでは、初歩的な顔認識アプリを作成します。手順に従うと、下記のように画像の顔の部分を認識し、緑色の長方形で囲った画像を表示するアプリケーションを作成することが可能です。 はじめに
アプリケーションの構成
以下ドキュメントを先にご覧ください。 前提知識
- 「インスタンスの起動」
- 「インスタンスへの接続・ログイン」
- 「GPUの使用方法」
使用するライブラリは以下の通りです。 ライブラリ
- Python3.9.6
- Flask 2.2.2
- face-recognition 1.3.0
操作手順
環境構築の手順(GPUインスタンス)
- Ubuntu 20.04のインスタンスを作成します。手順については「インスタンスの起動」をご参照ください。 ※ セキュリティグループの設定にて、5000番ポートの受信を許可してください。
- インスタンスにログインします。手順については「インスタンスへの接続・ログイン」をご参照ください。
- 「GPUの使用方法」マニュアルの内容を実行し、GPUを使用可能な状態にします。
- 「環境構築の手順(共通手順)」を行います。
※ このインスタンスにはFloating IPを割り当てないでください。
環境構築の手順(共通手順)
- 以下コマンドを実行し、unzip をインストールします。
- 作業用フォルダを作成し、移動します。
- 本マニュアルで使用するソースコードをダウンロードし、展開します。
- 本マニュアルでは Python 3.9 を使用します。以下の手順を行い、Python のビルドに必要なCMakeのインストールを行います。
- 次のコマンドを順番に実行し、必要なライブラリをインストールします。
- CMakeのソースコードをダウンロードします。
- ダウンロードしたファイルを解凍します。
- 解凍したフォルダに移動します。
- CMakeをビルドします。
$ sudo apt update
$ sudo apt --fix-broken upgrade -y
$ sudo apt install build-essential -y$ wget https://github.com/Kitware/CMake/releases/download/v3.25.0-rc3/cmake-3.25.0-rc3.tar.gz
$ tar -zxvf cmake-3.25.0-rc3.tar.gz
$ cd cmake-3.25.0-rc3
$ ./configure -- -DCMAKE_USE_OPENSSL=OFF
$ make
$ sudo make install - 以下の手順を行い Python 3.9 のインストールを行います。
- 次のコマンドを入力し、フォルダを移動します。
- 前提となるライブラリをインストールします。
- Python3.9のソースコードをダウンロードします。
- ダウンロードしたファイルを解凍します。
- 解凍したフォルダに移動し、Python をビルドします。
$ cd ~/opt
$ sudo apt --fix-broken install zlib1g-dev libssl-dev -y
$ sudo wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz
$ tar xzf Python-3.9.6.tgz
$ cd Python-3.9.6
$ sudo ./configure --enable-optimizations
$ sudo make altinstall - フォルダを移動し、venv の作成を行います。
- venv の起動を行います。
- 仮想環境内に pip のインストールを行います。
$ sudo apt update
$ sudo apt install unzip
$ mkdir opt
$ cd opt
$ wget https://www.mec.docomo.ne.jp/assets/advanced-tutorial/face-recog.zip
$ unzip face-recog.zip
$ cd ../
$ python3.9 -m venv --without-pip face_venv
$ source face_venv/bin/activate
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
ここまでで共通の手順は終了です。なお、以降の手順は仮想環境内で行うことを前提にしています。再起動などの後には再度、手順7.を行い仮想環境の起動を行ってください。
- GPUインスタンスを構築中の場合、次に進んでください。
- CPUインスタンスの構築手順に戻る場合こちらをクリックしてください。
本項では、GPUインスタンスを使用して顔認識を行う方法を説明します。ここではFace Recognitionというライブラリを使用して顔認識を行います。 顔認識処理
- 顔認識処理のソースコードの内容
ダウンロードしたソースコードの Server フォルダにある face.py が顔認識処理を行う部分になります。
get_face_locations(image_file) は画像ファイルのバイナリデータを引数として受け取り、Face Recognition による画像処理を行ってその画像の中にある顔をすべて発見し、それらの位置を示した長方形の左右のx座標と上下のy座標を (top, right, bottom, left) の tuple で表し、配列にして返します。
なお、この処理は次項で説明するAPIから呼び出され、自動で処理されるので何かの操作をする必要はありません。 また、お使いのインスタンスのリソース等が不足している場合、4行目の return face_recognition.face_locations(face_recognition.load_image_file(image_file), model = "cnn") の model = "cnn" という部分を model = "hog" に書き換えることでより軽量な処理が行えます。
APIの公開
- APIの仕様
- リクエスト
- レスポンス
チュートリアルでは簡単のため、以下の仕様のみを持つ簡単なAPIを設計します。
ボディ: リクエストボディは Content-Type: multipart/form-data 形式でリクエストを送信します。
multipartキー | 値 | 必須 |
---|---|---|
image_data | 画像ファイルのバイナリ | ○ |
ボディ: 以下のセットが配列として返ってきます。それぞれの値は、顔として認識された位置のx座標、 y座標を表す数値です。
multipartキー | 値 | 必須 |
---|---|---|
right | 数値 | ○ |
bottom | 数値 | ○ |
top | 数値 | ○ |
left | 数値 | ○ |
- APIのソースコードの内容
- recog(img) が process() でリクエストボディから取り出したデータを画像認識処理に受け渡す処理を行っています。
- jsonify(tuplelist) が recog(img) で画像認識処理を行った後に返ってきたデータに対し、中の数値に"top", "right", "bottom", "left" という名前を与えてJSONの形に整形しています。
ダウンロードしたソースコードの Server フォルダにある app.py がAPIとして機能する部分です。
各関数はそれぞれ以下の処理を行っています。
APIのデプロイ手順(GPUインスタンス)
- 以下のコマンドを実行し、顔認識に用いるライブラリをインストールします。
- Apache などの他のウェブサーバーが起動していないかを確認し、起動していた場合は以下のコマンドを実行し、停止してください。
- Server フォルダに移動します(face-recog の部分は最初にダウンロードしたzipファイルのファイル名にしてください。変更していない場合、face-recogのままです)。
- python で app.py を実行します。
$ python -m pip install flask
$ python -m pip install pillow
$ python -m pip install face_recognition
$ sudo systemctl stop httpd
$ cd $HOME/opt/face-recog/Server
$ python app.py
環境構築の手順(CPUインスタンス)
本項では事前準備となる環境構築の手順を説明します。GPUインスタンスとは別のインスタンスにて下記手順を行ってください。
- Ubuntu 20.04のインスタンスを作成します。手順については「インスタンスの起動」をご参照ください。
- インスタンスにログインします。手順については「インスタンスへの接続・ログイン」をご参照ください。
- 「環境構築の手順(共通手順)」を行います。
※ セキュリティグループの設定にて、5000番ポートの受信を許可してください。
※ Floating IPを割り当ててください。
※ ルーターとネットワークはGPUインスタンスと同じものを使用してください。
本項では、先ほどGPUインスタンスに設定したAPIに対して画像をアップロードし、処理結果を受け取って画面に表示するためのクライアントについて説明します。 クライアントの公開(CPUインスタンス)
- クライアントのソースコードの内容
- settings.pyの設定
- BASE_URI の部分には、 {GPUインスタンスのIP:5000/} と書いてください。インスタンスのIPはインスタンスの一覧からご確認ください。
- ENDPOINT の部分は、変更しないでください。
- MAX_SIZE の部分は、ピクセル数の制限を書いてください。これを超えたサイズの画像はそのサイズまで縮小されます。なお、お使いのGPUインスタンスの処理能力により変更可能ですが、 512 より大きい数字であることが推奨されます。
- get_url() の部分は、変更しないでください。
ダウンロードしたソースコードの Client フォルダにある app.py がクライアントとして機能する部分になります。
@app.route('/', methods=['GET', 'POST']) のアノテーションが付けられた show_page() はクライアントの {ベースURL:5000/} にGETメソッドもしくはPOSTメソッドでアクセスした際に行われる処理を書いています。
GETメソッド、つまりブラウザーで直接通常のアクセスをした際には、 templates フォルダの index.html を表示する処理を行っています。
POSTメソッド、つまり先ほど表示した index.html で upload ボタンを押したときは、設定された画像を指定のサイズまで縮小し、APIを通してサーバーにアップロード、返ってきた長方形を示すJSONに従って画像に長方形を書き込み、縮小していた場合には元のサイズまで戻す、その後編集された画像を result.html で表示する、という処理を行っています。
convert_img(im) は画像ファイルをリクエストの中に含めるためにバイナリデータに変換する処理を行っています。
Client フォルダの settings.py は、環境などによって可変となる設定を含みます。
クライアントを公開する手順(CPUインスタンス)
- 以下のコマンドを実行し、顔認識に用いるライブラリをインストールします。
- Apache などの他のウェブサーバーが起動していないかを確認し、起動していた場合は以下のコマンドを実行し、停止してください。
- Client フォルダに移動します(face-recog の部分は最初にダウンロードしたzipファイルのファイル名にしてください。変更していない場合、face-recogのままです)。
- python で app.py を実行します。
$ python -m pip install flask
$ python -m pip install pillow
$ python -m pip install requests
$ sudo systemctl stop httpd
$ cd $HOME/face-recog/Client
$ python app.py
本項では、ここまで構築したアプリのテストを行います。 テスト
- http://(CPUインスタンスのFloating IP):5000へアクセスします。正常に動作している場合、以下のような画面が表示されます。
- 表示されたページの ファイルを選択 ボタン(赤で囲われた部分)を押し、ローカルフォルダから画像を選択した後、 upload ボタンを押してください。
- 以下のように、顔の部分を緑色の長方形で囲った画像が表示されます。
Face Recognitionのライセンス表示です。 ライセンス
MIT LicenseCopyright (c) 2021, Adam GeitgeyPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.