Tech Sketch Bucket of Technical Chips by TIS Inc.

AlchemyAPIのAlchemyVisionを使ってみる

Pocket

AlchemyAPIを知っていますか?

 最近何かと機械学習系のサービスやプロダクトについての話題を聞くことが多くなったと思います。お馴染みのGoogleやIBMといった巨人たちもさることながら、それ以外にも機械学習やそれに類する技術を軸としたサービスを展開するスタートアップ企業なども徐々に市場でのプレゼンスを高めつつあります。 AlchemyAPI もそんな企業の一つです。

 AlchemyAPIは米国のコロラド州デンバー発の人工知能系の技術を応用した自然言語処理や文書解析のサービスを、主に法人向けに展開している企業です。設立自体は2005年とすでに9年ほど経っていますが、シリーズAのファンドを受けたのは2013年になってからですし、名前を目にするようになったのは最近になってからです。

 もともとの主力サービスはAlchemyLanguageという一連のテキスト処理系のサービス群です。具体的には対象となるWebページや文書に含まれるエンティティ、分類(タクソノミー)、センチメント、キーワード、言語の種類などなどに関する解析をWebAPIを介して行うことができます。複数言語に対応しているようですが、残念ながら日本語はまだサポート対象言語となっていません。

 そこで今回は、最近リリースされた画像解析系のサービス群であるAlchemyVisionを使ってみたいと思います。ちなみにAlchemyLanguageもAlchemyVisionも デモサイト が準備されていて、実際に使ってみた際にどんな解析結果が返されてくるのかの雰囲気を知ることができます。今回は扱いませんが、Languageの方も英文であればすぐに試してみることができますので、気になる人はデモサイトなどで試してみて下さい。

AlchemyVisionでできること

 AlchemyVisionを利用してできることは、今のところ2つだけです。

Image Extraction API
 指定したWebページ内に使われている画像を認識し、特にそのWebページで顕著に目立っているもの、そのページの特徴を示すと思われるような画像を識別します。解析結果は画像のURLが返ってきます。

Image Tagging API
 指定した画像を解析して、そこに写されているものがなんなのかを認識し、タグ付を行うことができます。解析結果は適合度のスコアと共に返されてきます。単に物体や人物・顔といったものを識別するだけでなく、シーン(街中といったものや夕暮れのような状況)の識別も可能です。

 どちらのAPIでの処理も、先行していた文書解析の中で利用されていたDeep Learning(深層学習)を応用しています。Deep Learningは機械学習の手法の一つで多段ニューラルネットワークを構成することで学習を行ない最終的な結果を得ます。Deep Learningについてまとめると、それだけで一つのエントリになってしまいますので、ここでは深くは触れません。興味のある方は別途調べてみるとよいと思います。

 ちなみにDeep Learningで有名な事例には、同じく画像の識別で、 Googleの猫 の例があります。YouTubeの動画を繰返し学習させることで最終的に「猫」を識別できるようになったという事例です。

APIを使ってみるための準備

 AlchemyAPIは有償サービスですので、サービスの利用量によって課金されます。ただ プラン一覧 にもある通り、一日辺りのトランザクション数が1000まで、同時リクエスト数が5件までであれば、全ての機能を無料で利用することができます。ためしにAPIを使ってみるというレベルであれば、無料の範囲で十分利用することができます。

API Keyの発行

 APIを利用するには、まず、API Keyを発行してもらう必要がありますので、 こちらから ユーザ情報の登録を行なって、API Keyを発行します。API Keyは登録したEメールアドレス宛てで送られてきます。API Keyが無事発行されたら、次はSDKの準備をします。

