まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2015/04

昨年に引き続き、今年も IBM Bluemix を使ったアプリケーション開発コンテスト「IBM Bluemix Challenge 2015」の開催が発表されました:
IBM Bluemix Challenge 2015

2015042700


詳細は後日紹介予定ですが、5月19日に開催されるイベント IBM XCITE Spring 2015 の中で正式に発表される予定です。今回は学生のみが参加できる「学生部門」と、それ以外(学生が参加しても可)の「一般部門」に分けて審査される予定です。昨年の開催と比べると利用できる API も増え、人工知能やビッグデータ解析系の API が充実しました。これまでは「未来」と考えていたような機能もすぐに使えるようになりました。 未来のアイデアを形にできるような環境が提供されます。

IBM XCITE での正式発表を待って登録も始まりますが、今のうちに「どんなアプリを作るか?」のアイデアは準備しておけると思います。皆様の参加をお待ちしております。


このエントリの続きです。ここで紹介した機能を実現する API の使い方を紹介します:


この機能は IBM Bluemix を通じて提供されているコグニティブサービスの1つである Watson Message Resonance サービスから使うことができます。そのため、まずは Bluemix にログインして、なんらかのランタイムにバインドする形で同サービスを追加する必要があります。ちなみにこのサービスは2015年4月19日時点ではベータ版であり、IBM Bluemix 利用者であれば無料で利用することができます:
2015041901


ランタイムに Message Resonance サービスを追加後に「資格情報」を参照して、このサービスを利用する際のユーザーID(username)とパスワード(password)情報を確認しておきます:
2015041902


ここまでの事前準備ができていれば、Watson Message Resonance サービスの API を使うことができます。以下は Java を使った場合のサンプルですが、REST API なので Java 以外の言語であっても同様に利用することができます:
try{
  String username = "(上記 username の値)";
  String password = "(上記 password の値)";
  String word = "Bluemix"; // 流行性を調べたい単語

  byte[] b64data = Base64.encodeBase64( username + ":" + password.getBytes() );

  //. dataset 対象業界で、1はクラウドコンピューティング、2 はビッグデータ
  GetMethod get = new GetMethod(
    "https://gateway.watsonplatform.net/message-resonance-beta/api/v1/ringscore?dataset=1&text=" + word );
  get.setRequestHeader( "Authorization", "Basic " + new String( b64data ) );
  int sc = client.executeMethod( get );
  String json = get.getResponseBodyAsString(); //. 結果の JSON 文字列
  :
  :
}catch( Exception e ){
 e.printStackTrace();
}

上記のように、https://gateway.watsonplatform.net/message-resonance-beta/api/v1/ringscore に対して Get メソッドを実行します。その際の text パラメータに流行性を調べたい単語を指定します。また dataset パラメータは流行性を調べる対象業界で、1はクラウド、2はビッグデータです。シンプルなので Java 以外への応用もさほど難しくないと思っています。

このコードを実行した結果(上記コードの場合は json 変数の値)は以下の様な JSON 文字列になります:
{"dataset":1,"word":"Bluemix","overall":19,"prevalence":10,"volume":4,"duration":5}

この中身を少し解説します。
"dataset":1 は URL で指定した dataset=1 が結果にも含まれて返ってきているだけです。"word":"Bluemix" も同様です。なので実際の実行結果といえるのはこの続き部分になります。

"overall":19 は流行度合いの総合的な結果であり、以下の3つの結果の合計値になっています。
"prevalence":10 は、その単語の今現在の流行度合いを示しています。この場合ではその値が 10 ということになります。
"volume":4 はその単語がこれまでにどの程度の量/回数で使われているか、という指標です。多く使われていれば今流行している、といえるわけではありませんが、過去も含めてどれだけ多く使われていたか、という指標になる数字です。この場合ではその値は 4 という評価です。
最後の "duration":5 はどの程度の期間使われているか、という指標になります。当然長い期間使われ続けている単語であればずっと流行しているともいえますが、短い期間で爆発的に流行したものかどうかを調べることもできます。この単語の場合はその値が 5 という評価です。

つまりこの "Bluemix" という単語の場合は現在の流行度 10、データ量 5、流行期間 4 で、総合結果は19という結果になった、という意味です。 

