IBM が2015年3月にニューラルネットワーク型の人工知能 API を SaaS として提供していた AlchemyAPI 社を買収しました。早速 IBM Bluemix からも利用可能なサービスとして提供されています。Watson 同様、AlchemyAPI からも多くの種類の人工知能 Web API が提供されていますが、その中でも比較的話題としてはホットになりつつある Face Detection(顔認識) API を実際に PHP から使うサンプルアプリを作ってみました。


最初にこのサービスの内容を簡単に紹介します。まずはこちらのデモサイトにアクセスしてみてください:
http://www.alchemyapi.com/products/demo/face-detection

2015061701

実はこのままデモサイトを使いはじめることもできますが、タイミングによっては API の実行回数が1日の制限を超えて使えなくなっている可能性があります。問題なくデモが行えるよう、自分専用の API キーを取得しておきましょう。画面右上の "Free API Key" と書かれた箇所をクリックします。

するとこのような申し込み画面になります。名前やメールアドレス、利用目的などを入力しておきます:
2015061702


最後に Terms of Service を確認してチェックし、"REGISTER FOR API KEY" ボタンで登録します:
2015061703


しばらく待つと AlchemyAPI から登録メールアドレスにメールが届きます。その中に自分専用の API Key が記載されています。これをメモするなりして大切に保存しておきます。他の人に使われてしまうと、(無料枠の上限に達して)自分が使えなくなったりするので流出しないように気をつけましょう:
2015061704


ではこの API Key を使ってデモを試してみます。改めてデモサイトに行き、"Enter your own API Key" と書かれた箇所をクリックします:
2015061705


テキストフィールドが現れるので、メールで届いた内容を入力して "Enter Key" をクリックします:
2015061706


ボタンのキャプションが "Using Key" になれば成功です:
2015061707


では改めてデモサイトを使ってみます。並んだサンプル画像の中から一番右の、女性が二人並んだ画像をクリックします。このデモではクリックした画像の中にある顔を探して、その性別と年齢帯、そしてある程度の有名人であれば「誰か」まで含めて探す、というデモです:
2015061708


しばらく(数秒)するとこのような画面になります。指定した画像のどの位置にどのような属性の人の顔があったのかを示した画像が表示されます:
2015061709


この結果は "Visual" タブでしたが、"JSON" タブを選ぶと実際の API の返り値である JSON が表示されます。つまり API の結果は先程の画像ではなく、あくまで JSON です。この JSON の情報を元に(HTML5 や Canvas などを使って元画像と結果テキストを合成したりすることで)先程のような結果画像が生成できる、という点を注意してください:
2015061710


この JSON はこのような内容になっています。imageFaces の中に結果が(複数の顔を識別した時のために)配列で格納されており、画像のどの位置に顔があるかという情報に加えて、推測した年齢とその確率、そして推測した性別とその確率が含まれていることが分かります:
{
  "status": "OK",
  "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
  "url": "http://demo1.alchemyapi.com/images/vision/mother-daughter.jpg",
  "totalTransactions": "5",
  "imageFaces": [
    {
      "age": {
        "ageRange": "55-64",
        "score": "0.413964"
      },
      "gender": {
        "gender": "FEMALE",
        "score": "0.982014"
      },
      "height": "88",
      "positionX": "134",
      "positionY": "40",
      "width": "88"
    },
    {
      "age": {
        "ageRange": "35-44",
        "score": "0.499654"
      },
      "gender": {
        "gender": "FEMALE",
        "score": "0.991837"
      },
      "height": "94",
      "positionX": "54",
      "positionY": "43",
      "width": "94"
    }
  ]
}

試しにもう一つ別の、1つ左の男性二人の画像をクリックしてみるとこのような結果になります。"Will Farrel" さんと "Chad Smith" さんだそうです。これはピンポイントに人物を特定できたケースです:
2015061711


このケースの JSON がこちらです。先程の結果には含まれていなかったのですが、"identity" 内に識別した顔が誰で、その確率と、他のその人物に関する情報が含まれていることが分かります。ある程度の有名人だとこんなこともできるんですね:
2015061712

なお、この API の詳細な情報はドキュメントを参照ください:
http://www.alchemyapi.com/api/face-detection/urls.html


さてデモサイトを使ってみてどんなことができる API なのかはなんとなくわかったのではないかと思います。では実際にこの API を使ったプログラミング例を紹介します。今回も PHP を使いますが、簡単な REST API を呼び出すだけなので、他の言語でも同様に記述することができると思います。

では IBM Bluemix にログインし、(PHP の)ランタイムを1つ作成してください。ここまでの手順がよく分からない場合はこちらのエントリを参照してください:

この例では dotnsf-facedetect という名前の PHP ランタイム(アプリケーションサーバー)を1つ作成しています:
2015061701


ではこの PHP ランタイム上で動かすアプリケーションを記述します。こんな内容の facedetect.php というファイルを自分の PC 上に用意しました。url=XXXX (XXXX は画像のURL)という形でパラメータを付けて実行すると、指定したパラメータの画像に含まれる顔を調べて結果を JSON のまま出力する、というものです。基本的には特定の URL に GET アクセスするだけなので、PHP だとラクチンです:
<?php
// API Key
$key = '(AlchemyAPI から取得した自分の API Key の値)';

// 結果
$json = 'No url parameter.';

// エンドポイント
$api = 'http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags?apikey=' . $key
 . '&outputMode=json&knowledgeGraph=1&url=';

// パラメータ
if( isset( $_GET['url'] ) ){
  $url = $_GET['url'];
  if( $url ){
    $api .= urlencode( $url );
    $json = file_get_contents( $api );
  }
}

echo( $json );
?>

このファイルを cf ツールなどを使って PHP アプリケーションサーバー(ランタイム)上にプッシュします。Bluemix 上のランタイムである必要はなく、独自環境内の PHP サーバー上にコピーしていただいても構いません。

そして実行してみます。ネット上で「顔」で画像検索を行い、こちらの画像を見つけたのでこの画像の URL (http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg)を使わせていただきます:
2015061702


先程アプリケーションサーバー上に転送した facedetect.php を url=http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg というパラメータを付けて実行します。何やら JSON で結果が返ってきています:
2015061703


結果の JSON を見やすくするとこんな感じでした。93.7% の確率で女性、そして 92.8% の確率で18歳以下だそうです:
{
 "status": "OK",
 "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
 "url": "http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg",
 "totalTransactions": "5",
 "imageFaces": [
  {
   "age": {
    "ageRange": "<18",
    "score": "0.927939"
   },
   "gender": {
    "gender": "FEMALE",
    "score": "0.937027"
   },
   "height": "174",
   "positionX": "152",
   "positionY": "109",
   "width": "174"
  }
 ] 
} 

実際にはこの結果をちゃんとパースして値だけを取り出して、場合によっては元画像と重ねて表示したり・・という処理が必要になると思います。ただ API の実行までは簡単に実現できてしまいました。

AlchemyAPI では画像認識だけでなく、様々な種類のコグニティブ API が用意されており、全ての API が1つの apiKey につき1日に 1000 回まで無料で使えます(異なる種類の API を1回ずつ実行した場合は2回と換算します)。開発やテスト段階であれば充分な無料枠だと思います。もちろんこの条件を超えた使い方も有料サービスとして提供されています:
2015061704


AlchemyAPI の価格について、詳しくはこちらを参照ください:
Pricing - Alchemy API