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 に接続し、設定を変更する前にバックアップを作成します。
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 が優先されます。ディレクトリを確認した後、次のコードで既存ファイルを選択してバックアップします。後続の手順でも同じパスを使用します。
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どちらのファイルも見つからない場合は、コンテナのマウントを確認します。
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 デコードを試す場合に適した方法です。
-
RK3576 からアクセスできるネットワークに IP カメラを接続します。
-
カメラの設定で RTSP を有効にし、RTSP URL と認証情報を確認します。例:
textrtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATHすべてのプレースホルダーを、カメラメーカーが指定する実際の URL に置き換えてください。
-
必要に応じて、RK3576 上の
ffprobe(ffmpegパッケージに含まれる)で RTSP ストリームを確認します。bashffprobe -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 を使用し、人や車両がはっきり見えるようにしてください。動画が大きい場合は、先に変換します。
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 にマウントしたフォルダーへファイルをコピーします。
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 に転送しても構いません。コンテナからファイルを確認します。
sudo docker exec frigate ls -lh /media/frigate/test.mp4Frigate の Manual Dummy Camera を使用し、FFmpeg でローカル動画を読み込んで繰り返し再生します。
手順 3:RKNN 検出器とカメラを設定する
手順 1 と同じ SSH ターミナルで、検出した設定ファイルを開きます。再接続した場合や変数が空の場合は、先に手順 1 をやり直してください。
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 検出器設定を使用します。
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 カメラ
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
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 コンテナを再起動します。
cd ~/frigate-rk
sudo docker compose restart frigate
sudo docker compose ps履歴全体ではなく、関連するログを確認します。
sudo docker logs --since 5m frigate 2>&1 | \
grep -iE 'rknn|model|detector|ffmpeg|error|failed' | tail -n 100初回は対応モデルのダウンロードと初期化を待ちます。キャッシュは次の場所に作成されます。
~/frigate-rk/config/model_cache/rknn_cache/キャッシュを確認できます。
sudo ls -lh ~/frigate-rk/config/model_cache/rknn_cache/手順 5 で実行結果を確認してください。
手順 5:検出結果と NPU の使用状況を確認する
-
https://<RK3576_IP>:8971を開いてログインします。 -
設定したカメラを探します。方法 A は
front_door、方法 B はdemo_videoです。 -
Debug view を開き、Debugging Bounding Boxes を有効にします。検出された物体の周囲に、
person、bicycle、carの検出枠が表示されます。
検出枠が表示されない場合は、動画に追跡対象が映っているか、Debugging Bounding Boxes が有効か、ログに
Successfully loaded RKNN modelが出ているかを確認してください。 -
Frigate の System ページで、使用中のバージョンに表示される検出器の推論時間と検出 FPS を確認します。
-
動画に対象となる動きがある状態で、RK3576 の NPU 負荷を確認します。
bashsudo cat /sys/kernel/debug/rknpu/load検出中に繰り返し監視することもできます。
bashwatch -n 1 'sudo cat /sys/kernel/debug/rknpu/load'
NPU の使用率は動きに応じて変動します。検出オーバーレイと Frigate の指標で検出結果を確認してください。
手順 6(任意):RKMPP ハードウェア動画デコードを有効にする
主に 方法 A(RTSP カメラ) で、RKNN 検出が動作してから行います。RKMPP は対応動画のデコードを高速化するもので、物体検出器ではありません。
既存の front_door カメラの ffmpeg: 内に hwaccel_args: preset-rkmpp を追加します。
cameras:
front_door:
ffmpeg:
hwaccel_args: preset-rkmpp
inputs:
- path: rtsp://USERNAME:PASSWORD@CAMERA_IP:554/STREAM_PATH
roles:
- detectこれは一部の設定例です。手順 3 のその他のカメラ設定、RKNN モデル、検出器設定を保持してください。
Frigate を再起動し、FFmpeg 関連のログを確認します。
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 検証時はハードウェアデコードを無効のままにします。