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

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

タグ:watson

IBM Watson から提供されている Visual Recognition(画像認識) API の1つで、ずっとベータ版として提供されていた Similarity Search (類似画像検索)API が正式公開となる前にサービス終了となりました:
Visual Recognition API – Similarity Search Update


非常に簡単に使うことができて、機能も便利で、ベータ版と知りつつ自分もいくつかのプロダクトの中で使ったり、そのサービスをブログやイベント等で紹介したりもしていました。詳しい経緯はわかりませんが、サービスが終了になったことは非常に残念でした。

実は以前にも同じようなことがありました。いわゆる「トレードオフ分析」を行う機能を API として提供していた Watson Tradeoff Analytics API は 2017/05/11 を以ってサービスの追加ができなくなりました(作成済みのサービスは 2018/04 まで使えます)。この API はちょうど自分がこの分析手法を勉強し始めた頃にサービス終了がアナウンスされ、とても残念でした。

この API に関してはちょうどトレードオフ分析を勉強しはじめた当初だったこともあり、自分でもトレードオフアルゴリズムを理解し始めた頃でもありました。で、こんな互換 API を作って公開したのでした:
Yet Another Watson Tradeoff Analytics API


さて話を元に戻して今回の Similarity Search API のサービス終了です。これも非常に残念なことでした。トレードオフ分析の時と異なるのは自分が画像検索アルゴリズムについて勉強していたわけではなく、互換 API を作るにはちとハードルが高かったということでした。

が、調べてみると画像検索にはいくつかの考え方やアルゴリズム、それらごとの向き/不向きがあって、比較的簡単に実現する方法もないわけではない、ということがわかりました。その1つがカラーヒストグラムを使った方法でした:
類似画像検索とカラーヒストグラム


オリジナルの Similarity Search API がこのアルゴリズムを使っていたかどうかは分からない(おそらく使っていない)のですが、とりあえずこのアルゴリズムによって「画像を学習する」&「学習した画像の中から類似した画像を見つける」という最低限必要な機能は実装できそうだ、と思えるようになりました。というわけで今回も互換 API の開発に挑戦してみたのでした。そしてとりあえず出来上がったものをオープンソース化したのがこちらです:
YASS(Yet Another Similarity Search)

2017092400



実装の対象としたのは Watson API Explorer の Visual Recognition API のページを参考に "Collections" カテゴリと "collection images" カテゴリにある全 12 API 、そしてオリジナルにはなかった「学習画像のバイナリを取得する API 」を合わせた 13 API です。オリジナル API のパラメータについては元のものとほぼ互換性を付けたつもりです。また新しい API のパラメータは URL 部分以外にないので特に説明は不要と思っています。なお「ほぼ互換性」という表現を使いましたが、互換性のない箇所は以下のとおりです:
  • オリジナル API の実行時に指定が必要だった API Key を廃止しました。実行時に API Key の指定は不要です。代わりに(必要であれば)Basic 認証をかけることができるようにしました。
  • オリジナル API の実行時に指定が必要だった version パラメータを廃止しました。実行時に version の指定は不要です。正確には version = '2016-05-20' の仕様に従ったものを実装しています。
  • オリジナル API の制限事項であった「1コレクションに対して 1,000,000 画像まで」という制約はありません。ただし画像バイナリごと Cloudant に格納されるため、Cloudant の容量にはお気をつけください。
  • 学習させた画像のバイナリ(画像そのもの)を取得するための API : GET /v3/collections/{collection_id}/images/{image_id}/binary を新たに追加しました。collection_id と image_id を指定して実行すると Content-Type と合わせて画像バイナリが API サーバーから返されます。
  • API 実行後の HTTP レスポンスには status という属性を含めるようにしました(このため、実行結果のフォーマットには互換性がありません)。status = true の場合は成功、false の場合はなんらかのエラーが発生したことを意味しています。

【前提環境】
この互換 API は Node.js で記述されています。従って API サーバーには Node.js のランタイム(と npm)がインストールされている必要があります。また画像や検索に必要な情報は Cloudant データベースに格納されます。2017/Sep/24 現在の仕様では IBM Bluemix 上の Cloudant を使う前提で記述されているため、IBM Bluemix のアカウントを取得して、Cloudant サービスを1つインスタンス化し、その username と password を用意してください。


