RK3576 Frigate:RKNN による物体検出

最終更新:

概要

前のチュートリアルでは、reComputer RK3576 に Frigate NVR をインストールし、Web インターフェースにアクセスしました。今回は動画ソースを接続し、RKNN NPU による物体検出を有効にして、人、自転車、自動車を認識します。

外部の RTSP ネットワークカメラ、または手元にあるローカル動画ファイルを使用できます。指定のサンプル動画をダウンロードする必要はありません。物体検出が動作したら、対応する RTSP カメラを使って RKMPP ハードウェア動画デコードも試せます。

RKNN と RKMPP の違い: RKNN は RK3576 の NPU で AI モデルの推論を高速化します。RKMPP は Rockchip のマルチメディアハードウェアで動画デコードを高速化します。それぞれ別の処理経路です。

以下の例は Frigate の公式設定に基づいています。実機で検出結果を検証してください。

事前準備

まず reComputer RK3576 での Frigate NVR インストール入門を完了し、https://<RK3576_IP>:8971 で Frigate にログインできることを確認します。

RKNN 推論には、対応する Rockchip BSP カーネルと RKNPU ドライバーが必要です。RKMPP デコードには rkvdec2 を含む Rockchip 動画デコーダードライバーも必要です。

本記事では前編のプロジェクトディレクトリ ~/frigate-rk を使用し、Docker Compose で ./config を /config に、./storage を /media/frigate にマウントしていることを前提とします。ハードウェアの準備、Docker のインストール、管理者の初期設定は繰り返しません。

手順 1:既存の Frigate 設定をバックアップする

SSH で RK3576 に接続し、設定を変更する前にバックアップを作成します。

bash
cd ~/frigate-rk
sudo docker compose ps
FRIGATE_CONFIG_DIR="$HOME/frigate-rk/config"
sudo ls -lah "$FRIGATE_CONFIG_DIR"

Frigate は config.yml と config.yaml に対応しています。両方がある場合は config.yml が優先されます。ディレクトリを確認した後、次のコードで既存ファイルを選択してバックアップします。後続の手順でも同じパスを使用します。

bash
FRIGATE_CONFIG_FILE=
if sudo test -f "$FRIGATE_CONFIG_DIR/config.yml"; then
  FRIGATE_CONFIG_FILE="$FRIGATE_CONFIG_DIR/config.yml"
elif sudo test -f "$FRIGATE_CONFIG_DIR/config.yaml"; then
  FRIGATE_CONFIG_FILE="$FRIGATE_CONFIG_DIR/config.yaml"
fi

if [ -n "$FRIGATE_CONFIG_FILE" ]; then
  sudo cp -- "$FRIGATE_CONFIG_FILE" "${FRIGATE_CONFIG_FILE}.before-rknn.bak"
  printf 'Using configuration: %s\n' "$FRIGATE_CONFIG_FILE"
else
  printf '%s\n' 'No config.yml or config.yaml found. Check the /config mount before continuing.' >&2
fi

どちらのファイルも見つからない場合は、コンテナのマウントを確認します。

bash
sudo docker inspect frigate --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'

/config に対応するホスト側ディレクトリを探し、FRIGATE_CONFIG_DIR に設定して、上記の一覧表示とファイル選択を繰り返してください。設定ファイルのパスを独自に指定している場合は、実際のファイルを確認してから続けます。

別のディレクトリにインストールした場合は、コマンドを調整してください。以下の例を統合する際は、既存の認証設定や独自のカメラ設定を保持します。cameras:、detectors:、model: などのトップレベルの YAML キーを重複させないでください。

手順 2:動画ソースを選ぶ

方法 A または方法 Bのどちらかを選択します。両方を設定する必要はありません。いずれも手順 3 の同じ RKNN 検出器を使用します。

方法 A:外部 RTSP ネットワークカメラを接続する

実際の NVR 運用や、後から RKMPP デコードを試す場合に適した方法です。

  1. RK3576 からアクセスできるネットワークに IP カメラを接続します。

  2. カメラの設定で RTSP を有効にし、RTSP URL と認証情報を確認します。例:

    text
    rtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATH

    すべてのプレースホルダーを、カメラメーカーが指定する実際の URL に置き換えてください。

  3. 必要に応じて、RK3576 上の ffprobe(ffmpeg パッケージに含まれる)で RTSP ストリームを確認します。

    bash
    ffprobe -v error -rtsp_transport tcp \
      -show_entries stream=codec_name,width,height \
      -of default=noprint_wrappers=1 \
      'rtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATH'

    正常なストリームでは、動画コーデックと解像度が返されます。実際の認証情報を公開しないでください。

    検出には、可能であればカメラの 720p サブストリームを使用してください。4K のメインストリームはデコード負荷を増やすだけで、モデル入力は 320×320 のままです。

