【Home Assistant(Hass.io)】
Frigate NVRを使って動体検知&判別する
「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
庭を監視するC500ですが、実は動体「検知」は出来ています(ONVIF統合をすることでHome Assistantのセンサーが出来てました)が、「何を検知したか」まではわかりません。
不埒な「ネコ」(もしかすると他の動物かもしれませんが。ハクビシンとかタヌキとか…)が来たのかを検知したいのです。庭を横切るおっさん(私の事ですが年齢サバを読みすぎ?おじいさんの方が近い?)はどうでもいいのです。つまり動体「判別」がしたいのです。
どうやら「Frigate NVR(Network Video Recorder)」なるものを使えばそれが出来るらしい。ということでトライ!
- 【Home Assistant(Hass.io)】 Frigate NVRを使って動体検知&判別する
- 1. 準備
- 2. Frigate NVRの導入
- 3. Google Coral登場!
- 4. で、ネコはどうなった?
- 5. おわりに
この記事の前提条件 | |
---|---|
Home Assistant | 2023.11.3 |
HassOS | 11.1 |
Server | Raspberry Pi 4(4GB) |
上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)
1. 準備
Google Coral アクセラレータ
動体判別は学習済みAIモデルを使っても高負荷作業*1です。で、Googleのデバイスの力でそこをカバー。Amazon.co.jpで1万円ほどです。
セルフパワーUSBハブGoogle
Coralは強力ですが電力消費も多い。ラズパイのUSB3.0を不安定にしない為にELECOMのACアダプター付きUSBハブを挟みます。
2. Frigate NVRの導入
Frigate NVRのNVRはネットワークビデオレコーダーの略ですが、Frigateは? Frigate(フリゲート)と言えばフリゲート艦、軍艦の種類を思い出しますが、ロゴは鳥。で、FRIGATE BIRDとググると「グンカンドリ」が出てきます。そうか「上から見張るから」なのかな?
2.1 インストール
Home AssistantでFrigate NVRを使うには3つのパーツの導入が必要です。
- Frigate NVRそのもの
- Frigate NVRをHAのUIで見えるようにするもの
- Frigate NVRを動体検知等をセンサーとしてHAで扱えるようにするもの
2.1.1. Frigate NVRそのものの導入
Frigateそのものの導入先は、Intel CPUベースでDebian(Linux)が動くものです。ざっくり言えば、
- (a) 物理的なサーバー(SynologyやQNAP等のNAS)
- (b) 仮想サーバー(Dockerなど)
の2種類です。細かく言えばそれぞれにいろんなものが含まれます。仮想サーバーの一例としては「Home AssistantのAdd-On」があります。今回はこれを利用します。
私はRaspberry Pi 4にHome Assistantを入れて、128GB SSD HDDを繋いで使っていて容量の余裕もあるので、そこにAdd-Onとしての導入を選択します。
「設定」→「アドオン」→「アドオンストア」と進み、右上の3点アイコンから「リポジトリ」を選択して、https://github.com/blakeblackshear/frigate-hass-addons
を登録する。すると色々出てくるけどFrigate (Full Access)
を選択してインストールする。
2.1.2. Frigate NVRをHAのUIで見えるようにする
Frigateサーバと交信してHA (Home Assistant)のUI(ダッシュボード/Lovelace)で操作できるようにするための仕組みはAdd-onで提供されています。なお2.1.1でAdd-onでFrigate本体を導入した場合には、もれなくこちらも導入されています。
なおFrigateをDockerとかで別サーバにインストールした時は、Add-onでFrigate Proxy
を選んでインストールすると、Docker上のFrigateサーバ(?)と交信してHAで操作できるようにしてくれる、はずです。
2.1.3. Frigate NVRの動体検知等をHAで扱えるようにする
まずHACSが使えるようになっている必要があります。(もしまだ設定していなければ「【Home AssistantでDIY Smart Home】いまさらネットワークカメラTapo C200接続!」の「2. HACSの導入」を参照のこと)
「HACS」→「Integrations」と進み、右下の「+ EXPLORE & DOWNLOAD REPOSITORIES」で「Frigate」を検索し導入。再起動後に「設定」→「デバイスとサービス」に進み「統合」タブの右下にある「+統合を追加」で「Frigate」を検索して追加します。
下記のような画面がでてFrigateのURLを聞いてくるので、Add-onのFrigate Full Accessを導入した場合にはhttp://ccab4aaf-frigate-fa:5000
を設定。
うまくいけば「完了」といってFrigateサーバを見つけてくれます。
ダッシュボードでいろいろいい感じのカメラ画像を再生するカードが使えるように設定できるようです(そこまでは力及ばす、それはまた次回)。
2.2. Frigate設定
まあつまりは、「2.1.1 Frigate NVRそのものの導入」でHA Add-on版を入れておけばそれで一応ことはたりることになります。次に、frigate.yamlファイルを設定してゆきます。
Home AssistantのConfiguration.yamlがある同じフォルダにfrigate.yamlがあるのでそれを編集します。(Frigateの画面から編集しても良し)
mqtt: host: <mqttのIPアドレス(Add-onで導入していれば、Raspberry Piのアドレス)> user: mqtt password: <mqttのpassword> cameras: #**************************************** tapo_c500_1: ffmpeg: hwaccel_args: preset-rpi-64-h264 inputs: - path: rtsp://<tapoアプリで設定したカメラアカウント名>:<同じくそのパスワード>@<カメラのIP>:554/stream2 roles: - detect - path: rtsp://<tapoアプリで設定したカメラアカウント名>:<同じくそのパスワード>@<カメラのIP>:554/stream1 roles: - record detect: enabled: True width: 640 height: 360 fps: 5 objects: track: - person - cat - bird record: enabled: True snapshots: enabled: True #**************************************** detectors: cpu1: type: cpu cpu2: type: cpu
「objects: track:」に記載の「person」「cat」「bird」が物体判別の対象です。これで「人」と「ネコ」と「鳥」が現れたらイベントとして記録してくれるようになるはずです。
「Frigate」画面で「Cameras」を選ぶと登録されているカメラの一覧が表示されます。
見たいカメラをクリックすると設定確認画面になります。
下の方に、検知して判別したものが表示されます(なんか変でしょ…)。
3. Google Coral登場!
先ほどの設定ファイルでは「detectors:」にはとりあえず「type: cpu」を割り当てておきました。これはRaspberry Pi 4のCPUを使って「detect(検知・判別)」を行う設定です。Frigateがちゃんと動くかどうかテストする目的では良いのですが、カメラを複数設置すると(キャプチャを忘れてしまいましたが)プロセッサー負荷は80%以上まで平気で上がっていきます。
さすがにこれでは常用は出来ないので、ハードウェアでなんとかしましょう。Google Coralはそのような用途に向いている「Google社製のローカルAIプラットフォーム」です。色々なモデルがありますが、今回はUSBモデルをRaspberry Pi 4のUSB3.0ポートにUSBハブ経由で接続します(そうしないとRapberry Pi 4が電力不足に…)。
frigate.yamlファイルの最後の部分を書き換えます。
(前略) detectors: coral: type: edgetpu device: usb
これで(Home Assistantをシステム再起動させる必要あったかと思いますが)USBが認識されFrigateがCoralで検知を開始します。
プロセッサーの利用率も30%前後に落ち着きます。すばらしい!
4. で、ネコはどうなった?
うえの画像にもちょっと出てますが「CAT」と物体判別されているのは、おっさん(私)、です…うう悲しい(それから、風に揺れる庭のソテツも良く「CAT」になります…)。
で、なぜか「BIRD」にばっちり「ネコ」が検知・判別されております!
一応、「ネコを捉える」という目的は達せられているのではありますが…*2。
5. おわりに
「屋外カメラで庭に来るネコを監視するぞ!」のコメント欄でbeuさんから「見下ろし型ではうまく検知しないかも…つまり猫の顔を正面で捉えられる角度だと検知するのかも」とのアドバイスが。
そうか、そうですね、うちのカメラ設置位置(軒下ぶら下がり)だと、人は斜め上ぐらいから全身が映るので「PERSON」はばっちり人間を捉えます(私は、時々BARDになったり、CATになったりするのですが)。
一方で、猫は上面展開図的ネコなので、AI的にもやはり難しいのでしょうか。
こうなったら、下の方にもカメラを増設するか(やや泥沼感が)。