【インストール方法】
(1) 上記サイトから git clone するか、zip download &展開して、ソースコードを取得します。
(2) ソースコードの settings.js を編集します(青字はコメント。最低限編集が必要になるのは上2つ):
exports.cloudant_username = '(Cloudant Username)';  // Cloudant の username(必須)
exports.cloudant_password = '(Cloudant Password)';  // Cloudant の password(必須)
exports.cloudant_db_prefix = 'yass_';               // Cloudant に作成するデータベース名の prefix(必須だが変更しなくてもよい)
exports.basic_username = 'username';                // Basic 認証をかける場合の username(''にした場合は Basic 認証なし)
exports.basic_password = 'password';                // Basic 認証をかける場合の password(''にした場合は Basic 認証なし)
exports.api_base_path = '/v3';                      // API の基本パス(''でもよいし、変更してもしなくても良い)
(3) npm install を実行
例) $ npm install

(4) Node.js で app.js を実行
例) $ node app.js

(5) curl やアプリケーションから API を利用
例) $ curl -XGET 'http://localhost:6001/v3/collections'


【システム構成】
Similarity Search API の "Collection" に相当する部分を「Cloudant のデータベース」に、画像データに相当する部分を「Cloudant のドキュメント」にみなして格納するようにしました。ドキュメントには attachment として画像ファイルそのものを格納すると同時に、類似検索ができるよう正規化されたカラーヒストグラム情報や、画像データの metadata を合わせて格納するようにしています:
2017092401


類似検索 API(POST /v3/collections/{collection_id}/find_similar)を実行した時の挙動はまず Collection から全画像を取り出し(つまり Collection に該当する Cloudant データベースから全ドキュメントを取り出し)、カラーヒストグラム情報を1つずつ取り出しては色の類似性を調べて、その上位何件かを返すというアルゴリズムにしています。必ずしも効率のよい検索方法ではないと理解していますが、カラーヒストグラムの比較を効率よく行う方法が思いついていないので、現状はこの方法にしています:
2017092402



【所感】
カラーヒストグラムアルゴリズムを採用したこの互換 API の検索精度はオリジナルのものとは同じではない可能性が高いと思っています(色が重要、どちらかというとイラストよりも写真の類似性に向いている、など)。あまり期待通りでなかったとしてもオープンソース化されているので該当部分のアルゴリズムを変更する、という方法もあると思っています(ちなみに MIT ライセンスで公開してます)。

あと、IBM Watson の互換 API を作ったのは今回が2回目ですが、このように「はじめから仕様が決まっている(仕様が変わらないことも決まっている) API を作る」のは楽です。ある程度、仕様として完成されているが故の安心感もありますし、何度も使っていた API なので動作確認も楽でした。実際、今回の互換 API は休暇を利用して(学習部分も含めて)ほぼ3日で作り上げました(「3日で作れる程度のアルゴリズム実装」と言えなくもないと思います)。


 

最近、従来種ではなかったはずの猛毒アリである「火蟻(ヒアリ)」が日本で見つかった、というニュースを耳にします:
ヒアリ、東京で発見 ついに関東上陸 大井埠頭のコンテナから


外来種かつ毒虫という特徴から、素手で捕まえたり、触ったりするのが非常に危険なアリです。とはいえ、この季節は普通のアリを見かけることも多いので、ヒアリかどうかを判断するのが難しい問題もあります。

さて、最近話題の画像認識を使って蟻の画像を識別させて、「それがヒアリかどうか?」を判断することはできるでしょうか? IBM WatsonVisual Recognition API を使って試してみました。

当初は「まずはヒアリを学習させて・・・」と思っていたのですが、調べてみたら IBM Watson の Visual Recognition V3 では標準機能でヒアリを識別する機能を持っているようでした(これに気付いた時はちと驚きました)。というわけで普通に公開されているデモ用ページを使い、カスタマイズなしの標準機能だけで試してみました。
Visual Recognition Demo

2017070701


標準機能で画像認識を試す場合は、ブラウザで上記ページにアクセスして、赤枠部分をクリックし識別させたい画像を PC 内から指定するだけです。非常に簡単です。


今回、まずはこのヒアリの画像を指定してみました:
fire1


しばらく考えて・・・
2017070702


はい、結果がでました!"pharaoh ant"(ファラオ蟻、何それ?)とかに混じって "fire ant"(ヒアリ)という識別結果が表示されています!検索スコアも 0.80 と中々高い結果になっています(赤枠部分参照):
2017070703


では次はこの「黒蟻」の画像を指定してみます:

kuro1


結果はこうでした。"carpenter ant" は日本では「黒蟻」と呼ばれているものです(ちなみに "sanguinary ant" は「銀蟻」です)。そして "fire ant" とは識別されませんでした。これも正解です:
2017070704