使いたい言語のSDKを準備

 AlchemyのAPIはWeb APIとしてRESTによるエンドポイントが公開されている形になります。利用したい解析処理に対応するエンドポイントにAPI Keyと必要なパラメータを合わせて渡せば、結果を得ることができます。素のRESTのエンドポイントを毎回URLを組立てて呼出すのでもよいのですが、多少手間がかかりますので、その辺りを簡単にしてくれる SDK が配布されています。SDKといっても、どの言語向けもだいたい1ファイルで作られていて、中身を開いてみれば分かるのですが、単にWeb APIを呼出すためのURLの組立てをパラメータに合わせてやってくれて、HTTPのPostなどで呼出すだけのメソッドが用意されているといったものになっています。

 用意されているのは以下の言語や実行環境向けのものになります。

  • Python
  • PHP
  • Node.js
  • Ruby
  • Java
  • Android
  • Perl
  • C/C++
  • C#(.NET)

 どのSDKも Github上のリポジトリ に上げられています。Alchemyの公式サイトの SDKのページ では、一部アーカイブファイルになっているものをダウンロードする形になっていますが、最新はGithubから取得できます。

 今回はPythonを利用してみることにします。導入の手順は SDKのページ に書いてある通りです。利用する環境のPythonのバージョンは2.7.6です。

 やっていることはGithub上のPython用SDKのリポジトリのクローン、ユーザ情報を登録して取得したAPI KeyをSDKのファイルから参照できるように設定、最後に確認のためのexampleの実行となっています。API Keyの設定を実行すると、alchemyapi_pythonディレクトリ内にAPI Keyが記述された状態でapi_key.txtが生成されます。以降はこのapi_key.txtとSDKの本体であるalchemyapi.pyを適宜利用していくことになります。

使ってみる

 SDKの準備ができたら、実際にサービスを使ってみます。ここではImage Tagging APIを使います。

単純に画像を解析してタグを取得する

 まずはシンプルに画像のURLを渡して、その画像が何の画像なのかを解析後、スコア付きのタグが返されてくるのを見てみたいと思います。 Alchemyのドキュメント には先程導入したSDKの本体のファイルを自分のプロジェクト用の任意のディレクトリにコピーして使えというように書いてあるので、今回はその方法で対応します。クローンしてきたディレクトリをパスに追加しても実行できるはずです。コピーする場合は本体と同様にapi_key.txtもコピーしてください。

 単に実行してみるだけなら、対話モードで実行してみてもよいですが、ここではコマンドラインからURLを引数として渡して実行するようにしておきます。

 AlchemyAPIをインポートして、imageTaggingメソッド呼び出しています。第1引数はAPIの呼出し方法で、現在はurlかimageのどちらかが選択できます。Web上にある画像でURLを指定できる場合はurlを選択します。ここではurlを選択しています。第2引数は実際に解析対象となる画像データを指定します。第1引数でurlを選択しているので、画像のURLを渡すようにしています。imageを選択している場合は画像ファイルのパスを渡します。第3引数にはオプション指定ができるようになっています。指定できるオプションは APIのドキュメント を参照してください。今回は何も指定していません。あとは単に帰ってきた結果をまるごと出力しているだけのコードになっています。

 では実際に実行してみます。まずは単純に写っているものがなんなのかを返してくれるか試してみましょう。渡す画像は以下の画像です。結果としてはペンギンと解析することを期待しています。

pen.jpg

実行は上記の画像のURLを実行時引数として渡して実行するだけです。APIの制限として、URLで指定した先の画像のサイズが1MB以下である必要があります。

実行結果は以下のようになりました。

 結果はSDKを利用した場合のデフォルトではJSON形式で返ってきます。他にもXMLやRDFで結果を返すように指定することができます。レスポンスの中身がそれぞれ何を意味しているかの細かい内容についてはAPIドキュメントを参照してください。ここで注目するのはimageKeywordsに配列で収められている中身のtextとscoreです。それぞれ何にカテゴライズされる物なのかを表すキーワードと、そのキーワードが指定された画像にどのくらい適合しているのかを示す信頼度を示す数値となっています。scoreは0.0から1.0の間で示され1.0に近づくほど適合度が高いとみなせます。配列は適合度が高い順にソートされています。

 この場合、penguinが0.924142と最も高い数値を示していて、期待通り画像がペンギンであることを解析結果として返してきています。他のキーワードも見てみると、2番目に適合度が高いのはanimalでこれもペンギンは動物ですので、解析結果としては正しいと言えるでしょう。3番目はdogと示しています。適合度も高くはなく、明らかに間違えていますが、動物というカテゴリの中で今回の画像を見た時に比較的形態が近いものを探った結果が返ってきているのかもしれません。

 次にシーンのようなものも判別可能とされているので、もう少し別な画像も試してみましょう。試してみたのは次の2つの画像です。

