ibm bluemix と alchemyapi を使って 画像認識 アプリケーションを作る
TRANSCRIPT
Free API Key の条件
•無料
• 1日 1000 トランザクション
• API の種類は問わずに合計した値• 画像関連だけでなく、言語やニュース系 API を使う場合にも適用
• API を1回実行 = 1トランザクション?• →違います
• API を1回実行した時のトランザクション数は実行結果に含まれています。• より複雑な API ほど、トランザクション数が大きくなります
「人工知能」学習の種類
人間型 非人間型
人間の脳 学習モデル 人間の脳ではないもの
先生 上限 無限
人間らしさ 目的 人間を超える
人間の棋譜を使って、人間のように打てるように学習させる
(例)将棋AI 膨大な選択肢から仮説に基いた絞り込みを行い、最適解を探す
AlchemyAPI Watson
ちなみに IBM では「人工知能(AI)」とは言いません。「コグニティブ(Cognitive 認識型人工知能)」と言います。
↑今日はこちら↑
「画像認識」
結果のフォーマット 各配列要素の中身
何が写っているのか? ○○の可能性がある、××の可能性がある、:
(という配列)
識別したものその確率
誰が写っているのか? ○○人が写っている1人目の情報2人目の情報:
(という配列)
顔の位置、性別、その確率、年齢、その確率、個人名、その確率
Alchemy Vision
Alchemy Face Detection
これからこんなアプリを作ります。
認識対象画像のURLを(パラメータで)指定すると、その画像を顔認識/物体認識した結果を視覚的に表示する。
Alchemy Vision の結果をタグクラウド
指定画像と、Alchemy Face Detect の結果を表示
この API で使ったトランザクション数
Alchemy Vision API
画像ファイルのURLから「何が写っているのか」の認識を行う※パブリックに公開されている URL であること!
具体的には以下のエンドポイントへ Get メソッドでアクセスする:http://access.alchemyapi.com/calls/url/URLGetRankedImageKeywords?apikey=(API キー)&url=(画像URL)&outputMode=json&knowledgeGraph=1
URLGetRankedImageKeywords API の実行結果
{"status": "OK","usage": "By accessing AlchemyAPI or …","url": "http://xxx.com/wp-content/uploads/2015/05/aaaa.jpg","totalTransactions": “4","imageKeywords": [
{“text": “sport", "score": "0.989013“
},{ “text": “football", "score": "0.985226“
}]
}
結果は imageKeywordsの中(配列)
“sport” の確率が 98.9013% と認識
“football” の確率が 98.5226% と認識
詳細は API リファレンス参照http://www.alchemyapi.com/api/image-tagging/urls.html
この API コールで消費したトランザクションは 4
試しにブラウザで実行してみる
ウェブブラウザで以下の URL を指定してアクセスします:http://access.alchemyapi.com/calls/url/URLGetRankedImageKeywords
?apikey=(API Key の値)&outputMode=json&url=画像URL
Alchemy Face Detection API
画像ファイルのURLから「誰が写っているのか」の顔認識を行う※パブリックに公開されている URL であること!
具体的には以下のエンドポイントへ Get メソッドでアクセスする:http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags?apikey=(API キー)&url=(画像URL)&outputMode=json&knowledgeGraph=1
URLGetRankedImageFaceTags API の実行結果
{"status": "OK","usage": "By accessing AlchemyAPI or …","url": "http://xxx.com/wp-content/uploads/2015/05/aaaa.jpg","totalTransactions": "5","imageFaces": [{ “age”: { "ageRange": "18-24", "score": "0.702753“ },"gender": { "gender": "FEMALE", "score": "0.991837“ },"identity": {"knowledgeGraph": { "typeHierarchy": "/people/ariana grande“ },"name": "Ariana Grande","score": "0.622459"},"positionX": "116","positionY": "19",“height”: “48”,"width": "48“ }
]}
結果は imageFacesの中(配列)age: 推定年齢層と、その確度
gender: 推定性別と、その確度
個人が特定できた場合は identity 内に情報が入り、名前とその確度
positionX, positionY: 顔の位置width, height: 顔のサイズ
詳細は API リファレンス参照http://www.alchemyapi.com/api/face-detection/urls.html
この API コールで消費したトランザクションは 5
試しにブラウザで実行してみる
ウェブブラウザで以下の URL を指定してアクセスします:http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags
?apikey=(API Key の値)&outputMode=json&url=画像URL
これから作成するアプリ(最終形)
認識対象画像のURLを(パラメータで)指定すると、その画像を顔認識/物体認識した結果を視覚的に表示する。
Alchemy Vision の結果をタグクラウド
指定画像と、Alchemy Face Detect の結果を重ねて表示(男性=青枠、女性=赤枠)
この API で使ったトランザクション数
アプリケーションの名前を指定
PHP ランタイムアプリケーションの名前を指定して入力して「終了」。ホスト名の一部になるので、重ならない名前にする。(例) kkimura(自分の名前)-php-YYYYMMDD(日付)
アプリの実装内容(1) PHP ファイルがパラメータで画像URLを受け取る。(例 ***.php?url=http://XXXXXXXX/XXX.jpg)
(2) 受け取ったパラメータの値(画像URL)に対して、Alchemy Vision API と Alchemy Face Detection API をそれぞれ実行する。
(3) 各結果の JSON を解析して、表形式で表示する。
(4) (おまけ)結果表示方法をより視覚的にカスタマイズする。
Bluemixソースコードの開発/デプロイ
•選択肢は3つ• Eclipse 環境で開発し、Eclipse プラグインを使ってデプロイ
• 普通にテキストエディタで開発し、cf ツールを使ってデプロイ
• IDS(IBM DevOps Services) を使って Git リポジトリを作り、リポジトリのコードを編集した後にビルド&デプロイ
今回は cf ツールを使った方法を紹介します。
cf コマンドラインツールをダウンロード
https://github.com/cloudfoundry/cli#downloads
の Stable Installers から環境にあったモジュールをダウンロードしてインストール
ドキュメントルート作成
PHP のウェブアプリケーションを作る上での、ドキュメントルートとなる空フォルダをローカルマシン内に作成します。この例では c:¥tmp¥docroot をドキュメントルートとしました。
cf ツールでログイン
cf ツールを使って Bluemix にログインします:
> cf login –a https://api.ng.bluemix.net/
(ユーザー名とパスワードを聞かれるので入力する)
image.php の内容(1)<html>
<head>
<title>AlchemyAPI サンプル</title>
</head>
<body>
<?php
$trans1 = 0;
$trans2 = 0;
if( isset( $_GET['url'] ) ){
$apikey = ‘(Alchemy API Key の値)';
$url = $_GET['url'];
$alchemyurl = 'http://access.alchemyapi.com/calls/url/';
?>
<img src='<?php echo $url; ?>'/>
<p/>
<?php
$apiurl1 = $alchemyurl . 'URLGetRankedImageKeywords?apikey=' . $apikey . '&outputMode=json&url=' . urlencode( $url );
$text1 = file_get_contents( $apiurl1 );
$json1 = json_decode( $text1 );
$trans1 = $json1->totalTransactions;
$imageKeywords = $json1->imageKeywords;
if( count( $imageKeywords ) ){
?>
<h2>Keywords</h2>
<table border='1'>
<tr><th>text</th><th>score</th></tr>
<?php
for( $i = 0; $i < count( $imageKeywords ); $i ++ ){
$imageKeyword = $imageKeywords[$i];
$text = $imageKeyword->text;
$score = $imageKeyword->score;
?>
<tr><td><?php echo $text; ?></td><td><?php echo $score; ?></td></tr>
<?php
}
?>
</table>
<p/>
<?php
}
API key の値
画像 URL を取得
モノ認識 API の URL
API を実行して、結果の JSON を取り出す
配列の結果をループで1つずつ取り出す
image.php の内容(2)$apiurl2 = $alchemyurl . 'URLGetRankedImageFaceTags?apikey=' .
$apikey . '&outputMode=json&knowledgeGraph=1&url=' . urlencode( $url );
$text2 = file_get_contents( $apiurl2 );
$json2 = json_decode( $text2 );
$trans2 = $json2->totalTransactions;
$imageFaces = $json2->imageFaces;
if( count( $imageFaces ) ){
?>
<h2>FaceTags</h2>
<table border='1'>
<tr><th>attr</th><th>value</th><th>score</th></tr>
<?php
for( $i = 0; $i < count( $imageFaces ); $i ++ ){
$imageFace = $imageFaces[$i];
$positionX = $imageFace->positionX;
$positionY = $imageFace->positionY;
$width = $imageFace->width;
$height = $imageFace->height;
$ageO = $imageFace->age;
$ageRange = $ageO->ageRange;
$ageScore = $ageO->score;
$genderO = $imageFace->gender;
$gender = $genderO->gender;
$genderScore = $genderO->score;
?>
<tr><th colspan='3'><?php echo $i; ?></th></tr>
<tr><td>positionX</td><td><?php echo $positionX; ?></td><td> </td></tr>
<tr><td>positionY</td><td><?php echo $positionY; ?></td><td> </td></tr>
<tr><td>width</td><td><?php echo $width; ?></td><td> </td></tr>
<tr><td>height</td><td><?php echo $height; ?></td><td> </td></tr>
<tr><td>age</td><td><?php echo $ageRange; ?></td><td><?php echo $ageScore; ?></td></tr>
<tr><td>gender</td><td><?php echo $gender; ?></td><td><?php echo $genderScore; ?></td></tr>
<?php
$identityO = $imageFace->identity;
if( $identityO ){
$name = $identityO->name;
$nameScore = $identityO->score;
?>
<tr><td>name</td><td><?php echo $name; ?></td><td><?php echo $nameScore; ?></td></tr>
顔認識 API の URL
API を実行して、結果の JSON を取り出す
配列の結果をループで1つずつ取り出す
image.php の内容(3)<?php
}
?>
<?php
}
?>
</table>
<p/>
<?php
}
?>
<div align='right'>
使ったトランザクション数:<?php echo $trans1; ?> + <?php echo $trans2; ?> = <?php echo ($trans1 + $trans2); ?>
</div>
<?php
}
?>
</body>
</html>
ソースコード•本ハンズオンセミナーのソースコードはこちらからダウンロード可能です:• https://github.com/dotnsf/alchemyapi_php_sample
•実際に使う場合は、jQCloud ライブラリと合わせて用意する必要があります:• https://github.com/lucaong/jQCloud
上記2サイトからダウンロード&解凍した結果の *.php, *.js, *.css ファイルを全て同じ(ドキュメントルートの)フォルダに展開します。
image.php の動作確認
ウェブブラウザでhttp://(アプリ名).mybluemix.net/image.php?url=(画像のURL)
にアクセスして、期待通りに表が出力される結果になることを確認する。いくつかの画像URLで確認する。
(おまけ)index.php の動作確認
ウェブブラウザでhttp://(アプリ名).mybluemix.net/?url=(画像のURL)
にアクセスして、期待通りにタグクラウドと顔認識結果が出力されることを確認する。いくつかの画像URLで確認する。
(改良に挑戦してほしいこと)
•人間が写っているとは限らないのに顔認識が実行されていて、トランザクションが無駄• 写っているものが人間だった場合のみ、顔認識を実行する
•画像がプライベートネットワーク上にあったり、認証がかかっていて、普通に URL を指定しただけではアクセスできない場合を想定• 画像を一度ダウンロードした上で、そのバイナリデータをポストして認識させる、というアルゴリズムに変更
• ImageGetRankedImageKeywords API とImageGetRankedImageFaceTags API を使う