Azure face APIで遊んでみよう　その１~顔の検出

#Azure Face APIでお手軽に顔認識を試してみる
さて、最近はいろいろな機械学習を応用した機能がAPIとして公開され、面倒な設定作業を行わなくても簡単に利用できるようになりました。今回はMicrosoftのFace APIを呼び出してみることにします。

Face APIでは、以下のような機能が提供され、簡単に利用することが可能です。
- 人間の顔を検出し似ているもの同士を比較
- 類似性に基づいて画像をグループ
- タグ付け済みの人物を画像内で特定
では、早速試してみましょう。
#APIキーの取得
まずはじめにAPIキーを取得しましょう。以下のリンク先より入手することが可能です。
https://azure.microsoft.com/ja-jp/try/cognitive-services/
登録するとエンドポイントとキーが表示されます。
キーは2つもらえるようです。
#画像中の顔を検出してみる(Detect)
手始めに、画像中の顔を検出する[detect](https://dev.projectoxford.ai/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236)メソッドを呼び出してみましょう。

jsonで画像のURLを指定するか、binaryをPOSTデータとして直接送信します。binaryはbase64エンコードしたものをそのまま送付するだけでは[駄目なようです](https://stackoverflow.com/questions/34047648/how-to-post-an-image-in-base64-encoding-via-ajax/34064793#34064793)。今回はGoogleで”集合写真”を検索した結果から顔が複数含まれる写真を選んで試してみました。お手軽に動作確認するにはCurlを使用するか、APIDocumentのテスト機能を利用するのが良いでしょう。

送信先URL
https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=false

ヘッダー
Content-Type: application/json
Ocp-Apim-Subscription-Key: ••••••••••••••••••••••••••••••••

データ
{
    "url":"画像のURL"
}

以下のような配列が返されました。元の写真には顔が6個ほど含まれるのですが、正しく検出出来ているようです。

```json:response1.json
[
  {
    "faceId": "e3f2489a-99c2-4dc4-b5db-29649b0f2e0d",
    "faceRectangle": {
      "top": 81,
      "left": 96,
      "width": 120,
      "height": 120
    }
  },
  {
    "faceId": "d3fb4ca9-75f3-4fac-b7ff-1b5220248981",
    "faceRectangle": {
      "top": 77,
      "left": 673,
      "width": 107,
      "height": 107
    }
  },
  {
    "faceId": "6b7dae79-6d93-40f8-8008-be41c0bcb467",
    "faceRectangle": {
      "top": 130,
      "left": 454,
      "width": 88,
      "height": 88
    }
  },
  {
    "faceId": "98f61cd9-2ae6-4a9a-ae46-f804027f178c",
    "faceRectangle": {
      "top": 106,
      "left": 278,
      "width": 83,
      "height": 83
    }
  },
  {
    "faceId": "623a1517-96ba-4673-9b8b-495b2e8a2226",
    "faceRectangle": {
      "top": 82,
      "left": 340,
      "width": 77,
      "height": 77
    }
  },
  {
    "faceId": "fe7606f4-c512-47be-8597-7c45975bcec9",
    "faceRectangle": {
      "top": 93,
      "left": 535,
      "width": 72,
      "height": 72
    }
  }
]
```
##顔の要素の検出
returnFaceLandmarks=trueとすることで顔の各要素の位置を検出することが可能です。
具体的には以下のようなレスポンスが返ってきます。先ほどとは異なり、pupilleft(左の瞳)やnoseTip(鼻の先)などの座標が返されます。これらを利用することで、画像にメガネを合成するなどの加工が可能になります。

```json:response2.json
[
  {
    "faceId": "bac3fde0-1c85-471c-9f00-eed30f4ea5c8",
    "faceRectangle": {
      "top": 81,
      "left": 96,
      "width": 120,
      "height": 120
    },
    "faceLandmarks": {
      "pupilLeft": {
        "x": 137.3,
        "y": 107.3
      },
      "pupilRight": {
        "x": 190.3,
        "y": 130.3
      },
      "noseTip": {
        "x": 161.8,
        "y": 140.3
      },...
```
##顔の属性の検出
returnFaceAttributesに以下の値を指定することが可能です。
(age, gender, headPose, smile, facialHair, glasses, emotion, hair, makeup, occlusion, accessories, blur, exposure and noise)
試しに、smile,gender,ageを指定した見たところ以下の様なレスポンスが返ってきました。先ほどの写真には男性4人、女性2人が映っていたのですが、全て正しく検出していました。smileとageもほぼほぼ正しそうです。もう少し色々なパターンで試してみないと分かりませんがそこそこ精度はあって利用できそうです。

```json:response3.json
[
  {
    "faceId": "fa249de0-c20b-4257-815d-7f864ae6c8ac",
    "faceRectangle": {
      "top": 81,
      "left": 96,
      "width": 120,
      "height": 120
    },
    "faceAttributes": {
      "smile": 1.0,
      "gender": "female",
      "age": 28.4
    }
  },...
```

#まとめ
今回は、Microsoft Face APIを利用して画像中の顔を検出するところまでやってみました。
個人の認識はせず、単なる顔の検出ですが、これだけでも、顔の方向にカメラを向ける、人数や年齢を把握して料金を算出するなどの応用例が考えられます。次回は、顔の認識、つまり、個人の識別を試してみたいと思います。