SensorBeeのご紹介
Gopher Night #1
@disktnk
2016/03/17
自己紹介
 田中大輔 (@disktnk)
– 某ピー社アニオタ枠採用
– 元金融工学ライブラリ屋さん
– I love Java!
2
コンテンツ
 本日話すこと
– 3/14 にOSS化した SensorBee の紹介
– BQLの簡単な説明
– UDFなどの拡張について
– 実例と、簡単なデモ
 本日話さないこと
– Go言語による実装の詳細
– 機械学習について。Deep Learningについて。
– 機械学習を含めた SensorBee の説明については、昨日行われた「第15回
elasticsearch勉強会」の資料をご参照ください
Elasticsearchと機械学習を実際に連携させる
http://www.slideshare.net/nobu_k/elasticsearch-59627321
3
(特に) ネットワークのエッジ / フォグにおいて
ストリームデータに対して
機械学習 (特にDeep Learning) を利用した
非構造化データ向けのETLを
低レイテンシで適用することを目的としたツール
Lightweight Stream Processing Engine for IoT
http://sensorbee.io
4
ちょっとだけ詳しい説明
 Stateful
– 非構造化データの加工・転送を担う
– プラグインと連携することにより、特徴量抽出や機械学習が可能。
 Expressive
– CQL (Continuous Query Language) の方言である BQL という、SQLライクなスク
リプトにより操作。
– スキーマレスであり、JSONライクな構造データを扱う
 Lightweight