この API は単語ごとにしか問い合わせができませんが、複数の語について調べるには文章を単語に分解して、その結果の各単語ごとにこの API を実行すればよいことになります。なお、残念ながらこの API は 2015 年4月19日現在ではまだ英語の単語に対してのみ利用可能です。


なお、Message Resonance API のリファレンスはこちらを参照ください:
Message Resonance Reference

IBM Bluemix から提供されているサービスの1つに、ある単語がネットでどの程度流行しているか?を確認する API があります。今回のブログではこのサービスについて紹介します。

このサービスは Watson Message Resonance サービスです。メールや SNS などで使っている言葉が、特定の志向を持つ相手にどれだけ響くか?その相手にとってどれだけ流行りの言葉であるか?といったことを確認することができます。この API が IBM Bluemix を通じて(REST API プログラミングのできる方であれば)誰でも利用可能な形で提供されています:
2015041601


プログラミングができる方だけでなく、そうでない方でもどんなものか試せるように、IBM からデモアプリも提供されています。ここではこのデモアプリの使い方を紹介します:
Message Resonance


上記リンク先にアクセスすると、以下の様なデモアプリの初期画面が表示されます:
2015041602


単語の流行性を調べる前に、まずその単語を使ってメッセージを届ける相手の特性を指定します。現在提供されているサービスでは、この相手の特性として「Cloud Computing(クラウドコンピューティング系)」か「Big Data and Analytics(ビッグデータ/解析系)」かのいずれかが選択できるようになっています。今は「クラウドコンピュータ業界の人からみた評判」を確認したいので、Select Audience 欄で前者を選択します:
2015041603


相手の特性が決まった所で、実際に確認したいメッセージを入力します。では個人的にも興味のある "IBM Bluemix" という言葉がどれだけの広まりを見せているのかを確認してみましょう。テキストエリアに "IBM Bluemix" と入力します。最後に "Analyze" ボタンをクリック:
2015041604


少し待つと処理が終わり、画面右側にこのような結果が表示されます:
2015041605


右上の Output 結果を見ると、"Resonance" として4つの色分けされた帯が表示され、その1段下の Message 欄に入力した "IBM Bluemix" とい文字が、 Resonance にある色で分けられて表示されています:
2015041606


実はこれが処理結果です。「クラウド系」という指定した前提の中でですが、"IBM" という単語は(同じ色である) 21-30 という評価を得ていて、一方 "Bluemix" は 11-20 という評価を得ている、という結果を意味しています。ちなみに数値が大きいほど評判が高いことを意味しています。なるほど "IBM" はまだまだイケてるのね、そして "Bluemix" はも少し頑張らないと・・・


この Message Resonance は IBM のコグニティブ(学習型人工知能)サービスの1つとして提供されており、この結果に対するフィードバックを与えることで更に学習します。結果を正しいと思うか、違っていると思うかを画面右下の Feedback 欄から与えて、より賢くしてあげましょう:
2015041607