USB カメラ: USB Web カメラは RTSP ネットワークカメラとは異なります。対応する入力方法や RTSP ブリッジを使って動画を Frigate に渡してください。RTSP URL の例に /dev/video0 をそのまま代入しないでください。

方法 B:手元のローカル動画ファイルを使う

IP カメラがない場合は、人や車両が映っている MP4 など、手元の動画ファイルを用意します。指定のサンプル動画をダウンロードする必要はありません。

1280×720、15 fps、H.264 の MP4 を使用し、人や車両がはっきり見えるようにしてください。動画が大きい場合は、先に変換します。

bash
ffmpeg -i input.mp4 -vf "fps=15,scale=1280:720" \
  -c:v libx264 -pix_fmt yuv420p -crf 23 -an test.mp4

変換した test.mp4 を storage/test.mp4 にコピーします(下のコマンドのパスを置き換えてください)。

Frigate にマウントしたフォルダーへファイルをコピーします。

bash
cd ~/frigate-rk
# Replace /path/to/your-video.mp4 with your existing file path.
cp /path/to/your-video.mp4 storage/test.mp4

ファイルが別のコンピューターにある場合は、SCP または SFTP で ~/frigate-rk/storage/test.mp4 に転送しても構いません。コンテナからファイルを確認します。

bash
sudo docker exec frigate ls -lh /media/frigate/test.mp4

Frigate の Manual Dummy Camera を使用し、FFmpeg でローカル動画を読み込んで繰り返し再生します。

手順 3:RKNN 検出器とカメラを設定する

手順 1 と同じ SSH ターミナルで、検出した設定ファイルを開きます。再接続した場合や変数が空の場合は、先に手順 1 をやり直してください。

bash
if [ -n "${FRIGATE_CONFIG_FILE:-}" ] && sudo test -f "$FRIGATE_CONFIG_FILE"; then
  sudo nano "$FRIGATE_CONFIG_FILE"
else
  printf '%s\n' 'Repeat Step 1 to locate the existing configuration before editing.' >&2
fi

両方の方法で、次の RKNN 検出器設定を使用します。

yaml
detectors:
  rknn_0:
    type: rknn
    num_cores: 0

model:
  path: frigate-fp16-yolov9-t
  model_type: yolo-generic
  width: 320
  height: 320
  input_tensor: nhwc
  labelmap_path: /labelmap/coco-80.txt

本例では frigate-fp16-yolov9-t RKNN 検出モデルを使用します。320 × 320 はモデルの入力サイズであり、カメラ動画の解像度ではありません。初回はモデルを自動ダウンロードし、以降はキャッシュを使用します。初回のダウンロードにはネットワーク接続が必要です。

単一ソースのデモでは、以下の完全な設定例から一つを選びます。既存設定に保持すべき項目がある場合は、ファイル全体を置き換えず、該当セクションを統合してください。

完全な設定例——方法 A:RTSP カメラ

yaml
mqtt:
  enabled: false

detectors:
  rknn_0:
    type: rknn
    num_cores: 0

model:
  path: frigate-fp16-yolov9-t
  model_type: yolo-generic
  width: 320
  height: 320
  input_tensor: nhwc
  labelmap_path: /labelmap/coco-80.txt

cameras:
  front_door:
    enabled: true
    ffmpeg:
      inputs:
        - path: rtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATH
          roles:
            - detect
    detect:
      enabled: true
      fps: 5
    objects:
      track:
        - person
        - bicycle
        - car
    record:
      enabled: false
    snapshots:
      enabled: false

重要: 再起動前に RTSP URL を置き換えてください。まずは物体検出に集中するため、録画とスナップショットを無効にしています。

完全な設定例——方法 B:ローカル MP4

yaml
mqtt:
  enabled: false

detectors:
  rknn_0:
    type: rknn
    num_cores: 0

