目次


単純な顔検出 Web アプリケーションを作成する

AlchemyAPI を使用してコグニティブ・コンピューティング機能を追加する

Comments

IBM は今年の初め、スケーラブルなコグニティブ・コンピューティングと深層学習の技術で業界を牽引する AlchemyAPI 社を買収しました。これらの技術は、コンピューターが人間と同じように、言葉や画像を理解することを可能にします。センチメント分析、キーワード抽出、関係抽出など、言葉に関連するサービスは、洗練された自然言語の背後にある内容を分析するのに役立ち、高度なセマンティック情報を追加することができます。一方、画像のタグ付けや顔検出など、画像に関連するサービスは、写真の内容とコンテキストを理解するのに役立ちます。

このチュートリアルでは、IBM Bluemix 上で AlchemyAPI サービスが提供する顔検出機能をデモンストレーションする、単純な Web アプリケーションの作成方法を説明します。顔検出機能では、以下のことが可能です。

  • 画像を調べて、そこに顔が写っているかどうかを判別すること。
  • 顔から性別を判断し、年齢を推定すること。
  • 60,000 人を超える著名人からなるコーパスの中からサンプルと一致する顔を特定すること。

このステップバイステップの例では、IBM Bluemix 上でわずか数行の PHP コードを操作するだけで、いかに簡単にコグニティブ・アプリケーションを開発できるかをご覧に入れます。

アプリケーションを作成するために必要となるもの

  • Bluemix アカウント
  • DevOps Services アカウント
  • PHP プログラミング言語の知識
  • (オプション) Cloud Foundry (cf) コマンド・ライン・インターフェースの知識

アプリを実行するコードを入手する

サンプル・アプリケーション「Who Are You?」

「Who Are You?」という名前のサンプル・アプリケーションは、PHP で作成します。効率的で軽量の PHP は、オープンソース・コミュニティーで広く受け入れられていて、Bluemix ではコアのランタイムとしてサポートされているためです。このサンプル・アプリケーションは、メモリーが 128 MB しかなくてもスムーズに動作します。

先進的なコグニティブ・コンピューティングや深層学習のアルゴリズムについて十分に理解していないとしても、心配は要りません。すべての詳細は Bluemix 上の AlchemyAPI サービスにカプセル化されているので、必要なのは、数行のコードでその API を呼び出すことだけです。Bluemix のおかげで、私たち一般の開発者でも、AlchemyAPI を使った強力なコグニティブ・コンピューティングを、その仕組みをまったく知らないまま、利用することができます。

AlchemyAPI の顔検出以外のコグニティブ・サービスに興味がある場合は、この顔検出サンプル・アプリケーションを手本に、他のコグニティブ・サービスをベースとしたアプリケーションを作成することができます。

ステップ 1. Bluemix 上で AlchemyAPI サービスを使用するアプリケーションを作成する

以下の手順に従って、Bluemix ダッシュボード上でアプリケーションを作成します。

  1. Bluemix アカウントにログインします (または、無料トライアルにサインアップしてください)。
  2. Bluemix カタログを開きます。
  3. 「Runtimes (ランタイム)」セクションにある「PHP」をクリックします。
  4. 「Name (名前)」フィールドに、アプリケーションの名前を指定します。この例では、「whoru」という名前にします。
  5. 「CREATE (作成)」をクリックし、アプリケーションがプロビジョニングされるまで待ちます。

次に、AlchemyAPI サービスを追加します。

  1. ダッシュボードで、新規に作成したアプリケーションをクリックします。
  2. 「ADD A SERVICE OR API (サービスまたは API の追加)」をクリックします。
  3. 「Watson」セクションから、「AlchemyAPI」サービスを選択します。
  4. AlchemyAPI トライアル・キーが有効になるまでには 5 分以上かかる可能性があります。アプリケーションは VCAP_SERVICES 環境変数からトライアル・キーを読み取ります。
  5. 「CREATE (作成)」をクリックします。アプリケーションを再ステージングするように促されたら、「RESTAGE (再ステージ)」をクリックします。

    すると、以下に示すようなアプリケーションが作成されます。