対象をクラウドコンピューティング業界ではなく、ビッグデータ/解析業界に変えて調べることもできます。ちなみに "IBM Bluemix" はこんな結果でした。ビッグデータ業界では Bluemix はまだまだみたいです・・・ (^^;:
2015041608


今回はデモアプリを使って Watson Message Resonance サービスを体験してみました。実際にはこの中で使っている API が誰でも使える形で IBM Bluemix を通じて提供されており、実はこのデモアプリの画面で表示されている以上の細かなデータが取得できます。その API の使い方に関しては機会を見つけて今後紹介するつもりです。


(2015年4月19日 追記)
続きはこちら
Watson Message Resonance API で単語の流行性を調べる



先日のブログエントリで下記記事を紹介しました。以下に紹介する API 実装は、ここで書かれた内容の処理を自分のアプリケーションの中で実現するものです:
Bluemix の AlchemyAPI Face Detection(顔認識) API を使ってみた

この中で紹介している AlchemyAPI の顔認識 API 、これを自分のアプリケーションの中で使ってみるサンプルを紹介します。本エントリでは Java を使いますが、REST API なので Java でなくても実現できるはずです。

まず、自分のアプリケーションで AlchemyAPI を利用するには AlchemyAPI に利用者登録をして apiKey を入手する必要があります。まずは AlchemyAPI のサイトにアクセスして、"FREE API KEY" と書かれた箇所をクリックします:
2015041301


次の画面で必要事項を入力し、最後に "REGISTER FOR API KEY" ボタンをクリックして利用者登録を行います:
2015041302


しばらくすると登録したメールアドレスに API KEY の書かれたメールが送られてきます。この情報は実際にプログラミングを行う際に必要になるので、他の人にわからないように大切に管理する必要があります:
2015041303


↑このメールにも書かれていますが、AlchemyAPI は2015/04/13 現在では「1日に1000回までの API コールは無料」です。それ以上の利用は有料となり、その価格については最新のプライスリストで確認ください:
AlchemyLanguage Pricing | AlchemyAPI


さて、API KEY が入手できれば API の実装および実行が可能です。今回は AlchemyAPI で用意された中の顔認識機能である Face Detection API を実装してみます。 Face Detection API の詳細についてはリファレンスを参照してください:
Face Detection

上記ページを参照するとわかるのですが、AlchemyAPI の顔認識 API には2種類あります。1つは画像の URL を特定して、その画像から顔認識を行う URLGetRankedImageFaceTags と、もう1つは画像のバイナリデータを送信して、そのデータから顔認識を行う ImageGetRankedImageFaceTags です。画像がインターネット上にある場合は前者を、手元にある場合は後者を使うことになります。 本エントリでは前者の API を使う方法を紹介します。なおこの API を利用する場合、Alchemy のサーバーから指定された URL にアクセスして画像データを取り込む必要があるため、目的の画像データがプライベートネットワークやファイアウォールの内側、認証のかかったサイト内にある場合は利用できません。

画像が普通にインターネット上に存在している場合であれば、以下の URL に GET アクセスすることで、その画像を顔認識 API にかけることができます:
http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags?apikey=(API KEY)&url=(画像のURLをエンコードしたもの)&outputMode=json

この実行が成功した場合の結果は JSON フォーマットで以下のように返ってきます(赤字はコメント):
{
    "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": "(画像URL)",
    "totalTransactions": "4",
    "imageFaces": [ 実行結果は(複数個の顔を認識する可能性があるので)配列
        { 1つ目の顔検知結果
            "age": {
                "ageRange": "35-44", 年齢層
                "score": "0.403753" その確実度合い
            },
            "gender": {
                "gender": "MALE", 性別
                "score": "0.990987" その確実度合い
            },
            "height": "34", 見つかった顔の高さ
            "positionX": "176", 見つかった顔の横位置
            "positionY": "48", 見つかった顔の縦位置
            "width": "34" 見つかった顔の幅
        },
        { 2つ目の顔検知結果
            "age": {
                "ageRange": "<18",
                "score": "0.881865"
            },
            "gender": {
                "gender": "FEMALE",
                "score": "0.992608"
            },
            "height": "28",
            "positionX": "124",
            "positionY": "119",
            "width": "28"
        }
    ]
}

この例であれば2つの顔が検知されています。1つ目の顔は画像の ( 176, 48 ) - ( 210(=176+34), 82(=48+34) ) の位置にあり、約99% の確率で男性、約40% の確率で 35~44 歳であり、と判断されています。同様に2つ目の顔は画像の ( 124, 119 ) - ( 152, 147 ) の位置にあり、約99% の確率で女性、約88%の確率で 18 歳以下であると判断された、ということになります。

この実行部分を Java サーブレットで実装した例が以下になります。
public class FaceDetectionServlet extends HttpServlet {
  public String apiKey = "(API KEY)";
	
  protected void doPost( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException{
    String contenttype = "application/json; charset=UTF-8";
    String url = null;
    String out = "";

    req.setCharacterEncoding( "UTF-8" );

    try{
      String _url = req.getParameter( "url" );
      if( _url != null && _url.length() > 0 ){
        url = _url;
      }
			
      if( url != null && url.length() > 0 ){
        HttpClient client = new HttpClient();
        url = URLEncoder.encode( url );
        GetMethod get = new GetMethod( "http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags?apikey=" + apiKey + "&url=" + url + "&outputMode=json" );

        int sc = client.executeMethod( get );
        out = get.getResponseBodyAsString();
      }
    }catch( Exception e ){
      e.printStackTrace();
    }
		
    res.setContentType( contenttype );
    res.setCharacterEncoding( "UTF-8" );
    res.getWriter().println( out );
  }
}

このサーブレットに url という名前のパラメータで画像 URL を指定して Post アクセスすると上記の API が実行され、その結果がそのまま(JSON フォーマットのまま)返されます。後はこのサーブレットを改良して特定のデータだけを取り出して返すようにしてもいいし、サーブレット呼び出し元でこの JSON を解析して表示に使ってもいい、ということになりますね。

 

IBM に統合された AlchemyAPI 社の人工知能 API が IBM Bluemix を通じて誰でも利用可能になっています。
2015040201


AlchemyAPI(以下 "Alchemy")社は IBM の Watson 同様、学習型人口知能を研究・開発しており、またその API を公開して、第三者が簡単に利用可能な形で提供しています。IBM にも Watson という研究成果があり、同様の機能を買収したように見えるかもしれません。ただ実際にはこれら2つの人工知能はそのアプローチ方法が全く異なっています。 

Alchemy の人工知能はいわゆる "Deep learning"(深層学習)型であり、ニューラルネットワークを用いて「人間の脳の考え方に近い」アプローチ方法で人工知能の実現を目指しています。 一方 Watson は無数の選択肢の中から確度を元に絞込みを行う、という人間の脳とは違うアプローチで人工知能を実現しています。 いわば Watson とはタイプの違う人工知能を手に入れるための買収を行ったことになります。

この Alchemy の API に関しては、Watson 同様にデモサイトが用意されており、ウェブ API などの知識がなくても、ある程度は自由に使ってみることができます:
Demo | AlchemyAPI
2015040202



Alchemy の API でも Watson 同様に Language API(テキスト文書の意味を解読)や、Vision API(画像認識)が用意されていますが、Alchemy のユニークな機能として Vision Face Detection API(顔認識)が用意されています。本ブログエントリでは一番右の、この API を紹介します:

2015040203


上記ページの "AlchemyVision Face Detection" をクリックすると、この API のデモサイトが表示されます:
2015040204


Face Detection API では画像の顔部分を認識した上で、その人の性別や年齢を推測します。またその人が有名人であると判断した場合は、その人の名前まで表示してくれます。 試してみましょう!

例えばこの画面の一番右の画像をクリックして選択します。二人の女性が写っている画像(と人間は認識できる)ですが、Alchemy の Face Detection API はどのように判断するでしょうか?
2015040205

↑このように、認識結果が下部分に表示されます。ともに "FEMALE"(女性)で、左側の女性は 35~44 歳、右側の女性は 55~64 歳と認識されました。残念ながら(?)正解はわかりませんが、なんとなく正しそうに見えます、おそらく。。

右から2番目の、男性二人の写真を選択すると、こんな感じになります:
2015040206


ともに "MALE"(男性)で、右側は "Chad Smith" さん、左側は "Will Ferrell" さん、だそうです。すいません、これは僕があまり詳しくなくて、正しいかどうかを判断できませんが、きっと正しいんですよね?

このデモサイトでは、あらかじめ用意されている以外の画像を指定することもできます。画面上部の "Use your own image" と書かれたタブを選択するとこのような画面になり、画像 URL を指定するか、ローカルマシンに保存された画像をアップロードして API を実行することもできます:
2015040207

試しに、先日の QVC マリンスタジアムの開幕戦で始球式を務めた、世界的にも有名なはずの美女・佐々木希さんの画像を指定して試してみました。結果はこちら:
2015040208


"FEMALE"(女性)で、年齢はなんと 18 歳以下! まあアメリカ基準で考えたらそうとう童顔ですよね~。

ちなみに結果部分の "JSON" ボタンを選択すると、この API の実行結果の JSON を参照することができます。なるほど、こういう結果が返ってくるわけね、と:
2015040209


興味本位で「Alchemy 的には自分は何歳に見えるんだろう?」という、ネタ集めのために自分の写真でもやってみました:
2015040210


いい感じにお世辞入ってます(笑)。


このページのトップヘ