コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home AssistantでDIY Smart Home】「ネコ」を判別せよ!

【Home Assistant(Hass.io)】
Frigate NVRを使って動体検知&判別する

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 庭を監視するC500ですが、実は動体「検知」は出来ています(ONVIF統合をすることでHome Assistantのセンサーが出来てました)が、「何を検知したか」まではわかりません。

 不埒な「ネコ」(もしかすると他の動物かもしれませんが。ハクビシンとかタヌキとか…)が来たのかを検知したいのです。庭を横切るおっさん(私の事ですが年齢サバを読みすぎ?おじいさんの方が近い?)はどうでもいいのです。つまり動体「判別」がしたいのです。
 どうやら「Frigate NVR(Network Video Recorder)」なるものを使えばそれが出来るらしい。ということでトライ!

この記事の前提条件
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.video

 Frigate NVRのNVRはネットワークビデオレコーダーの略ですが、Frigateは? Frigate(フリゲート)と言えばフリゲート艦、軍艦の種類を思い出しますが、ロゴは鳥。で、FRIGATE BIRDとググると「グンカンドリ」が出てきます。そうか「上から見張るから」なのかな?

2.1 インストール

Home AssistantでFrigate NVRを使うには3つのパーツの導入が必要です。

  1. Frigate NVRそのもの
  2. Frigate NVRをHAのUIで見えるようにするもの
  3. 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的にもやはり難しいのでしょうか。
 こうなったら、下の方にもカメラを増設するか(やや泥沼感が)。

maky-ba.hatenablog.com

*1:しかも、それを非力なラズパイのCPUにやらせるなんて!!

*2:シモからの落とし物だけではなく、ウエから虹色シャワーをかましてくれる様子も「BIRD」として捉えてくれました…ちくしょう(確かに畜生ではありますが…)。