– 実行ファイルは大体30MBくらい。Go言語で書かれている (←ここにいる最大の理由)
– OS は特に限定していないが、普段は Linux や Mac で開発している
– Raspberry Pi でも動く (確認済)
– Windows でももちろん動くが、一部ブラグインでは要修正 (cgo周り)
5
サンプル例:監視カメラから人物認識をやりたい
6
{
"id": 123,
"age": ”35",
"gender": “female",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
{
"id": 131,
"age": ”22",
"gender": “male",
"location": {
"x": 120.5,
"y": 80.2
},
…
}
サンプル例:監視カメラからデータを取得
7
[Source]
監視カメラデータ=フレームデータを
取得
{
"id": 123,
"age": ”35",
"gender": “female",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
{
"id": 131,
"age": ”22",
"gender": “male",
"location": {
"x": 120.5,
"y": 80.2
},
…
}
サンプル例:画像データから人物を切り取り
8
[Stream+UDF]
人物の抽出
{
"id": 123,
"age": ”35",
"gender": “female",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
{
"id": 131,
"age": ”22",
"gender": “male",
"location": {
"x": 120.5,
"y": 80.2
},
…
}
サンプル例:切り取った人物画像を解析
9
[Stream+UDF]
人物データの解析
{
"id": 123,
"age": ”35",
"gender": “female",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
{
"id": 131,
"age": ”22",
"gender": “male",
"location": {
"x": 120.5,
"y": 80.2
},
…
}
サンプル例:解析データを出力
10
{
"id": 123,
"age": ”35",
"gender": “female",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
{
"id": 131,
"age": ”22",
"gender": “male",
"location": {
"x": 120.5,
"y": 80.2
},
…
}
[Sink]
解析データの保存
Source
 (非構造化)データのStreaming
– カメラの画像データ
– (web)ログ
– fluentd
– MQTT subscribe etc...
– センサーデータ
– 温度データ
– 振動データ etc...
– 各種TYPEは独自に拡張可能
– “opencv_capture_from_uri”
はopencvプラグインにある
11
BQL例
CREATE SOURCE camera0
TYPE opencv_capture_from_uri
WITH
uri=“http://webcamera...”,
frame_skip=0,
next_frame_error=false;
Stream
 データの操作
– 結合 (Join)
– 集約 (Aggregation)
– 抽出 (Filtering) etc...
 ストリームされるデータはJSONのよ
うにアクセス可能
– camera0:* の部分
 右記例では、”detect_human” や
”recognize” という人物認識のUDF
を作成したという設定
12
BQL例
CREATE STREAM regions0
AS SELECT RSTREAM
detect_human(camera0:*) AS
detected
FROM camera0 [RANGE 1 TUPLES];
CREATE STREAM recognized
AS SELECT RSTREAM
recognize(’params',
regions0:detected)
AS recognized
FROM regions0 [RANGE 1
TUPLES];
Sink
 データをDBやクラウドソースに出力
– fluentd
– MQTT publish
– DBへ直接INSERT etc...
– Souceと同じく各種TYPEは独自に拡
張可能
 右記例では、解析した結果を fluentd
を使用して出力、という設定
– fluentd source/sink は fluentdプラ
グインにある
13
BQL例
CREATE SINK analyzed
TYPE fluentd;
CREATE STREAM tagged_result
AS SELECT RSTREAM
“analyzed” AS tag,
recognized:* AS data
FROM recognized [RANGE 1
TUPLES];
INSERT INTO analyzed
FROM tagged_result;
デモ: 顔認識
 OpenCV の CascadeClassifier を使用した顔認識
– 今回は ultraist様のLBPモデルを使用
http://ultraist.hatenablog.com/entry/20110718/1310965532
14
ここで顔認識を行う
→x,y,w,h を出力するUDF
デモ: 顔認識→からの笑い男
 ハッカーの憧れ
15
x,y,w,h を元に画像を貼るUDF
デモ: 顔認識→からの笑い男→もう一度動画へ
 OpenCV の VideoWriter を使用して動画にまとめる
16
動画ファイル
を作るSink
デモ: ラブライブOP (第1期) と笑い男
17
デモ: BQL全体像 (ご参考までに)
18
CREATE PAUSED SOURCE camera TYPE
opencv_capture_from_uri WITH
uri="videos/lovelive1_op.mp4",
frame_skip=0, next_frame_error=false;
CREATE STATE face_detector TYPE
pencv_cascade_classifier WITH
file="data/lbpcascade_animeface.xml”;
CREATE STREAM detected AS SELECT
RSTREAM
opencv_detect_multi_scale("face_detect
or", c:*) AS rects, c:* AS raw_image
FROM camera [RANGE 1 TUPLES] AS c;
-- draw warai-otoko
CREATE STATE warai TYPE
opencv_shared_image WITH
file="data/warai_flat.png”;
CREATE SINK warai_avi TYPE
oencv_avi_writer WITH
file_name="result/warai", fps=30;
CREATE STREAM warai_avi_images AS
SELECT RSTREAM
opencv_mount_image("warai",
d:raw_image, d:rects) AS img FROM
detected [RANGE 1 TUPLES] AS d;
CREATE STREAM fmt_warai_avi_images AS
SELECT RSTREAM wai:img.format AS
format, wai:img.width AS width,
wai:img.height AS height,
wai:img.image AS image FROM
warai_avi_images [RANGE 1 TUPLES] AS
wai
INSERT INTO warai_avi FROM
fmt_warai_avi_images;
デモ: BQL全体像 (ご参考までに)
19
CREATE PAUSED SOURCE camera TYPE
opencv_capture_from_uri WITH
uri="videos/lovelive1_op.mp4",
frame_skip=0, next_frame_error=false;
CREATE STATE face_detector TYPE
pencv_cascade_classifier WITH
file="data/lbpcascade_animeface.xml”;
CREATE STREAM detected AS SELECT
RSTREAM
opencv_detect_multi_scale("face_detect
or", c:*) AS rects, c:* AS raw_image
FROM camera [RANGE 1 TUPLES] AS c;
-- draw warai-otoko
CREATE STATE warai TYPE
opencv_shared_image WITH
file="data/warai_flat.png”;
CREATE SINK warai_avi TYPE
oencv_avi_writer WITH
file_name="result/warai", fps=30;
CREATE STREAM warai_avi_images AS
SELECT RSTREAM
opencv_mount_image("warai",
d:raw_image, d:rects) AS img FROM
detected [RANGE 1 TUPLES] AS d;
CREATE STREAM fmt_warai_avi_images AS
SELECT RSTREAM wai:img.format AS
format, wai:img.width AS width,
wai:img.height AS height,
wai:img.image AS image FROM
warai_avi_images [RANGE 1 TUPLES] AS
wai
INSERT INTO warai_avi FROM
fmt_warai_avi_images;
すみません、このSinkはまだ公
開してません m(__)m
他の部分は公開済
→opencvプラグインを使った
tutorialは作る予定 (issue #27)
Autonomous robot car control demonstration in CES2016
 https://www.youtube.com/watch?v=7A9UwxvgcV0
– こちらはちゃんとした実用例、バックエンドにSensorBeeを使用
20
ぜひ使ってみてください!
 http://sensorbee.io
 http://docs.sensorbee.io/en/latest/
 https://github.com/sensorbee/sensorbee
 今回のデモ動画: https://github.com/disktnk/sb_facedetect_demo 参照
21

SensorBeeのご紹介

  • 1.
  • 2.
    自己紹介  田中大輔 (@disktnk) –某ピー社アニオタ枠採用 – 元金融工学ライブラリ屋さん – I love Java! 2
  • 3.
    コンテンツ  本日話すこと – 3/14にOSS化した SensorBee の紹介 – BQLの簡単な説明 – UDFなどの拡張について – 実例と、簡単なデモ  本日話さないこと – Go言語による実装の詳細 – 機械学習について。Deep Learningについて。 – 機械学習を含めた SensorBee の説明については、昨日行われた「第15回 elasticsearch勉強会」の資料をご参照ください Elasticsearchと機械学習を実際に連携させる http://www.slideshare.net/nobu_k/elasticsearch-59627321 3
  • 4.
    (特に) ネットワークのエッジ /フォグにおいて ストリームデータに対して 機械学習 (特にDeep Learning) を利用した 非構造化データ向けのETLを 低レイテンシで適用することを目的としたツール Lightweight Stream Processing Engine for IoT http://sensorbee.io 4
  • 5.
    ちょっとだけ詳しい説明  Stateful – 非構造化データの加工・転送を担う –プラグインと連携することにより、特徴量抽出や機械学習が可能。  Expressive – CQL (Continuous Query Language) の方言である BQL という、SQLライクなスク リプトにより操作。 – スキーマレスであり、JSONライクな構造データを扱う  Lightweight – 実行ファイルは大体30MBくらい。Go言語で書かれている (←ここにいる最大の理由) – OS は特に限定していないが、普段は Linux や Mac で開発している – Raspberry Pi でも動く (確認済) – Windows でももちろん動くが、一部ブラグインでは要修正 (cgo周り) 5
  • 6.
    サンプル例:監視カメラから人物認識をやりたい 6 { "id": 123, "age": ”35", "gender":“female", "location": { "x": 252.1, "y": 179.3 }, … } { "id": 131, "age": ”22", "gender": “male", "location": { "x": 120.5, "y": 80.2 }, … }
  • 7.
    サンプル例:監視カメラからデータを取得 7 [Source] 監視カメラデータ=フレームデータを 取得 { "id": 123, "age": ”35", "gender":“female", "location": { "x": 252.1, "y": 179.3 }, … } { "id": 131, "age": ”22", "gender": “male", "location": { "x": 120.5, "y": 80.2 }, … }
  • 8.
    サンプル例:画像データから人物を切り取り 8 [Stream+UDF] 人物の抽出 { "id": 123, "age": ”35", "gender":“female", "location": { "x": 252.1, "y": 179.3 }, … } { "id": 131, "age": ”22", "gender": “male", "location": { "x": 120.5, "y": 80.2 }, … }
  • 9.
    サンプル例:切り取った人物画像を解析 9 [Stream+UDF] 人物データの解析 { "id": 123, "age": ”35", "gender":“female", "location": { "x": 252.1, "y": 179.3 }, … } { "id": 131, "age": ”22", "gender": “male", "location": { "x": 120.5, "y": 80.2 }, … }
  • 10.
    サンプル例:解析データを出力 10 { "id": 123, "age": ”35", "gender":“female", "location": { "x": 252.1, "y": 179.3 }, … } { "id": 131, "age": ”22", "gender": “male", "location": { "x": 120.5, "y": 80.2 }, … } [Sink] 解析データの保存
  • 11.
    Source  (非構造化)データのStreaming – カメラの画像データ –(web)ログ – fluentd – MQTT subscribe etc... – センサーデータ – 温度データ – 振動データ etc... – 各種TYPEは独自に拡張可能 – “opencv_capture_from_uri” はopencvプラグインにある 11 BQL例 CREATE SOURCE camera0 TYPE opencv_capture_from_uri WITH uri=“http://webcamera...”, frame_skip=0, next_frame_error=false;
  • 12.
    Stream  データの操作 – 結合(Join) – 集約 (Aggregation) – 抽出 (Filtering) etc...  ストリームされるデータはJSONのよ うにアクセス可能 – camera0:* の部分  右記例では、”detect_human” や ”recognize” という人物認識のUDF を作成したという設定 12 BQL例 CREATE STREAM regions0 AS SELECT RSTREAM detect_human(camera0:*) AS detected FROM camera0 [RANGE 1 TUPLES]; CREATE STREAM recognized AS SELECT RSTREAM recognize(’params', regions0:detected) AS recognized FROM regions0 [RANGE 1 TUPLES];
  • 13.
    Sink  データをDBやクラウドソースに出力 – fluentd –MQTT publish – DBへ直接INSERT etc... – Souceと同じく各種TYPEは独自に拡 張可能  右記例では、解析した結果を fluentd を使用して出力、という設定 – fluentd source/sink は fluentdプラ グインにある 13 BQL例 CREATE SINK analyzed TYPE fluentd; CREATE STREAM tagged_result AS SELECT RSTREAM “analyzed” AS tag, recognized:* AS data FROM recognized [RANGE 1 TUPLES]; INSERT INTO analyzed FROM tagged_result;
  • 14.
    デモ: 顔認識  OpenCVの CascadeClassifier を使用した顔認識 – 今回は ultraist様のLBPモデルを使用 http://ultraist.hatenablog.com/entry/20110718/1310965532 14 ここで顔認識を行う →x,y,w,h を出力するUDF
  • 15.
  • 16.
    デモ: 顔認識→からの笑い男→もう一度動画へ  OpenCVの VideoWriter を使用して動画にまとめる 16 動画ファイル を作るSink
  • 17.
  • 18.
    デモ: BQL全体像 (ご参考までに) 18 CREATEPAUSED SOURCE camera TYPE opencv_capture_from_uri WITH uri="videos/lovelive1_op.mp4", frame_skip=0, next_frame_error=false; CREATE STATE face_detector TYPE pencv_cascade_classifier WITH file="data/lbpcascade_animeface.xml”; CREATE STREAM detected AS SELECT RSTREAM opencv_detect_multi_scale("face_detect or", c:*) AS rects, c:* AS raw_image FROM camera [RANGE 1 TUPLES] AS c; -- draw warai-otoko CREATE STATE warai TYPE opencv_shared_image WITH file="data/warai_flat.png”; CREATE SINK warai_avi TYPE oencv_avi_writer WITH file_name="result/warai", fps=30; CREATE STREAM warai_avi_images AS SELECT RSTREAM opencv_mount_image("warai", d:raw_image, d:rects) AS img FROM detected [RANGE 1 TUPLES] AS d; CREATE STREAM fmt_warai_avi_images AS SELECT RSTREAM wai:img.format AS format, wai:img.width AS width, wai:img.height AS height, wai:img.image AS image FROM warai_avi_images [RANGE 1 TUPLES] AS wai INSERT INTO warai_avi FROM fmt_warai_avi_images;
  • 19.
    デモ: BQL全体像 (ご参考までに) 19 CREATEPAUSED SOURCE camera TYPE opencv_capture_from_uri WITH uri="videos/lovelive1_op.mp4", frame_skip=0, next_frame_error=false; CREATE STATE face_detector TYPE pencv_cascade_classifier WITH file="data/lbpcascade_animeface.xml”; CREATE STREAM detected AS SELECT RSTREAM opencv_detect_multi_scale("face_detect or", c:*) AS rects, c:* AS raw_image FROM camera [RANGE 1 TUPLES] AS c; -- draw warai-otoko CREATE STATE warai TYPE opencv_shared_image WITH file="data/warai_flat.png”; CREATE SINK warai_avi TYPE oencv_avi_writer WITH file_name="result/warai", fps=30; CREATE STREAM warai_avi_images AS SELECT RSTREAM opencv_mount_image("warai", d:raw_image, d:rects) AS img FROM detected [RANGE 1 TUPLES] AS d; CREATE STREAM fmt_warai_avi_images AS SELECT RSTREAM wai:img.format AS format, wai:img.width AS width, wai:img.height AS height, wai:img.image AS image FROM warai_avi_images [RANGE 1 TUPLES] AS wai INSERT INTO warai_avi FROM fmt_warai_avi_images; すみません、このSinkはまだ公 開してません m(__)m 他の部分は公開済 →opencvプラグインを使った tutorialは作る予定 (issue #27)
  • 20.
    Autonomous robot carcontrol demonstration in CES2016  https://www.youtube.com/watch?v=7A9UwxvgcV0 – こちらはちゃんとした実用例、バックエンドにSensorBeeを使用 20
  • 21.
    ぜひ使ってみてください!  http://sensorbee.io  http://docs.sensorbee.io/en/latest/ https://github.com/sensorbee/sensorbee  今回のデモ動画: https://github.com/disktnk/sb_facedetect_demo 参照 21