RK3576 / Docker / RKNN / Frigate をベースに、エッジ NVR プロジェクトを手早く構築します。

Frigate はオープンソースの NVR で、ローカルかつリアルタイムの AI 物体検出 に重点を置いています。すべての推論は自分のハードウェア上で実行され、カメラのストリームは一切クラウドサーバーへアップロードされません。これによりプライバシーが守られると同時に、毎月発生するクラウド AI サブスクリプション費用も回避できます。Frigate はカスタムの検出ゾーンとマスクゾーンをサポートし、Home Assistant とシームレスに統合して NVR の映像をスマートホームの自動化に取り込めます。
このガイドでは、reComputer RK3576 上で Docker Compose を使って Frigate をデプロイし、RK3576 内蔵の Rockchip MPP(ハードウェアデコード)+ RGA(2D アクセラレーション)+ RKNN(NPU 推論) スタックを活用して CPU 使用率の低いリアルタイム映像分析を実現する方法を紹介します。
はじめに
このガイドでは公式のデプロイ手順に従い、reComputer RK3576 上の RTSP カメラストリームに対してローカル AI 検出を行う Frigate Docker 環境の構築方法を紹介します。
公式ドキュメントが求める前提条件
Frigate の公式推奨:
- 最適なホストとして Debian 系 OS を使用すること
- 仮想マシン(VM)は推奨されません(Proxmox、ESXi、Virtualbox)— 一部の Proxmox 構成は動作する可能性がありますが、Coral/GPU のパススルー処理が複雑になります
- Windows は公式サポート対象外です(WSL / Virtualbox で動く可能性はあるものの、GPU/Coral のパススルーは困難)
Rockchip プラットフォームでは、システムイメージのバージョンを確認してください:
$ uname -r
5.10.xxx-rockchip
$ ls /dev/dri
by-path card0 card1 renderD128 renderD129
$ sudo cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.2必要共有メモリの算出
Frigate は映像フレームの処理に共有メモリを使用します。Docker が提供するデフォルトの shm-size は 64 MB です。720p カメラ 2 台での検出シナリオでは、デフォルトの 128 MB の共有メモリで十分です。リソースを有効活用するため、実際の状況に応じて共有メモリの割り当てを選択してください。
公式オンライン計算ツールの使用を推奨します:https://docs.frigate.video/frigate/installation#calculating-required-shm-size
ダウンロードリンクの取得
公式サイト https://docs.frigate.video/frigate/installation#docker にアクセスし、次の項目を選んでインストール手順を取得します。

