Technology Topics by Brains

ブレインズテクノロジーの研究開発機関「未来工場」で働くエンジニアが、先端オープン技術、機械学習×データ分析(異常検知、予兆検知)に関する取組みをご紹介します。

World of IoTに出展したデモ

こんにちは。おじさんチームのこんのです。
今回は、去る12月16日〜18日に東京ビッグサイトで開催されたhttp://www.semiconjapan.org/ja/iotで出展したデモについて紹介したいと思います。
なお、この3日間のイベントで、200名を超える方々が弊社のImpulseについて興味を持ち、お話を聞きにきてくださいました。ありがとうございます!!

デモは、弊社サービスのひとつである、リアルタイム大規模データ分析基盤Impulseを使った異常検知です。
Impulseとはなんぞや?という方は下記ページをご覧ください。
www.brains-tech.co.jp

太陽光発電パネルの発電量の故障予兆検知を想定し、それに似せた構成を取りました。
なお、今回のデモにあたり、アットマークテクノさんからArmadillo-IoTをお貸しいただきました。
アットマークテクノさんのご厚意に、この場を借りてお礼申し上げます!

f:id:bti-konno:20151218230257p:plain

概要構成は上記図のとおりです。ちょっとだけ詳しく流れを説明すると、

  1. 4つ並べた照度センサー(太陽光発電パネルの代わり)で照度(発電量の代わり)を測定し、その照度をアットマークテクノさんのArmadillo-IoTで収集します。
  2. 照度センサーから受け取ったデータは、アットマークテクノさんに作成いただいたプログラムにてファイルにJSON形式で追記されていきます。
  3. 上記ファイルを fluentd で監視し、6秒おきに溜まったデータを MQTT でAWS IoTにPublishします。
  4. AWS IoT から弊社Impulseにデータを流し込みます。
  5. Impulseでは正常状態を学習させておき、学習したモデルから入力されたデータが大きく外れていないかを検知します。
  6. 異常を検知した場合、AWS IoTのRasberry Pi2のShadowを書き換えます。
  7. Raspberry Pi2 は、Shadowが書き換わっていた場合、Arduino、LED、スピーカーを使って異常を知らせます。

Armadillo-IoTは、開発環境で使われるDebian(SDカード)で起動するようにしています。開発環境DebianでArmadillo-IoTを使用するとき、SWAP領域を作ることを忘れないでください。これがないとC/C++のソースからのコンパイルがかなりの割合で失敗します。ご注意ください。
また、dateが2000年スタートになっています。気付かずに証明書を入れてMQTTSで通信しようとするとSSLエラーがでます。日付時刻修正をお忘れなく。

fluentdからAWS IoTにMQTTでPublishするPluginは、GitHub - yuuna/fluent-plugin-mqtt を使わせていただきました。
yuunaさんにこの場を借りてお礼を申し上げます!

今回SORACOMさんのモバイルネットワークを使ってAWS IoTへ連携していますが、SORACOM Beamは使っていません。
# SORACOMさんの回線を使うことに決めたのがイベント前日ということもあり・・・。
# つまり、SORACOMさんのセットアップはものすごく簡単ということですね、はい。
# Armadillo-IoT、Raspberry Pi両方ともSORACOMさん接続です。
# Armadillo-IoTの3Gセットアップはアットマークテクノさんのマニュアルページに丁寧に記載されています。
# Raspberry Pi2は dietposterさんのQiitaを参考にしました。
# dietposterさん、ありがとうございます m(_"_)m

AWS IoTでは、PublishされたトピックのメッセージをそのままKinesisに流し込んでいます。

ImpulseではこのKinesisから流し込まれた値を取り込み、正常状態から外れていないかを指定された秒数間隔でチェックします。今回は同じような環境にある複数の照度センサーでしたので、Impulseのデータ特性分析から相関性が高い状態にあることがわかっています。つまり、Impulseではこの相関性が崩れた時に異常と判定します。
異常判定時は、Lambdaを通してRaspberry Pi2のShadowを書き換えています。

Raspberry Pi2では、AWS IoT SDK(node.js版)を使って、Shadowが書き換わった際に呼び出される function で(GPIO経由で)LEDを点灯させ、ミニディスプレイ付きArduino(実際には SparkFun Electronics のMicroView)にてメッセージを表示し、スピーカーから異常検知したことを伝えるようにしています。
f:id:bti-konno:20151219001132p:plain
スピーカーからお知らせする内容は、OpenJTalk を使って予め合成音声(合成音声には名工大のメイちゃんを使わせていただきました)を作っておいたものをaplayで再生しています。
なお、node.js(Javascript)からGPIOへ簡単にアクセスするために、Intelが開発している mraa ライブラリをインストールしています。mraa はIntel Edison等で主に使われていますが、Raspberry Piもカバー範囲に入っています。おすすめです。また、実際のコードは、AWS IoT Handsonで公開しているサンプルプログラムを若干改良しただけで済んでいます。

ざっくりと簡単に紹介いたしました。
いかがでしたか?
このような簡単な準備、構成で Impulse による異常検知ができてしまいます。

イベントの期間中、デモをお見せしたお客さまからこんなことを言われました。
「人がやっても同じではないか?Impulseは何がすごいのか?」
お客さま、いいことをおっしゃってくれました。それです。それなんです。
機械学習を活用することで、[人と同じこと]がコンピューター上でできるようになったんです。
さらにコンピューターでやることで、[人以上]に処理することができるのです。
確かに10個やその程度の数であれば人でやったほうが早いかもしれません。それが数百、数千、数万、それ以上あった場合はどうでしょう?膨大な数のデータソースを監視し異常を見つけ出すのは、人では途方も無いコストをかけなければ難しいでしょう。あるいは、それを長期にわたって絶え間なく監視し続けなければならないとしたらどうでしょう?やはり人でやるのは難しいと思います。人と同じように異常を見つけ出し、人以上に(長期間、膨大な数を)処理できる。それこそがImpulse、といいますか機械学習を活用したサービスが提供できるメリットなのです。

センサーでこれから何かしらデータを集めようとしているみなさま、分析しようとしているみなさま、故障予兆検知をしたいというニーズをお持ちのみなさま、Impulseであれば収集・蓄積・可視化から異常検知まで一通りの機能を提供できます。ぜひブレインズテクノロジーにご相談ください。
きっとお役に立てると思います。