jubatus casual talks #2: 大量映像・画像のための異常値検知とクラス分類
DESCRIPTION
Jubatus Casual Talks #2 (2013/12/14) の講演資料。TRANSCRIPT
大量映像・画像のための異常値検知とクラス分類小川 宏高
Jubatus Casual Talks #2
自己紹介• 小川 宏高• Twitter ID: @ogawa• 所属 : 産総研 / AIST
• 専門• 大規模データ処理• 並列分散処理• クラウド技術、グリッド技術• Java の Just-in-time コンパイラ
• 最近オープンデータとか言わされて結構困っているらしい
画像はイメージです。
大量映像・画像のための異常値検知とクラス分類小川 宏高
Jubatus Casual Talks #2
雑多な話題
諸般の事情により
となってしまうことをお許しください
custom_types 拡張+ メディアデータ処理への利用+ 性能+ 性能改善手法+ 今後の取り組み、まとめ
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
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"
}
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)
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"
}
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)
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"
}
この仕組みをどう使う?
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) 空間における相関パタンの出現頻度を特徴として使用
HLAC / CHLAC• HLAC 特徴
• 画像平面の 2 次元の局所領域における相関パターン (3×3 の局所マスク ) の出現を数え上げることで特徴を算出
• 画像全体から相関を取る⇒位置の影響を受けない
• CHLAC 特徴• HLAC を時間を含めた 3 次元に拡張• 3×3×3 の立方局所マスクの出現を
数え上げることで特徴を算出• 二値動画像の場合、独立な局所マス
クの個数は 251 通りとなるため、CHLAC 特徴は 251 次元のベクタ値として算出
メディアデータでの異常値検知• Jubatus を利用して、複数クライアントでキャプチャし
た動画像データ、音響データを同時並行で、リアルタイムに異常値検知
• 複数の特徴抽出手法、検知アルゴリズムによる比較が可能
1/4×1/4 に縮小グレースケール化
フレーム間差分・二値化
CHLAC前処理
ウインドウ処理FFT
FLAC前処理
Jubaanomaly
Jubatus で処理
そろそろ性能の話かもな
レスポンス時間• add ( 学習 + 検知 )
• 1 フレーム学習するのに要する時間• calc_score ( 検知 )
• 1,000 フレーム学習した状態で、 1 フレームの検知に要する時間
• 前処理・特徴抽出• クライアント側で実施• サーバ側( custom_types )
で実施• calc_score
– レスポンス時間 8 〜 10msec– 100 〜 125FPS で動画像の前処理、
特徴抽出、外れ値検知のリアルタイム処理を行うだけの処理能力がある
• add– 学習したデータ数にほぼ比例した処
理時間– 検知は高速であることから学習自体
に時間を要することが分かる• custom_types のオーバーヘッド
– 平均 1 〜 2msec
レスポンス時間に関する考察• 対策 : ハッシュの量子化幅を小さくする
• LSH において擬似近傍とみなされる点の個数が減少• 計算精度は犠牲になる
• 量子化幅を 10程度にすれば、処理時間を 30%弱削減できる• スループットを十分改善させるには不十分
量子化幅 総時間 ( 秒 )
1 211
10 363
50 506
100 ( デフォルト ) 502
レスポンス時間に関する考察 (続き )• 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 フレー
ムが同一のハッシュ値
さまざまな性能向上のための試み• 近傍探索ストレージの性能向上
• 重み付けによる点の集約を実現する近傍探索ストレージ• 同一点をマージ• 近傍点をマージ
• 密ベクトル向け近傍探索ストレージ• HLAC ファミリーは固定次元の特徴ベクトルを生成
• LOF の代替アルゴリズムによる性能向上• 対象点の疑似近傍点の個数だけで判定→定数時間で済む• もっとましな方法も思いつくが論文にしてから公表
• かんたんデータ忘却• 登録点数のキャッピングによる最適化
分散モデルの実装が面倒くさかった
点の集約
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
ただし、精度が犠牲になる場合があるサンプルによって性能がむしろ低下する場合もある
点の集約+密ベクトルストア
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
ただし、精度が犠牲になる場合がある
かんたん忘却機能• 近傍ストレージに忘却機能を追加しなくても、 addじゃ
なくて update 使えばよくね ?• 固定数 ID を払い出して update で上書きすれば、素朴な忘却機能
として使えるLSH DV
そろそろ終わりかもな
今取り組んでいること• LANDSAT-8直接受信・即時公開サービスhttp://landsat8.geogrid.org/
•衛星画像の変化検知• 経時変化の検出を領域分割に
より並列化• 地物の変化か撮影条件による
差異かを区別したい• 変化の意味付け
• 教師データを与えれば変化を(変化の原因を表す)クラスに分類可能か ?
まとめ• 産総研は、 Jubatus を使ったメディアデータのデータ解析とその最適化手法について研究しています
• ここで示した成果は 0.4 ベースですが、コードは 0.5 にポートしつつあります
• 成果の一部は論文と OSS で公開されます
• 謝辞• 本発表の一部は、独立行政法人新エネルギー・産業技術総合開発機構( NEDO )
の委託業務「 IT融合による新社会システムの開発・実証プロジェクト」の成果を活用している
• ねこフォント (http://nekofont.upat.jp/) の成果を活用している