いくつかの画像で試してみたので、その結果を表にしておきます:
画像正解識別結果スコア成否
 fire1
ヒアリファラオ蟻
ヒアリ

銀蟻
0.81
0.80
0.60
 fire2
ヒアリヒアリ0.60
 fire3
ヒアリヒアリ
軍隊アリ
0.83
0.50
 kuro1
黒蟻黒蟻
銀蟻
0.81
0.50
 kuro2
黒蟻黒蟻0.93
 gin1
銀蟻銀蟻0.51
 gin2
銀蟻銀蟻
黒蟻
0.64
0.60


おおーっ! 適当に集めた画像で試してみただけですが、それなりの精度で検索できているように思えます。 カスタマイズなしの標準機能だけでもいい感じでした。ぶっちゃけ想定以上です(笑)。


皆さんもアリ画像を使って上記サイトで色々試してみてください。なかなかの精度で調べてくれそうですよ。

#最初は学習させるつもりで蟻の画像を大量に集めて見ていたので、気持ち悪くなってきた・・・

Watson API の1つで、複数の選択肢の中から自分の与えた条件に合うアイテムをトレードオフ判断で絞り込んでくれる、という便利な Tradeoff Analytics API があります(ありました)が、残念ながら5月11日をもって新規インスタンスの生成ができなくなってしまいました(作成済みインスタンスは2018年4月まで使えるようです。詳しくはこちら)。

Bluemix に Watson API が追加された当初から存在していた API の1つであるだけでなく、個人的にもデモなどで使っていて、非常にわかりやすくて便利な API だっただけに残念でした。

このアナウンスがされたタイミングから準備はしていたのですが、実はこの Tradeoff Analytics と同様の(近い互換性を持つ)API を自分でオープンソース化前提で作っています。まだ途中といえば途中ですが、制約付きで一応動く状態にはなっています。新インスタンスが生成できなくなったこのタイミングで一旦公開してみようと思いました:
https://github.com/dotnsf/yatradeoff


なお、この API を実際にアプリケーションサーバー上で稼働させているものもこちらに用意しました。ただ API だけ使いたい人はこちらをどうぞ:
https://yatradeoff.au-syd.mybluemix.net/dilemmas


この URL にブラウザで GET アクセスしても何も起こりません(エラーメッセージが表示されるだけ)が、POST アクセスすると API として動きます。その際にはユーザー名: username &パスワード: password を指定してください(オリジナル同様 Basic 認証です)。


元の Tradeoff Analytics API 同様、/dilemma という POST API エンドポイント1つだけが定義されています。ポストする JSON 型インプットデータのフォーマットには互換性があります。

API の実行結果としての JSON データにも互換性をもたせました。ただ現状はオリジナルのサブセットになっています。現状、以下の3点の制約事項があります:
(1) preferable_solutions データは常にブランクになります
(2) 解析結果は solutions に含まれますが、'FRONT' ステータスを持つデータだけが含まれます
(3) map information を出力するようパラメータで指定しても map information は返されません



ただ1点、オリジナルにはなかった優先順位を考慮する機能も加えています。エンドポイント URL のパラメータに prioritised=1 を追加して実行(例: /dilemma?prioritised=1)すると、インプットデータの JSON データは優先順位順に解釈されます(先にある方が高い優先順位であると解釈されて実行されます。例えば「項目AとBを両方ともトレードオフの材料にする」のではなく、「項目AとBを両方ともトレードオフの材料にするが、Aの方をBよりも優先する」というトレードオフを可能にしています)。


そして、このパラメータを付けて実行した時の API 実行結果も優先順位順に返されます。先にある方がよりオススメな結果、ということになります。まあ preferable_solutions の代わりという位置付けです。


※実はこの機能を付けたくて自分で API を改良した、という経緯があります。


結果の JSON テキストの solutions 内がトレードオフの結果です。オリジナル API では全ての選択肢に対して 'FRONT' か 'EXCLUDE' かの結果を含めていましたが、現状この API では 'FRONT' のもの(トレードオフ判断の結果、選択肢の候補として残ったもの)だけが返される点に注意してください。


こちらの続きです。以下の紹介はこちらの中で書かれた作業を前提としているので、実際に試してみたい方はまずこちらを参照ください:
Watson Workspace と Zoom を連携する


Watson Workspace に追加した Zoom のチャットボット "Zoom.ai" を使って、第三者との会議の調整を依頼した時の様子を紹介します:
2017050301



この Zoom.ai 機能を有効にしたスペースの中で(誰にともなく)"schedule a meeting with (メールアドレス) tomorrow."((メールアドレス)さんと明日の会議を予定してくれ)と打ち込みます。すると、Zoom.ai がこのメッセージに反応し、"you asked me to schedule a meeting with (メールアドレス) tomorrow sometime between 9:00am and 5:00pm. Is this correct?"((相手の名前)さんと明日の 09:00AM から 05:00PM までのどこかで会議を調整すればよろしいですね?)と聞いてきました。前回の作業でアドレス帳を共有していたので、メールアドレスから名前を引いてきたわけか、なかなかわかってるね:
2017050211

というわけで "Sure"(そうだよ)と返事をすると、"I have emailed (相手の名前), and asked them to choose a time slot based on your availability and will let you know what happens."((相手の名前)さんにメールして、あなたのスケジュールの空きに合わせた日時での選択肢といっしょに打ち合わせの候補日時を選ぶよう伝えておきました。どうなるか、しばらくお待ち下さい)だそうです。あ、もう問答無用でメールしちゃうのね。。 (^^;:
2017050212


その頃、その相手の人には(僕があなたと打ち合わせしたがっている、という内容の)このようなメールが届いていました。で、メールに書かれたリンクをクリックすると・・・:
2017050201


僕の顔写真と打ち合わせ調整の画面が表示されます。で、場所は相手に選ばせて、時間帯は僕の予定がない、いくつかの候補が表示されていて、この中から選択できるようになっています。日時のタイムゾーンは必要に応じて変更できます(デフォルトは Asia/Tokyo でした):
2017050202


で、この人は場所に「俺の家」、時刻は 07:30AM-08:30AM の早朝会議を選択したことにします。Google カレンダーに同期、にもチェックしました。で "Confirm" ボタン:
2017050203


すると、この人の画面には選択した内容が確認の意味で表示されます:
2017050204


同時に、この人の Google カレンダーにはこの会議がセットされました:
2017050205


その頃、元々の依頼をした僕の所にはスケジュール予約のメールが届いていました。画面はノーツですが、カレンダー(iCal)対応のメーラー環境であれば、このようにカレンダーメールとして届きます。これを "Accept" すれば、この予定が自分のカレンダーにも反映され、相手には「了承」メールが届きます:
2017050206


同時にこんな確認メールも届いていました。これで双方にとって都合のいい時間を選んだ上での会議日程が調整できたことになります:
2017050207


とまあ、こんな感じ。会議を依頼した僕は Zoom.ai にその旨を伝えただけで、Zoom.ai は(共有済みの)僕のスケジューラーを確認した上で空き時間帯からいくつかの候補と併せて相手にメールで送り、相手が時間帯を選んだら双方に会議招集の確認メールを送る、という機能を代行してくれたことになります。そしていざ会議が始まる段階になったら、決めた場所に行ってもいいし、Zoom が提供する機能でウェブ会議を行うこともできる、ということになりますね。確かに会議の日時調整は面倒な作業なので、そこを最小限代行してくれてることになります。

この Zoom.ai はまだ英語でしか動かないし、Watson Workspace も(まだプレビュー版ですが)日本語が使える機能があったりなかったりするので、ここで紹介した機能が日本語でできるようになるまではまだしばらくかかるかもしれません。ただ、それでも近未来的な機能が実際に使えている場面を目の当たりにするのは刺激的です。


Zoom というアメリカ生まれの Web 会議サービスがあります:
2017050208


(自信ないですが、日本語公式ページはここかな? 一応日本語マニュアル類は入手できます)
http://zoom-japan.net/


Zoom の特徴は主催者がアカウントを持っていると参加者は URL だけで参加できるとか、簡単に録画できるとか、参加者を仮想の小部屋に分けて分科会を開けるとか、いろいろ便利そうな機能が搭載されているようです。

この Zoom 、昨年末に IBM Watson Workspace とのビデオ会議統合が発表されていました:
Zoom Provides Video Meeting Integration for IBM Watson Workspace

2017050301


IBM の新しいリアルタイム協業ツール Watson Workspace (現在はプレビュー版)に、その場でビデオ会議を行えるような機能を提供する、という発表でした。この時点では具体的な製品や機能に関する発表はありませんでした。

その Zoom が、コグニティブエンジンを搭載したチャット機能を(実際に動かすことのできる)Watson Workspace の拡張アプリケーションとしても提供していたことを最近知りました(苦笑)。プレビュー製品に対する発表とは攻めてますね~:
Zoom Showcases IBM Watson Workspace Integration at IBM Connect



当初の「ビデオ会議を行える機能を提供する」ことに加えて、なかなか面白いコンシェルジュ機能が搭載されていたので、試しにちょこっと使ってみました。Watson Workspace 自体がまだ正式版ではなく、一部の人しかアカウントをお持ちでないかもしれませんが、その雰囲気だけでも伝わることを目指して紹介します。



まず、こちらが Watson Workspace の画面です。これ自体は Slack 的なリアルタイムメッセージ共有ものをイメージしていただけるとわかりやすいかなあ。。
2017050201


そしてこちらが今回紹介する Zoom on IBM Watson Workspace です。Watson Workspace のアカウントをお持ちであれば、このページから "Add to Watson Workspace" と書かれた赤いボタンを押して拡張機能を有効にすることも可能です:
2017050202


"Zoom.ai" と呼ばれる拡張機能の設定画面です。この拡張機能を有効にするスペースを1つ選べ、みたいなことを言われますが(ここで指定したスペースにはうまく反映できなかったので、詳しくは後述)適当に1つ選んで "Add App" ボタンをクリックします:
2017050203


「正しく追加されました」みたいなメッセージが表示されます。ここでは Close ボタンをクリック:
2017050204


先程指定したスペースに以下で紹介する設定を加えてもうまく有効にできなかったので、この Zoom.ai 専用のスペースを1つ作成します:
2017050205


まず、このスペースのメンバーとして Zoom.ai を追加します。"Zoom.ai" と入力すると、それっぽい人が見つかるので、選びます:
2017050206


Zoom.ai さんがスペースのメンバーに追加されました。続けて "Name Your Space" をクリック:
2017050207


スペースの名前を指定します。ここでは "Zoom.ai" と指定しました。最後に "Create" ボタンをクリックします:
2017050208


Zoom.ai さんがメンバーに含まれた "Zoom.ai" スペースが追加されました。これを選んで、さっそく何か独り言を書いてみましょう。"Hello, Zoom.ai" と入力しています:
2017050209


すると、いきなり Zoom.ai がこの独り言に反応します! ・・・ただよく見ると「アクセス権が足りない」とか言ってますね。。
2017050210


スケジュールとアドレス帳の中身を知りたいようです。仕方ないな・・・というわけで、僕は "Google" をクリックして、GMail のカレンダーとアドレス帳をこいつに共有することにしました(試していませんが、Office365 や Apple iCloud にも対応しているようです。ノーツは・・・):
2017050201


で、Google の OAuth 認可の画面に移動します。「許可」をクリック:
2017050202


「セットアップ完了」です。この画面は閉じてもOK:
2017050203


改めて元のスペースに戻り、"Hello, Zoom.ai, again." と挨拶してみました。すると "Hello there Kei! What can I do for you?"(ハロー、けい。何かお手伝いできることある?)と聞いてきました。ほほー・・・:
2017050204


さっきカレンダー共有したから俺の予定知ってるはずだよな? というわけで、"I would like to check my schedule."(俺のスケジュールを教えてくれい)と偉そうに聞いてみました。はたして理解してくれるかなあ:
2017050205


・・・なんと、"you have no meetings today between 9:09am and 11:59pm."(今日は 09:09AM から 11:59PM まで何の予定もないよ)との返事が。ちなみに 09:09PM はこの質問を聞いた時刻です。で、実際 Google カレンダーにはこの日時の予定なし。ほう、なかなかやるな!:
2017050206


・・・他にはどんなこと聞けるんだろう? というわけで "help"(苦笑):
2017050207
 ↑前職の会社の名前が出てますが気にしないでね(アドレス帳にそう登録してあったので)。


なるほど、スケジュール確認したり、キャンセルしたり、あと Uber 呼んだり、天気確認したりもできそうね。。
2017050208


試しにメールアドレスを指定して、"who is XXXX"(XXXX って誰?)と聞いてみると、共有を許可したアドレス帳の情報を元に名前や電話番号などの情報を調べて、返事を返してくれます:
2017050209


また "weather forecast in Tokyo tomorrow."(明日の東京の天気は?)と聞くと天気予報情報を返してくれました:
2017050210





と、こんな感じでとりあえず Zoom.ai とチャットできるところまでは確認できました。ところで、もともと Zoom は Web 会議サービスの大手であり、Watson Workspace にウェブ会議機能を提供する、という発表でした。次回はこのチャット機能を使って別の人との会議を調整する様子を紹介する予定です。



(2017/May/05 追記)続きはこちら


このページのトップヘ