ステップ 2. コードをレビューして微調整する

ソース・コードを調べて、ここまでの詳細を確認します。嬉しいことに、AlchemyAPI には開発者用の PHP SDK が用意されています。しかし残念なことに、この SDK では、私たちのアプリケーションで必要とする顔検出機能をサポートしていません。

AlchemyAPI PHP SDK を更新する

AlchemyAPI PHP SDK の中心となるファイルは、alchemyapi.php です。以下の手順に従って、このファイルに新しい関数を追加してください。

VCAP_SERVICES 環境変数から AlchemyAPI の API キーを取得する

PHP SDK はデフォルトで、AlchemyAPI の API キーをファイルから読み取ります。セキュリティーを強化するための AlchemyAPI キー・ファイルを追加で準備しなくても済むように、少し機能を拡張して、VCAP_SERVICES 環境変数からキーを読み取るようにします。それには、以下のコード・スニペットを使用して、デフォルトの alchemyapi.php ファイルに変更を加えてください。

//Load the API Key from api_key.txt
		//$key = trim(file_get_contents("api_key.txt"));
	 
		// vcap_services Extraction 
 $services_json = json_decode(getenv('VCAP_SERVICES'),true);
 $credential = $services_json["alchemy_api"][0]["credentials"];
		
		// Extract the VCAP_SERVICES variables
		$key = $credential['apikey'];

顔検出 API を追加する

PHP SDK にはデフォルトで、当該の顔検出機能を呼び出すための API がありません。そこで、デフォルトの alchemyapi.php ファイルに変更を加えて、face_detection という新しい関数を追加します。

以下のように、顔検出機能のエンドポイントを定義します。

		$this->_ENDPOINTS['face_detection']['url'] = '/url/URLGetRankedImageFaceTags';
		$this->_ENDPOINTS['face_detection']['image'] = '/image/ImageGetRankedImageFaceTags';

以下の face_detection 関数を定義します。

	public function face_detection($flavor, $image, $options) {
		//Make sure this request supports the flavor
		if (!array_key_exists($flavor, $this->_ENDPOINTS['face_detection'])) {
			return array('status'=>'ERROR',
'statusInfo'=>'Face detection for ' . $flavor . ' not available');
		}
 
		//Add the image to the options and analyze
		if($flavor=='url'){
			$options[$flavor] = $image;
			return $this->analyze($this->_ENDPOINTS['face_detection'][$flavor], $options);
		}
		else{
			return $this->analyzeImage($this->_ENDPOINTS['face_detection'][$flavor],
                            $options, $image);	
		}
	}

face_detection 関数は、関連情報 (画像内での顔の位置、年齢、性別) を JSON フォーマットで返します。

更新された PHP SDK のソース・コード (php/alchemyapi.php) に、以上の更新内容がすべて統合されました。更新後の PHP SDK をデフォルトの SDK と比較することで、変更内容の詳細がわかります。

アプリケーションを実装する

PHP SDK の更新が完了したら、アプリケーションを実装することができます。サンプル・アプリケーションでは、この見事な顔検出機能を、以下の 2 つの方法でサポートします。

  1. ローカル・コンピューターから写真を提供する
  2. インターネットに公開されてアクセス可能な画像へのリンクを提供する

このアプリケーションで顔検出機能を呼び出すのは、非常に簡単です。コアとなるソース・コードでは、わずか 1 行で face_detection関数を呼び出します ($alchemyapi->face_detection)

require_once ('alchemyapi.php');
$alchemyapi = new AlchemyAPI();
 
