2016年3月1日火曜日

FON2303D で motion の設定

先日 FON2303D の活用としてウェブカメラと動体検知ソフトウェアの motion をインストールして監視カメラとしました。その後テスト動作を行ってみましたが、意外と上手く動体検知をすることができないことに気づきました。以下は我が家でテスト動作を行った際に判明したいくつかのポイントをまとめてみました。
FON2303D とウェブカメラで無線 LAN 監視カメラへ
http://near-unix.blogspot.jp/2016/02/fon2303d-lan.html

FON2303D での画像の大きさ

ハードウェアの制約でウェブカメラの画像の大きさは 320x240 のサイズで精一杯のようです。640x480 だと motion としても動作が出来なくなってしまいます。320x240 のサイズの場合で、すでにプロセッサの稼働率が常時 30% 〜 50% 程度になっています。更にメモリの使用量は 32MB のほぼいっぱいに使用しています。320x240 の四倍の大きさとなる 640x480 での動作は難しいようです。

motion の動体検出パラメータ

motion の設定パラメータの解説はやはり公式サイトの英文を読むのが一番のようです。動体検知精度の向上のために何度も触ったパラメータの部分をメモしておきます。

動体検知の設定項目は以下のバナーから始まります。
#######################
# Motion Detection Settings:
#######################

threshold(動体検知しきい値)

どれほどの画素(ピクセル)で変化が発生すると動体を検知するのかの判定値です。初期値では「1500 画素」となっています。320x240 程度の小さな画像の場合には、もっと小さくした方が検出精度が上がるようです。我が家では 500 画素前後でよい結果が得られました。

threshold_tune(しきい値調整)

自動的にスレッショルド値の調整を行う機能だそうです。我が家では上手く機能しませんでした。初期値は「無効」です。

noise_level(ノイズレベル)

各画素の信号の大きさがどれだけ変動すると「変化した」として検知と判断する値です。現在値よりもこのノイズレベル分より上下に変化すると検知するようになっています。ノイズレベル分より小さい場合には雑音として無視されます。標準値は「 32 」です。

noise_tune(ノイズレベル調整)

各画素の変動幅を自動的に検知してノイズレベルを調整する機能です。この機能が有効な場合、上記の noise_level(ノイズレベル)は「無効」となります。初期値は「有効」です。我が家での動作状況は微妙という感じです。変化の無い部分も動体検知をしてしまう事例が多く発生しています。

誤検出の例(四角の枠が動体検知したエリア)
何もない路面の一部を検出しています。
何も無いところで誤検出されると心霊現象のようで気持ち悪いです(笑)

despeckle_filter(スペックル除去フィルタ)

"speckle" とは斑点という意味で、点々と発生する検知情報をフィルタ処理するものです。 詳しくは、以下の motion に組み込まれているスペックル除去フィルタを解説しているウェブサイトをご覧ください。
Despeckle Patch for Motion
http://emit.demon.co.uk/motion/

上記のウェブサイトの解説によりますと、斑点状の検出情報を除去する仕組みは、3x3  のマス目状のフィルタで検出情報がマッピングされた画像をスキャンします。3x3 のマス目状のフィルタは以下のように二種類用意されています。

一つ目はボックスフィルタと呼ばれるもので、3x3 の全てのマス目に検出情報がある場合のみ、マス目の中央部の位置へ一個の検出情報としてまとめてしまうものです。
ボックス型フィルタ
http://emit.demon.co.uk/motion/より引用

もうひとつはクロス型フィルタと呼ばれるもので、 3x3 のマス目の四隅が欠けた十文字のフィルタです。この十文字の形状に検出情報がある場合のみ中央部のマス目の位置へ一個の検出情報としてまとめてしまいます。
クロス型フィルタ
http://emit.demon.co.uk/motion/より引用

この二種類のフィルタによってポツンと一個だけ独立して発生している検出は斑点情報として無効化されてしまいます。フィルタ処理によってグループ化された検出情報の集まりができることとなります。

左側が元の検出情報をマッピングしたものです。右上に斑点状の検出情報が存在しています。
それをクロス型フィルタで処理すると右側のように小さくまとめられてしまいます。そして斑点は削除されました。
http://emit.demon.co.uk/motion/より引用

このまとめる処理のことを英文では "erode" (浸食)と表現しています。さらに二種類のフィルタの記号として、大文字の "E" はボックス型フィルタを意味して、小文字の "e" はクロス型フィルタを意味します。

さらにこのままだと検出情報は本来あった検出情報のマッピングされたものより一回り小さいものとなってしまいます。そこで逆に「まとめられた検出情報」から元の大きさに拡大する処理も用意されています。単純に上記の二種類のフィルタの逆の動作をするもので、検出情報がマッピングされた場所からそれぞれ上下左右へ拡張させるものです。

この拡大させる処理のことを英文では "dilate" (拡張、膨張)と表現しています。この拡張するフィルタの記号として、大文字の "D" はボックス型フィルタによる拡張を意味して、小文字の "d" はクロス型フィルタによる拡張を意味しています。

フィルタの使用法としては、二種類のフィルタを "E - e - d - D" の順番で処理することを標準にしています。

このフィルタを一つだけ使用するとより斑点情報が残りやすくなるため動体検知する可能性が高まります。例えば "E - D" とか "e - d" というようにです。必要な動体検知が出来ない場合には、一種類のフィルタだけを試してみるのも一考かもしれません。

フィルタとしての表記方法は単純に処理したいフィルタの記号を順番に記述して、最後にラベルと呼ばれる小文字のエル "l" を追加するだけです。
despeckle_filter EedDl (標準)
despeckle_filter EDl (ボックス型フィルタのみ)
despeckle_filter edl (クロス型フィルタのみ)

なお我が家では、拡張処理を行わず、まとめられた検出情報をそのまま使用するようにしています。小さい画像サイズの場合には、拡張処理は誤検出の原因となるように感じています。
despeckle_filter Eel (我が家の場合)

雪が降る状況などにも有効のようです。

mask_file(検出マスクファイル)

誤検出となる画像領域をマスキングして、動体検知の精度を向上させるものです。PGM  形式のファイルへマスキング情報を描いておきます。有効領域を白色、無効領域を黒色で指定するだけです。
我が家ではテスト動作で実際に動体検知された画像を元にして、検出したい領域を設定しました。作業は、画像ソフトウェアの gimp 上で行いました。

検出マスクを作る過程です。
揺れる木の葉の他、何故か誤検出する電柱などをマスクしました。
実際に作成して検出マスクです。

smart_mask_speed(学習型検出マスク)

上記の mask_file では手動で検出領域を設定しました。この smart_mask_speed では、学習型の検出マスクを自動生成する機能だそうです。風に揺れる木の葉や海の波など常に誤検出のもととなる検出情報から検出マスクを生成するのだそうです。この風に揺れる木の葉などで発生する周期によって "1""10" の値を設定すると動作を開始するそうです。なお "0" の場合は無効となります。残念ながら我が家では上手く動作しませんでした。


motion のメモは以上です。 参考になればと思っています。


0 件のコメント:

コメントを投稿