jubatus casual talks #2: 大量映像・画像のための異常値検知とクラス分類

25
大大大大 大大大大大大 大大大大大大大大大大大 大大 大大 Jubatus Casual Talks #2

Upload: hirotaka-ogawa

Post on 04-Dec-2014

9.522 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

大量映像・画像のための異常値検知とクラス分類小川 宏高

Jubatus Casual Talks #2

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

自己紹介• 小川 宏高• Twitter ID: @ogawa• 所属 : 産総研 / AIST

• 専門• 大規模データ処理• 並列分散処理• クラウド技術、グリッド技術• Java の Just-in-time コンパイラ

• 最近オープンデータとか言わされて結構困っているらしい

 画像はイメージです。

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

大量映像・画像のための異常値検知とクラス分類小川 宏高

Jubatus Casual Talks #2

雑多な話題

諸般の事情により

となってしまうことをお許しください

custom_types 拡張+ メディアデータ処理への利用+ 性能+ 性能改善手法+ 今後の取り組み、まとめ

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

Jubatus+AIST: custom_types 拡張• センサや応用のバラエティをサポートするためのインタフェース拡張• fv_converter に対する魔改造• RAW データの支援

• データに対する「前処理」を含めて Jubatus のモジュールとして実行• 他言語向け外部インタフェースの支援

• センサデータに対する前処理、特徴抽出を外部サーバにオフロード• 応用エンジニアは、外部サーバ用の前処理モジュールを Python, Ruby, Java 等で

記述可能

構造データ RAW データ RAW データ

特徴抽出

前処理

特徴抽出特徴抽出

RPC

前処理 RPC

多値分類・線形回帰・異常値検知等

外部 RPC サーバ

Java コンテナ Python コンテナ Ruby コンテナ

前処理 M

特徴抽出 M

前処理 M

特徴抽出 M

前処理 M

特徴抽出 M

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

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"

}

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

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)

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

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"

}

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

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)

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

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"

}

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

この仕組みをどう使う?

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

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) 空間における相関パタンの出現頻度を特徴として使用

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

HLAC / CHLAC• HLAC 特徴

• 画像平面の 2 次元の局所領域における相関パターン (3×3 の局所マスク ) の出現を数え上げることで特徴を算出

• 画像全体から相関を取る⇒位置の影響を受けない

• CHLAC 特徴• HLAC を時間を含めた 3 次元に拡張• 3×3×3 の立方局所マスクの出現を

数え上げることで特徴を算出• 二値動画像の場合、独立な局所マス

クの個数は 251 通りとなるため、CHLAC 特徴は 251 次元のベクタ値として算出

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

メディアデータでの異常値検知• Jubatus を利用して、複数クライアントでキャプチャし

た動画像データ、音響データを同時並行で、リアルタイムに異常値検知

• 複数の特徴抽出手法、検知アルゴリズムによる比較が可能

1/4×1/4 に縮小グレースケール化

フレーム間差分・二値化

CHLAC前処理

ウインドウ処理FFT

FLAC前処理

Jubaanomaly

Jubatus で処理

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

そろそろ性能の話かもな

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

レスポンス時間• add ( 学習 + 検知 )

• 1 フレーム学習するのに要する時間• calc_score ( 検知 )

• 1,000 フレーム学習した状態で、 1 フレームの検知に要する時間

• 前処理・特徴抽出• クライアント側で実施• サーバ側( custom_types )

で実施• calc_score

– レスポンス時間 8 〜 10msec– 100 〜 125FPS で動画像の前処理、

特徴抽出、外れ値検知のリアルタイム処理を行うだけの処理能力がある

• add– 学習したデータ数にほぼ比例した処

理時間– 検知は高速であることから学習自体

に時間を要することが分かる• custom_types のオーバーヘッド

– 平均 1 〜 2msec

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

レスポンス時間に関する考察• 対策 : ハッシュの量子化幅を小さくする

• LSH において擬似近傍とみなされる点の個数が減少• 計算精度は犠牲になる

• 量子化幅を 10程度にすれば、処理時間を 30%弱削減できる• スループットを十分改善させるには不十分

量子化幅 総時間 ( 秒 )

1 211

10 363

50 506

100 ( デフォルト ) 502

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

レスポンス時間に関する考察 (続き )• 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 フレー

ムが同一のハッシュ値

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

さまざまな性能向上のための試み• 近傍探索ストレージの性能向上

• 重み付けによる点の集約を実現する近傍探索ストレージ• 同一点をマージ• 近傍点をマージ

• 密ベクトル向け近傍探索ストレージ• HLAC ファミリーは固定次元の特徴ベクトルを生成

• LOF の代替アルゴリズムによる性能向上• 対象点の疑似近傍点の個数だけで判定→定数時間で済む• もっとましな方法も思いつくが論文にしてから公表

• かんたんデータ忘却• 登録点数のキャッピングによる最適化

分散モデルの実装が面倒くさかった

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

点の集約

origi

nal

mer

ging_

sam

e_po

ints

mer

ging_

sam

e_po

ints-

resiz

e

mer

ging_

sam

e_po

ints-

roun

d

mer

ging_

sam

e_po

ints(

5e-5

)

mer

ging_

sam

e_po

ints-

resiz

e(5e

-5)

mer

ging_

sam

e_po

ints-

roun

d(5e

-5)

mer

ging_

near

_poin

ts(1

0e-5

)

mer

ging_

near

_poin

ts(1

0e-4

)

mer

ging_

near

_poin

ts(1

0e-3

)

mer

ging_

near

_poin

ts(1

0e-5

, 5e-

5)

mer

ging_

near

_poin

ts(1

0e-4

, 5e-

5)

mer

ging_

near

_poin

ts(1

0e-3

, 5e-

5)0

200

400

600

800

1000

1200

1400

1600

time

time

ただし、精度が犠牲になる場合があるサンプルによって性能がむしろ低下する場合もある

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

点の集約+密ベクトルストア

origi

nal

mer

ging_

sam

e_po

ints

mer

ging_

sam

e_po

ints_

resiz

e

mer

ging_

sam

e_po

ints_

roun

d

mer

ging_

near

_poin

ts(1

0e-5

)

mer

ging_

near

_poin

ts(1

0e-4

)

mer

ging_

near

_poin

ts(1

0e-3

)0

200

400

600

800

1000

1200

1400

1600

LSH

DV

ただし、精度が犠牲になる場合がある

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

かんたん忘却機能• 近傍ストレージに忘却機能を追加しなくても、 addじゃ

なくて update 使えばよくね ?• 固定数 ID を払い出して update で上書きすれば、素朴な忘却機能

として使えるLSH DV

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

そろそろ終わりかもな

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

今取り組んでいること• LANDSAT-8直接受信・即時公開サービスhttp://landsat8.geogrid.org/

•衛星画像の変化検知• 経時変化の検出を領域分割に

より並列化• 地物の変化か撮影条件による

差異かを区別したい• 変化の意味付け

• 教師データを与えれば変化を(変化の原因を表す)クラスに分類可能か ?

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

まとめ• 産総研は、 Jubatus を使ったメディアデータのデータ解析とその最適化手法について研究しています

• ここで示した成果は 0.4 ベースですが、コードは 0.5 にポートしつつあります

• 成果の一部は論文と OSS で公開されます

• 謝辞• 本発表の一部は、独立行政法人新エネルギー・産業技術総合開発機構( NEDO )

の委託業務「 IT融合による新社会システムの開発・実証プロジェクト」の成果を活用している

• ねこフォント (http://nekofont.upat.jp/) の成果を活用している