はじめに
この記事は、シスコシステムズ合同会社の同士による Cisco Advent Calendar 2018 の 22 日目として投稿しています。
昨年の記事はこちら。
Cisco Advent Calendar 2017
昨今では、機械学習/AI の技術を用いたアプリケーションが多く存在します。昨年の記事では、弊社製品の DNA Spaces という位置情報ソリューションを使用して、機械学習による分類アプリケーションを作成してみました。
(ソリューション名が CMX から DNA Spaces に生まれ変わりました!)
AI は現在、「○○に特化した」「○○が得意な」という枕詞が付くことが多いと思います。というのも、自然言語処理もできて数値予測もでき、かつ画像処理もできるような AI アプリケーションは作成が困難だからです。
そのため、AI アプリケーションを使いたいと思った際には、各アプリケーションの GUI を使い分けなければなりません。それだけではなく、各 AI アプリケーションに必要な教師データを、各 AI アプリケーションに沿った方法で収集/格納しなければならないのです。
そこで今回は、それらの AI アプリケーションに対して、普段使用するコラボレーションツールを利用することによる GUI の一元化、そして教師データ収集の簡易化を考えてみたいと思います。
使用するソリューション
今回ご紹介する方法では、Cisco WebEx Teams という弊社ソリューションを使用します。
メッセージ、ファイル共有、テレビ会議、ホワイトボード機能など、情報共有に必要な機能が多く揃っているソリューションです。
また、Webhook 先としては Zapier を利用します。
音声による教師データ収集も試したいので、Google Home と IFTTT のサービスも利用します。
擬似 AI アプリケーションの内容
教師データを利用する AI アプリケーションの設定として、以下のデータから電力需要を予測するアプリケーションを考えます。使用するデータの元は こちら 。
そのため、特徴量は以下のものとします。
- 月
- 日
- 時間
- 気温
これらの特徴量を用い、電力需要を機械学習によって予測するアプリケーションです。
今回の環境では、
1. Google Home に音声で気温を入力、もしくは WebEx Teams へメッセージ機能を用いて気温を入力
2. Python スクリプトで日付と時間を取得し、特徴量として加える
3. それらの教師データを AI アプリケーションへ渡す
という流れを想定しています。アプリケーションは例のため、今回は実際に AI アプリケーションは作成しません。
教師データ収集の流れ
「OK, Google」と高らかに宣言して、入力したいデータ(今回は温度)を声で入力する。
そのデータを IFTTT を用いて WebEx Teams に投稿する。もしくは、直接 WebEx Teams に気温のデータを入力して投稿する。
メッセージが投稿されると、Webhook によって Zapier 上の Python スクリプトを動かす。
Zapier の Python スクリプトでは、気温以外に必要な日付と時間のデータを追加し、確認として WebEx Teams に全特徴量を投稿する。
WebEx Teams の投稿を 4. と同様に取得すれば、教師データ収集完了!
数値データ以外の場合
機械学習の場合、画像ファイルなどを教師データにする場合もあります。その際には、WebEx Teams に画像ファイルを投稿し、そのファイルを取得することも可能です。もちろん動画も WebEx Teams で共有可能です。
機械学習データとは少しズレますが、WebEx Teams では、Word や Excel、PPT ファイルなど多くのファイルの共有が可能となっています。
WebEx Teams 上に共有された画像データを API で取得する方法は こちら から。
また、matplotlib などを用いて特徴量の分布や予測結果を図示させることもあるかと思います。
その場合、画像をそのまま WebEx Teams に投稿させることもできます。
WebEx Teams はコラボレーションツールですので、このような画像データの共有も簡単に、そして素早く行うことができるます。
Zapier で動かしているスクリプト
Zapier で動かしている Python スクリプト例が下記です。
Webhook を受け取り、WebEx Teams 上のメッセージを読み込み、日時データを追加して WebEx Teams へ投稿する、というスクリプトとなっています。
import json
import requests
import datetime
url = "https://api.ciscospark.com/v1/messages"
accessToken_hdr = 'Bearer ' + ACCESS_TOKEN
header = {'Authorization': accessToken_hdr, 'Content-Type': 'application/json; charset=utf-8'}
params = {
"roomId" : roomId,
"max" : 1
}
request = requests.get(
url = url,
headers = header,
params = params
)
result = json.loads(request.content)
text = result["items"][0]["text"]
month = str(datetime.date.today().month)
day = str(datetime.date.today().day)
hour = str(datetime.datetime.now().hour)
temp = str(text.replace("train_data:",""))
params2 = {
"roomId": roomId,
"markdown": u"以下を教師データにします。\n- Temp: " + temp + "\n- Month: " + month + "\n- Day: " + day + "\n- Hour: " + hour,
}
request = requests.post(
url = url,
verify = False,
headers = header,
data = json.dumps(params2)
)
最後に
昨年と同様、機械学習/AI に関連した記事を書かせていただきました。
スマートメンテナンスなど、現場のデータが必要な場合は数多く存在します。
この場合、現場でデータを収集、その後オフィスに戻り、会社のネットワークに接続して、収集したデータを加工する(ここでデータがうまく取れていないことが発覚することも...)など、物理的な移動によって業務効率が落ちることは十分に考えられます。
本記事が、そのような方への参考になれば幸いです。
免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本 Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。