model:
  path: frigate-fp16-yolov9-t
  model_type: yolo-generic
  width: 320
  height: 320
  input_tensor: nhwc
  labelmap_path: /labelmap/coco-80.txt

cameras:
  demo_video:
    enabled: true
    ffmpeg:
      # Local clips may require software decoding.
      hwaccel_args: ""
      inputs:
        - path: /media/frigate/test.mp4
          input_args: -re -stream_loop -1 -fflags +genpts
          roles:
            - detect
    detect:
      enabled: true
      fps: 5
    objects:
      track:
        - person
        - bicycle
        - car
    record:
      enabled: false
    snapshots:
      enabled: false

-re は動画の本来の速度で読み込み、-stream_loop -1 は再生を繰り返し、-fflags +genpts は必要に応じてタイムスタンプを生成します。ローカル動画でハードウェアデコーダーを使えない場合、hwaccel_args: "" でダミーカメラの動画ハードウェアアクセラレーションを無効にします。RKNN 物体検出は引き続き NPU で実行できます。

手順 4:Frigate を再起動して RKNN の初期化を確認する

手順 1 で選択した設定ファイル(config.yml または config.yaml)を保存し、既存の Frigate コンテナを再起動します。

bash
cd ~/frigate-rk
sudo docker compose restart frigate
sudo docker compose ps

履歴全体ではなく、関連するログを確認します。

bash
sudo docker logs --since 5m frigate 2>&1 | \
  grep -iE 'rknn|model|detector|ffmpeg|error|failed' | tail -n 100

初回は対応モデルのダウンロードと初期化を待ちます。キャッシュは次の場所に作成されます。

text
~/frigate-rk/config/model_cache/rknn_cache/

キャッシュを確認できます。

bash
sudo ls -lh ~/frigate-rk/config/model_cache/rknn_cache/

手順 5 で実行結果を確認してください。

手順 5:検出結果と NPU の使用状況を確認する

  1. https://<RK3576_IP>:8971 を開いてログインします。

  2. 設定したカメラを探します。方法 A は front_door、方法 B は demo_video です。

  3. Debug view を開き、Debugging Bounding Boxes を有効にします。検出された物体の周囲に、person、bicycle、car の検出枠が表示されます。

    Frigate の Debug view で検出された車両の検出枠

    検出枠が表示されない場合は、動画に追跡対象が映っているか、Debugging Bounding Boxes が有効か、ログに Successfully loaded RKNN model が出ているかを確認してください。

  4. Frigate の System ページで、使用中のバージョンに表示される検出器の推論時間と検出 FPS を確認します。

  5. 動画に対象となる動きがある状態で、RK3576 の NPU 負荷を確認します。

    bash
    sudo cat /sys/kernel/debug/rknpu/load

    検出中に繰り返し監視することもできます。

    bash
    watch -n 1 'sudo cat /sys/kernel/debug/rknpu/load'

NPU の使用率は動きに応じて変動します。検出オーバーレイと Frigate の指標で検出結果を確認してください。

手順 6(任意):RKMPP ハードウェア動画デコードを有効にする

主に 方法 A(RTSP カメラ) で、RKNN 検出が動作してから行います。RKMPP は対応動画のデコードを高速化するもので、物体検出器ではありません。

既存の front_door カメラの ffmpeg: 内に hwaccel_args: preset-rkmpp を追加します。

yaml
cameras:
  front_door:
    ffmpeg:
      hwaccel_args: preset-rkmpp
      inputs:
        - path: rtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATH
          roles:
            - detect

これは一部の設定例です。手順 3 のその他のカメラ設定、RKNN モデル、検出器設定を保持してください。

Frigate を再起動し、FFmpeg 関連のログを確認します。

bash
sudo docker compose restart frigate
sudo docker logs --since 5m frigate 2>&1 | \
  grep -iE 'ffmpeg|rkmpp|rkvdec|error|failed' | tail -n 100

カメラ動画と AI 検出が引き続き動作し、ハードウェアコンテキストのエラーで FFmpeg が繰り返し停止しないことを確認します。ホストに監視ツールがある場合は、動画デコーダーが動作していることも確認してください。同じストリームと解像度で、RKMPP の有効化前後の CPU 使用率を比較します。

ローカル MP4 のダミーカメラでは、最初の RKNN 検証時はハードウェアデコードを無効のままにします。