RK3576 Frigate:RKNN 目标检测

最近更新:

介绍

上一篇教程介绍了如何在 reComputer RK3576 上安装 Frigate NVR 并访问网页界面。本篇继续接入视频源、启用 RKNN NPU 目标检测,识别人、自行车和汽车。

你可以选择外部 RTSP 网络摄像头,也可以使用已有的本地视频文件,无需下载指定的示例视频。目标检测正常运行后,使用兼容 RTSP 摄像头的用户还可以测试 RKMPP 硬件视频解码。

RKNN 与 RKMPP 的区别: RKNN 使用 RK3576 的 NPU 加速 AI 模型推理;RKMPP 使用 Rockchip 多媒体硬件加速视频解码。这是两条不同的加速路径。

以下示例依据 Frigate 官方配置编写。请在设备上验证检测结果。

准备工作

先完成在 reComputer RK3576 上安装 Frigate NVR,确认可以通过 https://<RK3576_IP>:8971 登录 Frigate。

系统需具备兼容的 Rockchip BSP 内核和 RKNPU 驱动,才能使用 RKNN 推理;RKMPP 解码还需要相应的 Rockchip 视频解码驱动,包括 rkvdec2。

本文沿用第一篇的项目目录 ~/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 设置为该目录,再重复上面的目录查看、文件识别与备份步骤。如果部署中另行指定了配置文件路径,请先确认实际文件再继续。

如果你的安装目录不同,请相应调整命令。合并下文示例时,保留已有认证和自定义摄像头设置。不要重复定义顶层 YAML 键,例如 cameras:、detectors: 或 model:。

步骤 2:选择视频源

选择方案 A 或方案 B,不必同时配置。两种方案都使用步骤 3 中相同的 RKNN 检测器。

方案 A:接入外部 RTSP 网络摄像头

该方案适合实际 NVR 部署,也适合后续 RKMPP 解码测试。

  1. 将网络摄像头接入 RK3576 可以访问的网络。

  2. 在摄像头设置中启用 RTSP,记录 RTSP 地址和登录凭据,例如:

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

    请使用摄像头厂商提供的实际地址替换所有占位内容。

  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 摄像头不等同于 RTSP 网络摄像头。请先通过兼容输入方式或 RTSP 桥接将视频提供给 Frigate,不要直接把 /dev/video0 填入示例 RTSP 地址。

方案 B:使用已有的本地视频文件

没有网络摄像头时,可以使用自己的视频文件,例如包含行人或车辆的 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 地址。示例先关闭录像和快照,集中验证目标检测。

完整配置——方案 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 时先保持硬件解码关闭。