Raspberry Piで花を食べに来る野鳥を撮影する
はじめに
最近、ベランダにある蝋梅がきれいな黄色の蕾をつけたのですが、こころなしか日々その数が減っていくように感じていました。以前、葡萄を育てていた時にも、同じようなことがありました。その時は、PCにWebカメラをつないで監視したところ、ヒヨドリが採食している場面がばっちり映っていて、犯人を特定することができました。冬になってヒヨドリの声もよく聞く今日このごろ、今回もヒヨドリの犯行が疑われます。そこで、監視カメラを設置して蝋梅の蕾を食べる現場の証拠を抑えようと思います。
たまたま、使用していないRaspberry Piが転がっていたので、今回はそれを利用することにしました。Webカメラは以前使ったものがあるので、それをそのまま使います。
用意したもの
・Raspberry Pi 3 Model B+
・UVC対応のWebカメラ (BUFFALO BSWHD06M)
・三脚
・養生テープ
ハードウェアのセットアップ
Webカメラを三脚の雲台の上に養生テープで固定しました。極めて簡易な構成ですが、室内から窓越しに撮影するように設置したのでこれで問題ありません。
ソフトウェアのセットアップ
・OS: Raspberry Pi OS with desktop (Bullseye) 2021-10-30
・動体検知ソフトウェア: Motion 4.3.2
OSは最新のものを一から入れ直しました。Raspberry PiでWebカメラを使うのは初めてだったので、まずは以下のサイトを参考にしつつ、使えるかどうかを確認しました。
・【Raspberry Pi】webカメラを接続する方法
・Webカメラ - Raspberry Pi 公式ドキュメントを日本語訳
まずはカメラが正しく認識されているかを調べます。
$ lsusb
Bus 001 Device 005: ID 0411:0260 BUFFALO INC. (formerly MelCo., Inc.) BUFFALO BSWHD06M USB Camera
Bus 001 Device 004: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
どうやら正しく認識されているようです。
次に試し撮りです。fswebcamで静止画を撮ってみます。
(fswebcamは標準ではインストールされていないのでapt installで入れてやる必要があります。)
$ fswebcam image.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'image.jpg'.
問題なく撮影できました。特に写すものがなかったのでカーテンに向けて撮影しました。
次はいよいよMotionの設定です。Motionは動体検知機能付きの監視カメラプログラムです。以下のページなどを参考に設定しました。
・Raspberry Pi(ラズパイ)にMotionを入れて動体検知機能付きの監視カメラを作る
・ラズパイで動体検知対応の監視カメラを作る
/etc/motion/motion.confを編集することで各種設定を変更できます。デフォルトの設定から変更したのは以下の点です。
・画像サイズ (width, height)
・動画の出力形式 (movie_codec)
・動画の品質 (movie_quality)
・動画の出力ファイル名 (movie_filename)
・ストリーミングサーバへのアクセス制限 (stream_localhost)
・動体検知のパラメータ (threshold, threshold_tune)
・パラメータ調整用のデバッグ情報 (text_changes, locate_motion_mode)
画像サイズは、デフォルトだと低めの解像度なので、カメラの解像度に合わせました。今回使用したBSWHD06Mは1280x720まで対応しているので、それに合わせます。
width 1280
height 720
動画の出力形式は、デフォルトはmkv形式なのですが、そのままだと使い辛いので扱いやすいmp4に変更しました。また、動画の品質は、せっかく撮影するならより高品質な動画でと思い、デフォルトよりも高めに設定しました。(ただし動画のサイズが大きくなるので100にはしませんでした)
movie_codec mp4
movie_quality 70
動画の出力ファイル名の設定は、後で動画ファイルを閲覧整理するのに使いやすいように設定します。ファイル名に/を含めることで日付ごとに別のディレクトリに保存することができます。デフォルトでは一つのディレクトリに保存されるようになっているので、日付ごとに異なるディレクトリに保存するように設定しました。
movie_filename %Y%m%d/%Y%m%d-%H%M%S-%v
motionにはストリーミングサーバの機能があるのですが、デフォルトだとローカルからしかアクセスできません。カメラ設置時の画角調整や、設置後にリアルタイムに監視するのに便利なので、アクセス制限を外しておきます。
(注:ネットワークの設定などセキュリティが十分に確保されていることを確認してから利用するようにしてください。)
stream_localhost off
動体検知のパラメータ設定
動体検知のパラメータはいくつかありますが、特に重要なのが動体検知の感度を決めるthresholdです。thresholdを自動で設定してくれる機能もあってthreshold_tuneで有効化できます。threshold_tuneが有効のときは、thresholdの値は使われません。
thresholdの値の単位はピクセル数で、ノイズ除去等の画像処理後の画像について、一つ前のフレームと比較して変化したピクセル数がこの値以上になると動体を検知したとして録画が開始されます。今回のように画像の解像度を変更すると、それに応じて調整が必要になります。
threshold 10000
threshold_tune on
パラメータ調整をするために便利な機能もあります。
text_changesをonにすると、画面の右上に変更したピクセル数が表示されるようになります。これを見ながら適切な値を決めることができます。また、locate_motion_modeをonにすると、動体検知された領域に長方形が描画されるようになるので、どの部分の動きが動体として検知されたのかがわかります。
text_changes on
locate_motion_mode on
ここで紹介した以外にも動体検知に関するパラメータは他にたくさんあります。詳しくはドキュメントを参照してください。
・https://motion-project.github.io/4.3.2/motion_config.html
結果
カメラを設置した初日に早くも撮影に成功しました!やはり犯人はヒヨドリでした。しかもつがいでやってきて、パクパクと。対策も調べてみたのですが、結局は網を被せるしかないみたいで、それだと景観が損なわれるので今のところ、様子見です。
おわりに
今回は幸運なことにカメラ設置初日に成果が得られました。しかし、その翌日から風が強く吹く日が続き、枝の動きで誤検知が多発する事態となりました。動体検知パラメータをいろいろ変えてみたのですが、まだこれといった良いパラメータは見つかっていません。深層学習に基づいたよりスマートな方式もきっと開発されているに違いないと思っているのですが、この分野はあまり詳しくないので十分サーベイできていません。また、機会を見つけて調べてみたいと思います。