//use image url to detect face
if (!empty($_POST['imageurl'])) {
 $response = $alchemyapi->face_detection('url', $_POST['imageurl'], null);
 printResponse($response);
} 
//Upload an image to detect face
else if (!empty($_FILES["upfile"])) {
 if ($_FILES["upfile"]["size"] < 512 * 1024) {
 if ($_FILES["upfile"]["error"] > 0) {
 echo "Fail to upload the file: " . $_FILES["upfile"]["error"] . "<br />";
 } else {
 $imageFile = fopen($_FILES["upfile"]["tmp_name"], "r") or die("Unable to open file!");
 $imageData = fread($imageFile, $_FILES["upfile"]["size"]);
 fclose($imageFile);
 //Do not forget to set imagePostMode option to raw
 $response = $alchemyapi->face_detection('image', $imageData, array(
 'imagePostMode' => 'raw'
 ));
 printResponse($response);
 }
 } else {
 echo "Error: only support image file with size < 512 KBytes";
 }
} else {
 echo "Error: no image found";
}

次に、関数から返された結果を出力します。

/*
 * This method prints out the response
*/
function printResponse($response) {
 $status = $response['status'];
 if ($status == 'OK') {
 $fcount = count($response['imageFaces']);
 if ($fcount > 0) {
 echo "Let me say ...";
 echo ("</br>");
 $fitem = $response['imageFaces'][0];
 echo "Gender: <b>";
 echo $fitem['gender']['gender'];
 echo "</b> (Confidence: ";
 echo number_format($fitem['gender']['score'], 2);
 echo ")";
 echo ("</br>");
 echo "Age: <b>";
 echo $fitem['age']['ageRange'];
 echo "</b> (Confidence: ";
 echo number_format($fitem['age']['score'], 2);
 echo ")";
 echo ("</br>");
 echo ("</br>");
 if (array_key_exists('identity', $fitem)) {
 echo "Emmm, we guess you are <b>";
 echo $fitem['identity']['name'];
 echo "</b> (Confidence: ";
 echo number_format($fitem['identity']['score'], 2);
 echo ")";
 } else {
 echo "However, we do not know who you are exactly...";
 }
 }
 echo ("</br>");
 } else {
 echo "Sorry, we are unable to guess who you are, as: ";
 echo ("</br>");
 echo $response['statusInfo'];
 echo ("</br>");
 }
}

実装の詳細は、ソース・コードphp/facedetection.php を見るとわかります。face_detection 関数を呼び出す 1 行のコードを作成することで、サンプル・アプリケーションに AlchemyAPI サービスの顔検出機能が実装されます。他の機能を呼び出す場合も、同様のプロセスに従います。

ステップ 3. アプリケーションを Bluemix にデプロイする

  1. ソース・コードを公開しているページにアクセスし、IBM ID を入力して IBM DevOps Services にログインし、「FORK PROJECT (プロジェクトのフォーク)」をクリックします。プロジェクト名を入力するよう促されたら、それに従います。

    必ず「Make this a Bluemix Project (Bluemix プロジェクトにする)」を選択し、「Region (地域)」「Organization (組織)」「Space (スペース)」が正しいことを確認してください。

    「CREATE (作成)」をクリックしてリポジトリーをフォークします。

  2. 「EDIT CODE (コードの編集)」をクリックします。新しく作成したプロジェクトのメニュー・セクションで、鉛筆アイコンをクリックし、Bluemix に合わせて起動構成を編集します。
  3. 「Target (ターゲット)」「Organization (組織)」「Space (スペース)」、「Domain (ドメイン)」の値が正しいことを確認します。「Application Name (アプリケーション名)」「Host (ホスト)」は、作成した Bluemix アプリケーションの名前と一致するように更新します。最後に「Save (保存)」をクリックします。img alt="" height="463" src="image006.jpg" width="473"/>
  4. 右矢印アイコンをクリックして、アプリケーションをデプロイします。1、2 分待ってから、デプロイの状況を確認します。

