2015年12月10日木曜日

おうちハックで戦った話

この記事は おうちハック Advent Calendar の 10 日目の記事です。

前日の記事: Extreme Home Hackレポート
翌日の記事:メインブレーカーが落ちる前にドライヤーを止める

なんか面白そうなので参戦してしまいました。私は玄関ドアにネットワークカメラを設置したことがあるので、そのときの話を紹介したいと思います。


すべてのはじまり



隣人から、わたしの在宅、不在に関わらず「私の騒音がうるさい」というクレームがくるようになったのです。このクレームの一週間後、私は当時の勤務先の本社があるソルトレイクシティに出張する予定でした。このため、私が海外出張中でも物音がするのかを確認するため、急遽 Web カメラでインターホンの動体検出・録画を仕掛けました。


玄関カメラ1号


玄関のインターホンはカメラ付きで、誰かがインターホンを押せば、その瞬間に液晶画面に玄関前の映像が映ります。このため、インターホン設備の前にWebカメラを置き、MacBookに接続して、動体を検出したら自動的に録画するソフトウェアを見つけてきて仕込みました。

 
帰宅した自分自身も記録されています。

ここで使用したソフトウェアは、 YYYYMMDD_HHMMSS形式でJPEGファイルとして動体のフレームを保存します。このため、ファイルが保存されれば、いつ、誰が自宅のインターホンを押したかが記録できるわけです。

このソフトウェアの画像ファイル保存先を Dropbox に設定することで、私がアメリカ(現地時間の日中は、クレームがくる可能性がある夜間や朝)に滞在しているとき、手元の Dropbox ディレクトリ内に新しい画像ファイルが同期されてきて、リアルタイムに気づけることになります。

ついに隣人が私の家のインターホンを押しました。私は Snowbird というゲレンデで同僚とスノーボードを楽しんでいるのに、です。



これで私の無実は証明できました。しかし。しかしです。

3月3日 午前6時37分。当たり前ながら(?)私は寝ていました。そうすると突然インターホンが鳴り、いったい誰がきたのかと思ったら、例の隣人が「出てこい!」と切れています。何かが玄関ドアに対して当たる音がしました。きっとドアを殴ったか、蹴ったかのどちらかでしょう。びっくりしていると私の家の前から消えてしまったのですが、追いかけて事情をきくと、昨夜 23時〜0時にかけて物音がした事についてのクレームでした。

3月17日 午後10時30分。また下の階の住民が訪ねてきて、騒音がうるさい!とのクレーム。そのときは、まだ発売されたばかりの「シムシティ」を楽しくプレイしていた最中で、ゲームからショベルカーで建物をスクラップしたときのドーン音ぐらいしか発生させていませんが、それが下の階に届くことは考えづらいですし、自分自身はソファに座ってキーボードやマウスを操作しているのですから、騒音のたちようがありません。

どうにもならないので大家、不動産会社経由で管理会社に「隣人が騒音に苦しんでいるので助けてあげてほしい」と連絡をしました。これまでの経緯もあわせて、です。海外出張中の深夜に隣人が訪ねてきた記録が残っていることも話しました。


玄関カメラ1号、破れる


すると隣人のクレームがエスカレートしてきました。

 

3月23日 21時54分、インターホンのカメラ部分に手を当てて自分の姿を隠しながらドアを喚いたりドアを蹴ったりしています。どうやら記録の件が管理会社経由で伝わって気分を害したようです。仕方ないのでまた管理会社に連絡です。

管理会社に対応をお願いしつつ、私はインターホンのカメラシステムをアップグレードする必要性を感じていました。理由は:
  • 就寝中(午前2時〜4時)の訪問を繰り返されて、インターホンが鳴ったかどうかも正常に判断できなくなっており、客観的な記録はとり続ける必要があった
  • 先述の理由でインターホンのモニタ前にカメラを仕掛けても目的の画像が記録できなくなっていた
  • 在宅、不在にかかわらず隣人が自区画に近づいたかはログしておきたかった(訪問のほか、嫌がらせなどがあった場合の記録は残しておきたい)

玄関カメラ2号、爆誕


そんな時、秋葉原で在庫放出品と思われるネットワークカメラ PLANEX CS-W05NM があったので、買いました。


こちらは無線 LAN モデルになっており、 Web ブラウザからカメラのリアルタイムモニタリングをしたり、動体検出 SD カードや SMB/FTP によるリモートへの録画などが可能です。

早速、玄関ドアの覗き穴部分に取り付けました。築40年越えの分譲マンションのドアですが、ホームセンターで購入した玄関用覗き穴パーツ、木の板、ボルトなどをつかってマウントを自作します。賃貸契約ですし、オリジナルの部品は退去時に原状復帰できるようにすべてそのまま保管してありました。


しかし、新たな問題が発生しました。覗き穴経由の像は有効画素数の一部にしか映っておらず、結果としてネットワークカメラがもつ動体検出機能が動作しませんでした。動体検出の閾値は調整できそうにありません。


玄関カメラ2号のソフトウェア開発


