Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類

11,818 views

Published on

Jubatus Casual Talks #2 (2013/12/14) の講演資料。

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,818
On SlideShare
0
From Embeds
0
Number of Embeds
9,370
Actions
Shares
0
Downloads
17
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Jubatus Casual Talks #2: 大量映像・画像のための異常値検知とクラス分類

  1. 1. 大量映像・画像のための 異常値検知とクラス分類 小川 宏高 Jubatus Casual Talks #2
  2. 2. 自己紹介 • 小川 宏高 • Twitter ID: @ogawa • 所属: 産総研 / AIST • 専門 • 大規模データ処理 • 並列分散処理 • クラウド技術、グリッド技術 • JavaのJust-in-timeコンパイラ • 最近オープンデータとか言わされて 結構困っているらしい 画像はイメージです。
  3. 3. 諸般の事情により 大量映像・画像のための 雑多な話題 異常値検知とクラス分類 小川 宏高 Jubatus Casual Talks #2 となってしまうことをお許しくださ custom_types拡張 +メディアデータ処理への利用 +性能 +性能改善手法 +今後の取り組み、まとめ
  4. 4. Jubatus+AIST: custom_types拡張 • センサや応用のバラエティをサポートするためのインタフェース拡 張 • fv_converterに対する魔改造 • RAWデータの支援 • データに対する「前処理」を含めてJubatusのモジュールとして実行 • 他言語向け外部インタフェースの支援 • センサデータに対する前処理、特徴抽出を外部サーバにオフロード • 応用エンジニアは、外部サーバ用の前処理モジュールをPython, Ruby, Java等で記述可能 多値分類・線形回帰・異常値検知等 特徴抽出M 特徴抽出M 特徴抽出M 特徴抽出 特徴抽出RPC 前処理M 前処理M 前処理M 前処理 特徴抽出 前処理RPC Javaコンテナ Pythonコンテナ Rubyコンテナ 外部RPCサーバ 構造データ RAWデータ RAWデータ
  5. 5. custom_typesで動的ライブラリを呼 ぶ { "converter" : { "string_filter_types" : {}, "string_filter_rules" : [], "num_filter_types" : { }, "num_filter_rules" : [], "custom_filter_types" : { "custom": { "method": "dynamic", "path": "/Users/foo/libcustom_filter.dylib", "function": "create", "alpha": "0.01", "beta": "0.03", "gamma": "0.05" } }, "custom_filter_rules" : [ { "key" : "*", "type" : "custom", "suffix": "-dummy" } ], "string_rules" : [ { "key" : "*", "type" : "str", "sample_weight" : "bin", "global_weight" : "bin" } ], "num_types" : {}, "num_rules" : [ { "key" : "a*", "type" : "num" } ], "custom_types" : {}, "custom_rules" : [ ] }, "parameter" : { "nearest_neighbor_num" : 10, "reverse_nearest_neighbor_num" : 30, "method" : "euclid_lsh", "parameter" : { "lsh_num" : 64, "table_num" : 4, "seed" : 1091, "probe_num" : 64, "bin_width" : 100, "retain_projection" : false } }, "method" : "lof" }
  6. 6. custom_typesをPythonで変換 import msgpackrpc class WordCountServer(object): def convert(self, key, value): key = key.decode() words = value.decode().split() count = defaultdict(float) for word in words: count["%s$%s" % (key, word)] += 1.0 return list(count.items()) if __name__ == '__main__': (snipped)
  7. 7. custom_typesで外部モジュールを呼ぶ { "converter" : { "string_filter_types": {}, "string_filter_rules":[], "num_filter_types": {}, "num_filter_rules": [], "custom_filter_types" : {}, "custom_filter_rules" : [], "string_types": {}, "string_rules":[], "num_types": {}, "num_rules": [ {"key" : "*", "type" : "num"} ], "custom_types" : { "word_count": { "method": "external", "hostname": "localhost", "port": "18800", "timeout": "30.0" } }, "custom_rules" : [ { "key" : "*", "type" : "word_count" } ] }, "parameter" : { "hash_num" : 64, "table_num" : 4, "seed" : 1091, "probe_num" : 64, "bin_width" : 100, "retain_projection" : false }, "method": "euclid_lsh" }
  8. 8. string_typesをPythonで変換 import msgpackrpc import re word = re.compile('S+') class WordSplitterServer(object): # TODO: string encoding? def split(self, value): s=0 value = value.decode() result = [] while s < len(value): m = word.search(value, s) if m is None: break result.append( (m.start(), m.end() - m.start()) ) s = m.end() return result if __name__ == '__main__': (snipped)
  9. 9. string_typesで外部モジュールを呼ぶ { "converter" : { "string_filter_types": {}, "string_filter_rules":[], "num_filter_types": {}, "num_filter_rules": [], "custom_filter_types" : {}, "custom_filter_rules" : [], "string_types": { "splitter": { "method": "external", "hostname": "localhost", "port": "18800", "timeout": "30.0" } }, "string_rules":[ {"key" : "*", "type" : "splitter", "sample_weight":"tf", "global_weight" : "bin"} ], "num_types": {}, "num_rules": [ {"key" : "*", "type" : "num"} ], "custom_types" : {}, "custom_rules" : [ ] }, "parameter" : { "hash_num" : 64, "table_num" : 4, "seed" : 1091, "probe_num" : 64, "bin_width" : 100, "retain_projection" : false }, "method": "euclid_lsh" }
  10. 10. この仕組みをどう使う?
  11. 11. Jubatus+AIST: メディアデータの特徴抽 出 • OpenCVの提供する特徴抽出器を用いた特徴抽出 • 誰でもやってる • BoVW4J: Bag of Visual Words for Jubatus • Spatial Pyramid Method (SPM)、ScSPM • LLC: Locality-constrained Linear Coding for Image Classification (CVPR ’10) 等の手法を参考に実装 • AIST謹製手法を用いた特徴抽出 • 高次局所自己相関特徴法(HLAC) • (X, Y) 空間における相関パタンの出現頻度を特徴として使用 • 立体高次局所自己相関特徴法(CHLAC) • (X, Y, t) 空間における相関パタンの出現頻度を特徴として使用 • 音響情報に対する特徴抽出 • FLAC • (Mel-Freq, t) 空間における相関パタンの出現頻度を特徴として使用
  12. 12. HLAC/CHLAC • HLAC特徴 • 画像平面の2次元の局所領域にお ける相関パターン(3×3の局所マス ク)の出現を数え上げることで特徴 を算出 • 画像全体から相関を取る⇒位置の 影響を受けない • CHLAC特徴 • HLACを時間を含めた3次元に拡張 • 3×3×3の立方局所マスクの出現を 数え上げることで特徴を算出 • 二値動画像の場合、独立な局所マ スクの個数は251通りとなるため、 CHLAC特徴は251次元のベクタ値 として算出
  13. 13. メディアデータでの異常値検知 • Jubatusを利用して、複数クライアントでキャプチャした 動画像データ、音響データを同時並行で、リアルタイム に異常値検知 • 複数の特徴抽出手法、検知アルゴリズムによる比較が可 1/4×1/4に縮小 グレースケール化 能 フレーム間差分・二値化 前処理 CHLAC Juba anomaly ウインドウ処理 FFT 前処理 Jubatusで処理 FLAC
  14. 14. そろそろ性能の話かもな
  15. 15. レスポンス時間 • add (学習+検知) • 1フレーム学習するのに要する時間 • calc_score (検知) • 1,000フレーム学習した状態で、1 フレームの検知に要する時間 • 前処理・特徴抽出 • クライアント側で実施 • サーバ側(custom_types)で実施 • 80" calc_score – レスポンス時間8〜10msec – 100〜125FPSで動画像の前処理、 特徴抽出、外れ値検知のリアルタイ ム処理を行うだけの処理能力がある 70" 60" 50" • 40" add – 学習したデータ数にほぼ比例した処 理時間 – 検知は高速であることから学習自体 に時間を要することが分かる 30" 20" 10" • 0" 0" 100" 200" learning" 300" 400" 500" learning"(plugin)" 600" 700" detec: on" 800" 900" 1000" detec: on"(plugin)" custom_typesのオーバーヘッド – 平均1〜2msec
  16. 16. レスポンス時間に関する考察 • 対策: ハッシュの量子化幅を小さくする • LSHにおいて擬似近傍とみなされる点の個数が減少 • 計算精度は犠牲になる • 量子化幅を10程度にすれば、処理時間を30%弱削減できる • スループットを十分改善させるには不十分 量子化幅 総時間 (秒) 1 211 10 363 50 506 100 (デフォルト) 502
  17. 17. レスポンス時間に関する考察 (続き) • JubatusのLOFの実装 • nn_engine->decode_row() • すでに登録された点かどうかの判定 • nn_engine->update_row() • 対象点をLSH (Locality Sensitive Hash)に格納 • collect_neighbors(1) • LSHから対象点の擬似近傍点を取得 • collect_neighbors(2) • LSHから擬似近傍点の擬似近傍点を取得 • update_kdist_with_neighbors() • k距離の計算 • update_lrd_with_neighbors() • LRD (Local Reachability Density)の計算 • 擬似近傍点をn個取得 ⇒LSHの中で擬似近傍点の候補を対象点のハッシュ値から求め、それらを対象 点との距離でソートし、近いものからn個選択 • ハッシュ値が同じ点が非常に多い場合、時間を要する • 実際、動きの少ない動画像で試したところ、10,000フレーム分追加した時点で7,041 フレームが同一のハッシュ値
  18. 18. さまざまな性能向上のための試み • 近傍探索ストレージの性能向上 • 重み付けによる点の集約を実現する近傍探索ストレージ • 同一点をマージ • 近傍点をマージ 分散モデルの実装が面倒くさかった • 密ベクトル向け近傍探索ストレージ • HLACファミリーは固定次元の特徴ベクトルを生成 • LOFの代替アルゴリズムによる性能向上 • 対象点の疑似近傍点の個数だけで判定→定数時間で済む • もっとましな方法も思いつくが論文にしてから公表 • かんたんデータ忘却 • 登録点数のキャッピングによる最適化
  19. 19. 点の集約 time 1600 1400 1200 1000 800 600 400 200 time 0 ただし、精度が犠牲になる場合がある サンプルによって性能がむしろ低下する場合もある
  20. 20. 点の集約+密ベクトルストア 1600 1400 1200 1000 800 600 LSH 400 DV 200 0 ただし、精度が犠牲になる場合がある
  21. 21. かんたん忘却機能 • 近傍ストレージに忘却機能を追加しなくても、addじゃな くてupdate使えばよくね? • 固定数IDを払い出してupdateで上書きすれば、素朴な忘却機能と して使える LSH DV
  22. 22. そろそろ終わりかもな
  23. 23. 今取り組んでいること • LANDSAT-8直接受信・即 時公開サービス http://landsat8.geogrid.org/ • 衛星画像の変化検知 • 経時変化の検出を領域分割に より並列化 • 地物の変化か撮影条件による 差異かを区別したい • 変化の意味付け • 教師データを与えれば変化を (変化の原因を表す)クラス に分類可能か?
  24. 24. まとめ • 産総研は、Jubatusを使ったメディアデータのデータ解析 とその最適化手法について研究しています • ここで示した成果は0.4ベースですが、コードは0.5にポー トしつつあります • 成果の一部は論文とOSSで公開されます • 謝辞 • 本発表の一部は、独立行政法人新エネルギー・産業技術総合開発機構(NEDO)の 委託業務「IT融合による新社会システムの開発・実証プロジェクト」の成果を活用 している • ねこフォント (http://nekofont.upat.jp/) の成果を活用している

×