お望みであれば、cf コマンドを使ってこのアプリケーションをローカルにデプロイすることもできます。その場合は、以下の手順に従ってください。

  1. ソース・コードをローカルにフォークします。
  2. manifest.yml ファイルを更新するために、<your_app_name> を、作成した Bluemix アプリケーションの名前に変更します。メモリー・サイズを変更することもできます。デフォルトのメモリー・サイズは 128 MB に設定されています。
    ---
    applications:
    # replace the 'host' variable below with your own unique one, as this one can be already taken
    - name: <your_app_name>
     memory: 128M
     instances: 1
     host: <your_app_name>
     path: ./php
  3. cf push コマンドを実行して、アプリケーションをデプロイします。
    cf push

ステップ 4. アプリケーションを実行する

「Who Are You?」アプリケーションが正常にデプロイされたら、このアプリケーションを実行することができます。アプリケーションは、画像内の人物を認識しようと試みます。インターネット上に公開されていてアクセス可能な画像の URL を指定するか、ローカル・ドライブから画像をアップロードすることで、アプリケーションが「これは誰か (Who Are You?)」を判断できるかどうかテストすることができます。

  1. アプリケーションの URL にアクセスします。この URL は通常、<app_name>.mybluemix.net という形になっています。この例の場合、URL は http://whoru.mybluemix.net です。
  2. 「Guess Who Are You from the image URL (画像の URL から人物を推定する)」をクリックします。すると、新しいウィンドウが開いて操作を促されます。
  3. 分析したい画像の URL を入力します。例えば、「https://lh3.googleusercontent.com/-B8jO7AKe1Fw/UOxJEuRSV3I/AAAAAAAAAGA/28e6_kjzmVc/s512-no/Profil%2B7.png」と入力します。
  4. 「Submit (送信)」をクリックします。
  5. アプリケーションが、画像内の人物を特定できたかどうか確認します。サンプル画像の URL の場合、アプリケーションは簡単に、この人物がノバク・ジョコビッチ (セルビア出身のプロ・テニス・プレイヤー) であることを判断することができます。成功です!他の画像を試して、テストを続けます。
  6. メイン・ページに戻って、今度は「Guess Who Are You by Uploading an Image (画像をアップロードして人物を推定する)」をクリックします。この場合も、ウィンドウが開いて操作を促されます。
  7. 「Browse (参照)」をクリックし、ローカル・コンピューターから画像を選択します。あるいは、ソース・コードからサンプル画像をダウンロードすることもできます。その場合は、ダウンロードしたファイルからファイルを抽出し、php/andy.jpg を選択してください。最後に、「Upload (アップロード)」をクリックします。
  8. アプリケーションが、その人物が誰であるかを検出できたかどうか確認します。サンプル画像の場合、その答えはアンディ・マレー (スコットランド出身のプロ・テニス・プレイヤー) です。AlchemyAPI サービスは、またもや人物の特定に成功しました。遠慮なく、他の画像もアップロードして試してください。

「Who Are You?」アプリケーションが、提供されたすべての人物を認識できるとは限りませんが、それでも、AlchemyAPI サービスのこの強力な顔検出機能には驚かされます。私の経験から言うと、アプリケーションは多くの人物を正しく特定することができます。スポーツ界のスターや映画スターについては、とりわけその能力を発揮します。

まとめ

コグニティブ・コンピューティングは、大きな注目を集めているトピックです。現在 IBM Bluemix では、AlchemyAPI サービスの強力なコグニティブ機能を簡単に利用できるようになっています。このチュートリアルでは、PHP を使用して単純な Web アプリケーションを作成し、AlchemyAPI の顔検出機能と認識機能を利用する方法を説明しました。このサンプル・アプリケーションを拡張すれば、Bluemix 上でさらなるコグニティブ・アプリケーションを作成することができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, Cloud computing
ArticleID=1016789
ArticleTitle=単純な顔検出 Web アプリケーションを作成する
publish-date=11262015