仕方なく何か手段がないか探っていると、 設定次第では、ネットワークカメラに HTTP リクエストを送ると、Motion JPEG 形式でストリーミングが受けられることに気づきました。 Motion JPEG はいわば JPEG 画像のパラパラまんがですので、これをプログラムでバッファに書き出せば画像をリアルタイムで受信できるわけです。ネットを探検していたらサンプルコードを見つけたので Python で実装しなおし、二枚の画像を Numpy で引き算し差分を求めれば、画像の変化がわかるので、ニーズにあわせた動体検出&録画プログラムを書くことにします。

と、いうわけで。 Python と OpenCV を Hello world する日がきました。 Motion JPEG ストリームから JPEG データを抜き出し、 OpenCV を使って画像データ(Numpy)の配列に変換します。

あとは、すこし時間差がある画像2枚の差の絶対値をとれば、画像のなかで変化が大きいところが浮かびあがってきます。

この考え方をベースに、
  • Python で Motion JPEG のストリームを受信
  • 過去何十フレーム程度の履歴を常に保持
  • 過去のフレームと最新のフレームの差(=画像の変化)を調べる
  • 画像に変化がしばらく続いた場合に、バッファに残っているフレームから、画像の変化がなくなってしばらくするまでをひとつのMJPEGファイルとして保存
  • 検出開始した場合は Growl で手元の端末に通知
実際には蛍光灯のフリッカー、きまった時間に点灯/消灯する階段照明、カメラ自体のオートコントラスト/ゲイン機能などによる一時的な画面変化などを無視する処理もしています。

このソフトウェアが生成したビデオファイルの例を示します。

この仕組みにより、自宅の玄関に隣人が迫ってくる段階から記録を残すことができるようになりました。


玄関カメラ2号の運用結果


この仕組みでは、玄関の前を通った人たちも記録されてしまいます。見られていると思ったら周りの人々も気持ち悪いでしょうし、私自身も興味ない上に見ていてあまり気分のよいものではないので、目的の人物でなければ見なかったことにして忘れてファイルも消去です。そのほかにカメラを映りこんだ人を見てみると、
  • 表札をチェックしていく謎の男性 (地図屋?そのほかの調査?)
  • なぜか不在中に来訪した女性(たぶん宗教の勧誘とか)
  • 宅配便のスタッフ(チャイムを鳴らしながら電気メーターのまわり具合をみて在宅かどうかを見極めようとする人が多い)
などが見えてきて、いろいろと参考になりました。そして、ゴールデンウイーク。問題の隣人が夜に訪ねてきたビデオがついに記録されました。
問題の隣人が夜に訪ねてきたタイミング、および日中に手紙を玄関ポストへ投入する姿が覗き穴から確認できました。もちろんドアに近づくどころか階段を昇ってくる瞬間から動画として記録していますので、仮面ライダーのコスプレでもしていなければ誰であるかもよく判ります。

幸い、このタイミングで管理会社に改めて連絡をしてからは、隣人からクレームがくることはなくなりました。その後もしばらくこのシステムを稼働していましたが、さらに半年した時点でシステムを停止しました。今年にはいってからマンションの大規模修繕があり、玄関ドアごと付け替えになったので、先のネットワークカメラも今はありません。


関連するハック


このカメラですが、連続稼働していると突然通信できなくなることがあり、そのためにワッチドッグタイマーでリセットすることを考えて Eject-io というデバイスを開発していました。 Eject-io は カーネル/VM探検隊の Advent Calendar 2013 で紹介しましたので、そちらをご確認ください。
実際には Eject-io を使わずにタイマーを使って6時間ごとにネットワークカメラを起動しなおす運用を続け、それで目的が達成できてしまったので、 Eject-io は使いませんでした。


また、のちにスプラトゥーンの画面解析ツール IkaLog を作る際にはこの時の Python + OpenCV の経験が役に立ちました。

おわりに

ちょっとした手段で記録を残しても、いわゆるキ○ガイが静かになるかどうかは別の話だなあ、と思いました。

今回、私のケースは半年程度でに落ち着いたので(たぶん)よいのですが、火のついたマッチを玄関ドアの郵便受けに突っ込まれたり、その前に灯油がガソリンなどまかれたりしたら恐ろしいことになりますし、上の階に住んでいる子供達が心配です。

そういう自体を想定して火災アラームの増設などは行っていましたが、そもそも午前2時〜4時に度々チャイムを鳴らされて起こされていると、寝ている途中でふと「チャイムが鳴った気がして目が覚めたり、でも鳴っていなかったり、鳴ったのか鳴っていないのか判らなかったりしてきて、認識に異常をきたします。正直なところ、そもそも、そんな心配がないところに移ったほうがいい、と思っています。

おうちハック自体ではキ○ガイは居なくなりません。皆さん、お気を付けください。

おうちハック Advent Calendar の 10 日目
前日の記事: Extreme Home Hackレポート
翌日の記事:メインブレーカーが落ちる前にドライヤーを止める


0 件のコメント:

コメントを投稿