それぞれ実行してみた結果は以下のようになりました。

 

 1番目の結果が左側の画像を解析した結果です。スコアは微妙なところですが、sunsetというキーワードを返してきているので、夕暮れというシーンは識別できているようです。その他の川や水などのキーワードが返ってくるかと予想しましたが、この画像ではsunsetのみが返ってきました。画像の質・状態やサービス側で学習しているデータによると思われますが、まだまだ認識しきれないものもあるようです。

 2番目の結果が右側の画像の解析結果です。スコアがまさに1で示されているairはそのものなのでよいとして、planeやaircraftだけでなく、airshowが返されてきていることが興味深いです。実はこの画像は自衛隊の観閲式の時に我が家の上をパスしていった戦闘機を写したものなのですが、そういう意味でいうとまさにairshow的な要素がある場面を写したものになりますので、きちんとシーンを捉えた結果を返していると言えます。

応用してみる

 応用といっても、まずは簡単なものにしてみます。Tagging APIを利用して画像を解析し、返されてきたタグを使って画像の検索をします。Alchemyの公式デモも同じようなデモですが、あちらはAlchemy自体が持っていて学習させている画像から検索してきているようですので、ここでは外部のサイトから検索してみます。検索対象はFlickrのPublic Feedです。FlickrのFeedからの画像の取得はjQueryのAPIドキュメントのgetJSONの項目に書いてある実装例のJSONPを使ったものを応用してみます。

 流れ的には画像のURLを指定しTagging APIを呼出し→返されてきたタグのうちスコアが一定値以上のものを返送→受け取ったタグでFlikckr FeedのAPIを呼出し画像を取得といった感じです。Tagging APIを呼出す部分はサーバ側で行ない、Flickr Feedから画像を取得するのはクライアント(ブラウザ)側で行ないます。そもそもTagging APIはWeb APIの形で提供されているものなので、ブラウザ一丁で全てをやってしまうことも可能ですが、PythonのSDKを設定したということもあるので、今回はサーバ側をPythonで作ってみています。
 
imageTagging.py

 
images.html

 サーバ側はFlaskを利用して実装しています。imageTagging.pyと同じディレクトリにあらかじめAlchemyAPIのSDKのファイルであるalchemyapi.pyとAPIキーが記述されたapi_key.txtをコピーして利用しています。サーバ側は/tagsにポストで画像のURLが送られてきたらimageTaggingメソッドを実行するようにしています。imageTaggingの中では、AlchemyAPIのImageTagging APIを呼出し、タグ配列を取得しています。取得したタグ配列のうち、SCORE_TRESHOLDで指定した閾値を超えるスコアを持つタグのみを取り出しています。ここでは閾値を0.7に設定しています。

 クライアント側は入力された画像のURLを/tagsに送信し、返されてきたタグを使ってFlickr Feedから画像を取得しています。

 本当に元画像と類似しているものを取得するということであれば、さらにFlickrから取得した画像に対しても、Tagging APIの処理にかけて、元画像と同じタグがふられるか、かつ、そのスコアが元画像と同一もしくはその近辺の数値になっているかを確かめるべきですが、ここでは単にタグによる取得まででとどめています。もし元画像との比較をもう少し厳密に行うのであれば、Flickrからの画像取得と元画像との比較のためのタグ、スコアの取得、元画像との比較までの処理をサーバ側で実装する方がよいでしょう。

 実際にシーン判別を試してみた際に使った画像で実行してみた結果が以下のようになります。

ImageSearch1.png

ImageSearch2.png

 厳密な比較は行なってはいないなりに、それとなく近い画像は取得できているようです。

まとめ

 最近の「考えるマシン」の勃興(というより復活、再評価と言ったほうがよいかもしれません)により、身近に人工知能系の技術が使われるようになってきました。画像認識の分野は、比較的この手の技術の応用が早くから始まった分野ですが、使い方に慣れが必要なライブラリを使うのではなく、WebAPIを通して軽く利用できるようになることで、より応用が広まると考えられます。今回は単に画像を取得すると言ったレベルのことしか行なっていませんが、例えばAlchemyのようなサービスを複数組み合わせて利用したり、AlchemyのAPIを利用して下処理した上で、さらに複雑な比較処理などを独自に実装するといったこともできるでしょう。まだまだ認識できない(おそらく学習が足りていない)ものも多いですが、まずは色々試してみると面白いと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?