Storage Paths セクションは実際の必要に応じて記入してください(不要な項目は空欄でも構いません)。Other Options には上で計算したメモリサイズを入力してください。また、パスワードを手動で設定することもできます(任意)。
その後、インストール手順をコピーします:
services:
frigate:
container_name: frigate
privileged: true # This may not be necessary for all setups
restart: unless-stopped
stop_grace_period: 30s # Allow enough time to shut down the various services
image: ghcr.io/blakeblackshear/frigate:stable-rk
shm_size: "512mb" # Update for your cameras based on SHM calculation
security_opt:
- apparmor=unconfined
- systempaths=unconfined
devices:
- /dev/dma_heap # Rockchip DMA heap
- /dev/rga # Rockchip RGA
- /dev/mpp_service # Rockchip MPP service
- /dev/dri # Intel/AMD GPU hardware acceleration
volumes:
- /etc/localtime:/etc/localtime:ro # Sync host time
- /path/to/your/config:/config # Config file directory
- /path/to/your/storage:/media/frigate # Recording storage directory
- type: tmpfs # 1GB in-memory filesystem for recording segment storage
target: /tmp/cache
tmpfs:
size: 1000000000
- /sys/:/sys/:ro # Rockchip system info
ports:
- "8554:8554" # Access RTSP feeds from go2rtc
- "8971:8971" # Authenticated UI and API access (default HTTPS)
- "8555:8555" # WebRTC over TCP
- "8555:8555/udp" # WebRTC over UDP
environment:
TZ: "Asia/Shanghai" # Timezoneまたは、テスト済み・検証済みの構成を GitHub から直接取得することもできます:https://github.com/doublelf/RK_friigate_dockeryml
services:
frigate:
container_name: frigate
privileged: true # 特権モードを使用
restart: unless-stopped
stop_grace_period: 30s # 各サービスのシャットダウンに十分な時間を確保
image: docker.cnb.cool/frigate-cn/frigate:stable-rk # ここは国内ミラーソースのアドレスで、元のアドレスは ghcr.io/blakeblackshear/frigate:stable-rk
shm_size: "512mb" # 上記の算出結果に基づきカメラに合わせてこの値を更新
devices:
- /dev/dri:/dev/dri # GPU ハードウェアアクセラレーション用
- /dev/dma_heap # RockChip DMA ヒープ
- /dev/rga # RockChip RGA
- /dev/mpp_service # RockChip MPP サービス
security_opt:
- apparmor=unconfined
- systempaths=unconfined
volumes:
- /etc/localtime:/etc/localtime:ro # ホスト時刻を同期
- /home/seeed/frigate/config:/config # 「/home/seeed/frigate/config」はホスト上で設定ファイルを保存したいパス
- /home/seeed/frigate/video:/media/frigate # 「/home/seeed/frigate/video」はホスト上で監視映像ファイルを保存したいパス
- type: tmpfs # 1 GB のメモリを記録セグメントの一時ストレージとして使用
target: /tmp/cache
tmpfs:
size: 1000000000
- /sys/:/sys/:ro # RockChip システム情報
ports:
- "8971:8971" # Frigate サービスのデフォルトポート、デフォルトで HTTPS
- "8554:8554" # RTSP 映像ストリーム
- "8555:8555/tcp" # TCP ベースの WebRTC
- "8555:8555/udp" # UDP ベースの WebRTC
environment:
FRIGATE_RTSP_PASSWORD: "password" # RTSP のパスワード。希望のパスワードに変更してください
TZ: "Asia/Shanghai" # 中国 +8 タイムゾーンに設定
HF_ENDPOINT: "https://huggingface.mirror.frigate-cn.video" # 当方提供の Huggingface 国内ミラーソース。Frigate で必要となる一部モデルのダウンロードを高速化
GITHUB_ENDPOINT: "https://github.mirror.frigate-cn.video" # 当方提供の GitHub 国内ミラーソース。Frigate で必要となる一部モデルのダウンロードを高速化
TF_KERAS_MOBILENET_V2_WEIGHTS_URL: https://cnb.cool/frigate-cn/mirrors/storage.googleapis/-/git/raw/main/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_0.35_224_no_top.h5 # 分類モデルに必要な重みファイルdocker-compose.yml ファイルを作成し、上記の内容を記述し、ターミナルで実行します:
docker compose up -dビルドが完了すると、Frigate のローカル構築は完了です。以降、設定ファイルを変更し、起動後にバックエンドで実行状況を確認できます。
公式の最小 config.yml
以下の config.yml は「動作させることだけ」を目的とした最小構成です:RTSP カメラ 1 台 + MQTT 無効 + デフォルト検出器(CPU)。Frigate のインストール後にデフォルトで提供されるもので、もしこのファイルがない場合は手動で作成する必要があります。
mkdir -p ~/frigate/config
tee ~/frigate/config/config.yml > /dev/null << 'EOF'
mqtt:
enabled: False
cameras:
my_cam:
ffmpeg:
inputs:
- path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@<camera-ip>:554/stream
roles:
- detect
detect:
width: 1280
height: 720
detect:
fps: 5
EOF<camera-ip> を実際のカメラの IP に置き換えてください。このファイルは /path/to/your/config/config.yml(docker-compose でマップしている /config)に保存してください。
この構成は複数カメラを同時に実行するように変更することもできます。上記の構成をベースに構造を追加するだけでよく、次の構成は詳細設定の異なる 2 台のカメラを起動する例です:
mqtt:
enabled: false
face_recognition:
enabled: true
go2rtc:
streams:
usb_camera:
- ffmpeg:device?video=0&video_size=640x480#video=h264
cameras:
usb_camera:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/usb_camera
input_args: preset-rtsp-restream
roles:
- detect
- record
detect:
width: 640
height: 480
enabled: false # まずは映像ストリームをテストするため、検出を無効化
record:
enabled: true
continuous:
days: 0 # 0 に設定すると、デフォルトでは種別が指定されていない監視映像は録画されません
alerts: # ここではアラーム映像のみを録画するように指定しており、上記設定は無視されます
retain:
days: 30
mode: motion
zones:
zone_b32f13ac:
coordinates: 0.867,0.093,0.417,0.115,0.437,0.859,0.974,0.85
loitering_time: 0
friendly_name: ゾーン1
video_test: # このテストカメラに名前を付けます
ffmpeg:
inputs:
- path: /home/seeed/frigate/test.mp4 # 映像ファイルのパス
input_args: -re -stream_loop -1 -fflags +genpts
roles:
- detect
- record
detect:
enabled: true
record:
enabled: false # テスト中は録画を無効にすることを推奨
snapshots:
enabled: false # テスト中はスナップショットを無効にすることを推奨
version: 0.17-0cameras、video_test をインデントして起動し、それぞれが 1 台のカメラ設定を表します。ffmpeg は映像ファイルパスや適用ロールを含むカメラ全体の設定を指定し、detect は物体検出機能、record は録画機能、snapshots はスナップショット機能を表します。
起動と検証
以下の手順で行います:
cd /path/to/your/frigate
sudo docker compose up -d
# 起動ログの確認
sudo docker compose logs -f frigateログに INFO : Frigate started successfully. が含まれているか、Web UI が 0.0.0.0:8971 でリスンしていれば、起動成功です。
ログからアカウントとパスワードを取得するには、キーワードを検索します:
docker logs frigate 2>&1 | grep -Ei 'rtsp://|rtsps://|password|passwd|user|username|@'rtsp://admin:password@192.168.1.100:554/stream のような出力が表示されることがあります。
# コンテナ状態の確認
sudo docker compose ps
# Frigate サービスの状態が running / healthy であることを期待# ブラウザでアクセス
https://<your-host-ip>:8971アカウントとパスワードでログインします。

ログインに成功すると、画面全体の様子と、先ほどの config ファイルで設定したカメラの情報が確認できます:

そのうちの 1 つを選んでクリックすると、右上にあるデバッグ画面に入ることができ、画面内のすべての機能を確認できます。右上には config ファイルで「含めるか/事前起動するか」を設定できる機能が並び、左側には後から境界などを設計するための組み込み機能が並んでいます:
