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

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

タグ:watson

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 追記)続きはこちら


先日、IBM Watson Summit 2017 (内のユーザーグループイベント)の開催に併せてリリースした「いらすとや検索」のチューンナップに挑戦しました。



まず、このサービスの内容を簡単に解説します。自分自身も使っていますが、質の高いフリー素材イラストを数多く公開いただいている「いらすとや」様のイラストを、なんとなく覚えている手描きイラストから IBM Watson の類似画像検索機能を使って検索できるようにする、というものです。

この検索サービスでは、「いらすとや」様のイラスト画像を、そのイラストが紹介されているページの URL 情報と併せて IBM Watson の Visual Recognition インスタンスに学習させ、類似画像検索を可能にしています。 そして「いらすとや検索」サイトで描いた絵を画像化し、似たイラスト画像を探した上でイラスト紹介ページへのリンクを作る、という比較的シンプルなロジックで作成しています。ユーザー会の中で紹介し、そこそこの反響もいただきました:
2017050201
ユーザー会での説明資料より)


ただ自分で使っているうちに、作った当初は気付かなかった部分も見えてきました。その中の1つが「カラフルなイラスト画像が検索候補にあまり出てこない」というものでした。理由も明白で、検索時に描くイラストがモノクロなのだから、「類似した画像」を検索するとモノクロの(あるいはモノクロに近い)画像が大量に候補として出て来るのです。形が似ているかどうかというよりも、色の類似性で選ばれてしまっている感じでした。


この問題を解決しようとすると、方法は大きく2つ考えることができます。1つは「検索時に描くイラストに色を付けられるようにする」方法、もう1つは「学習時にモノクロ変換した画像を学習して、そのモノクロ変換した画像の中での類似画像を探す」方法です。要はカラー画像として類似画像を探すのか、モノクロ画像として類似画像を探すのか、という2つの方法です。

実装そのものはどちらでもできると思いますが、このうちの前者はあまりユーザーフレンドリーではないと思っています(手軽に描いたイラストで検索できることがサービスの価値であり、彩色の手間をかけてまでイラストを検索したいと思えない)。というわけで、後者の解決策を実装しました。 ただ画像のグレースケール化は(ロジックが確立されているという意味で)まだ簡単なのですが、モノクロ(白か黒かの2値)化となると、中間くらいの色を白と黒のどちらと判断すべきか、というイラストの特性によってもロジックが左右される問題があるので結構難しかったりします。そのあたりはいずれ詳しく紹介できればと思っています。


で、このチューンナップのビフォー&アフターがこちら:

【ビフォー】
2017050201


【アフター】
2017050202



チューンナップ前の類似画像検索の結果は全体的に白っぽかったと思いますが、チューンナップ後の結果がかなりカラフルになったと思います。つまりモノクロ画像で類似画像を検索した結果、現在はカラフルな画像もシンプルなイラストからの検索候補として得られるようになった、ということです。

IBM Watson Summit 2017 開催記念作品!


自分だけではないと思いますが、可愛らしいフリー素材を数多く公開していただいている「いらすとや」http://www.irasutoya.com/)さんには、大変お世話になっております。



僕の場合はプレゼンテーション内のイラストに多く使わせていただいています。中にはいらすとやさんの素材だけでサイトや資料を作ってしまう職人さんもいらっしゃるようです。

ある程度「いらすとや」を使っていて感じたことは「目的の素材をうまく見つけるのが難しい」ということです。「昔こんな感じのイラストを見た記憶があるんだけど、どのカテゴリーだったっけな?」とか、「この人が使ってるこのイラストと同じものを使いたい」とか、自分の記憶が曖昧だったり、これというキーワードが思いつかない時に目的のイラストをうまく検索できないことがたまにあるのでした。


で、その解決策になるかどうかわかりませんが、興味半分でこんなサイトを作ってみました:
「いらすとや検索」



↑見た通りのサイトです。「なんとなく」覚えているイラストをなんとなく描いて、search して、そのイラストに似た「いらすとや」画像を探す、というものです。PCであればマウスで、スマホの場合はタップで描きます。検索結果は最大100件表示され、その中に含まれていれば目的のページに(クリックで)移動できる、というものです:
2017042501

    ↓

2017042502


例えばこの↑例、「鳩」で検索すればすぐに見つかりますが、「鳥」で検索するとなかなか候補が出てきません。「鳩のイラスト」とまで認識できていればテキスト検索でも探せるのですが、そこまでハッキリを覚えていないようなケースでも「たしかこんな感じの・・・」というイラストが描ければ検索できるようになっています(たぶんw)。


今のところ描くイラストは黒線一本のみで描く必要があります。描き直しに消しゴムなどはなく、reset する必要があります。編集機能にはまだ制約が多いですが、シンプルさを重要視しました(ということにします)!
2017042503



なお、このサイトはコグニティブエンジンである IBM WatsonVisual Recognition(画像認識) API を使って、あらかじめ学習させたイラストからの類似画像を人工知能のテクノロジーを使って検索する、という仕組みで実装しています。いらすとや内の全ページをクロールする方法が分からなかったので、現在は「リクエスト」ラベルから辿れる画像を対象にしています。仕組みはシンプルですが、実はそこそこなテクノロジーが裏に潜んでいたりします。


・・・まあ、ネタにどうぞ(笑)。
 

また、このアプリを作る上で、以下の2つの情報を参考にしました。HTML5 の Canvas にマウス移動(とスマホのタッチ)で線を描画するワザと、特にスマホのタッチで描画をする際に画面のスクロールを強制的に止めるワザです:

JavaScript でマウス座標を取得し、Canvas上に線を描画


このページのトップヘ