Frigate NVR实测:3步搭好本地实时对象检测监控系统
【免费下载链接】frigateNVR with realtime local object detection for IP cameras项目地址: https://gitcode.com/GitHub_Trending/fr/frigate
凌晨一点,手机被一条"检测到运动"的推送吵醒,点开一看——是只野猫从花坛后面走过。传统摄像头只能记录,判断得靠人脑;而Frigate这类本地 NVR 的思路正好相反:让 IP 摄像头的视频流先在本地跑一遍实时对象检测,只把"人"和"车"这类有效事件存下来、推出来。这套系统跑在一台树莓派或闲置小主机上,不依赖云端,配置好之后误报推送能少一大截。
🚀 五分钟跑通:Docker Compose 最小部署
先说结论:不装 GPU、不买加速器,纯 CPU 也能先把流程跑通。官方镜像自带默认的 OpenVINO CPU 检测器,开箱即用。
环境要求不高,一张表说清:
| 项目 | 最低配置 | 备注 |
|---|---|---|
| CPU | 双核 2.0GHz+ | 纯 CPU 检测,摄像头越多越吃算力 |
| 内存 | 4GB | 帧数据走共享内存,别省 |
| 存储 | 64GB SSD | 录像段先写内存缓存再落盘 |
| 系统 | Debian 系裸机 + Docker | 虚拟机下硬件加速基本没戏 |
Step 1:准备目录和 docker-compose.yml。在一个部署目录(比如~/frigate)下建config和storage两个子目录,compose 文件内容如下,这段配置控制容器的镜像、共享内存大小和对外端口:
services: frigate: container_name: frigate restart: unless-stopped image: ghcr.io/blakeblackshear/frigate:stable shm_size: "128mb" volumes: - ./config:/config - ./storage:/media/frigate ports: - "8971:8971"改shm_size会影响能同时检测的摄像头数量:128mb 大约够 2 路 720p 检测,摄像头多了要按官方文档里的公式往上加,否则直接崩溃(后面踩坑篇会说)。
Step 2:启动并拿到初始密码。
docker compose up -d docker logs frigate日志里会打印自动生成的 admin 账号密码。首次启动会创建默认配置和数据库,耐心等一两分钟。
Step 3:在 WebUI 里加第一路摄像头。浏览器访问http://<主机IP>:8971,用日志里的密码登录,进 Settings 里的 Camera management 用向导添加摄像头。如果不想走向导,在config/config.yml里直接写也可以,这段配置控制摄像头的 RTSP 源、检测分辨率和要跟踪的对象:
cameras: front_door: ffmpeg: inputs: - path: rtsp://admin:password@192.168.1.10:554/stream1 roles: - detect - record detect: width: 1280 height: 720 fps: 5 objects: track: - person - cardetect的宽高和 fps 是性能调节的主开关,改低了 CPU 立刻宽松,改高了误检区域更准。
验证是否成功:摄像头画面在 Live 页面出现、右下角有状态指示灯,然后对着镜头走两步——Events 页面里应该出现一条person事件。看到这些,检测链路就算通了。
🔍 跑通之后:一帧视频到底经历了什么
Frigate 不是把每一帧都丢给模型,它的流水线是"层层过滤"的,整体数据流可以参照 docs/docs/frigate/video_pipeline.md 里的说明:
第一步:拉流与解码,只解低分辨率的"sub流"
每个摄像头会拉两路流:高分辨率的 main 流用于录制,低分辨率的 sub 流专门给检测用。FFmpeg 把 sub 流解码后按detect.fps抽帧,丢进共享内存。这一步的入口在 frigate/ffmpeg_presets.py,各种硬件解码参数(preset-vaapi、preset-nv等)都定义在这里,选对预设是后面 CPU 优化的前提。
第二步:运动检测先行,只盯"动过的地方"
抽出来的帧先过一道很轻量的帧差检测,实现在 frigate/motion/frigate_motion.py:维护一张背景平均图,当前帧和背景做差,超过threshold且轮廓面积够大才记为一个 motion box。默认行为是没有运动就不调用模型,这就是官方宣称"只在该看的地方看"的由来。代价是它比较笨:风吹树叶、雨滴、车灯扫过都会变成 motion box。
第三步:对象检测、跟踪与事件判定
motion box 被送进独立的检测进程(多摄像头就是多进程并行),跑 YOLO 类模型,插件化实现放在 frigate/detectors/plugins/ 下——Coral、Hailo、TensorRT、OpenVINO 各有一个文件。检测框交给 frigate/track/ 里的跟踪器做跨帧关联,确认不是闪一下就判定为事件;frigate/events/ 负责生成事件记录和抓拍,frigate/record/record.py 按 retention 配置决定录像段去留,MQTT 消息则由 frigate/comms/mqtt.py 发出给 Home Assistant。各进程之间不直接喊话,统一走 frigate/comms/inter_process.py 定义的 ZMQ 通道,这也是它能按摄像头横向扩展的原因。
⚙️ 调优与踩坑实录:误报和崩溃怎么压下去
案例 1:夜里树叶影子反复触发运动检测
问题:摄像头对着院子,凌晨树叶晃动导致运动事件刷个不停,但事件里又没有对象(模型确认没东西),纯属浪费检测资源。
原因:第二步的帧差算法不做语义判断,像素变了就是运动。
改法:把画面里不稳定或根本不关心的区域用 mask 抠掉,这段配置控制哪片区域完全跳过运动检测:
cameras: yard: masks: bottom: left: 0 top: 0.75 right: 1 bottom: 1 motion: threshold: 30mask 只影响运动检测,不影响录制;threshold调高则误报更少,但调太高手推车这类慢动作会漏。实测把底部 25% 的树叶区域 mask 掉、threshold 从 25 提到 30 后,夜间无效 motion box 少了一大半,真正有人经过时照样秒出事件。
如果不想 mask 整片区域,更精细的做法是建 zone 配合对象过滤器,只让指定区域里的person触发推送,配置文档在 docs/docs/configuration/zones.md。
案例 2:跑了两天后容器报 "Bus error" 退出
问题:多路摄像头场景下,日志里突然出现Bus error,容器重启循环。
原因:Docker 默认/dev/shm只有 64MB,解码帧全存在共享内存里,摄像头一多直接越界。很多人会误以为是解码器崩溃,其实只是共享内存不够。
改法:compose 文件里的shm_size按摄像头数量加,4 路 1080p 建议先给到 512mb。改完docker compose up -d重建容器即可。如果加了 shm 还报RuntimeError: can't start new thread,那就是进程数到顶了,再加pids_limit,细节见 docs/docs/frigate/installation.md。
案例 3:纯 CPU 跑 4 路 1080p,CPU 常年在 90%
问题:默认配置下 CPU 打满,Live 页面开始掉帧。
原因:两个叠加:一是解码全靠 CPU(没配硬件加速),二是detect分辨率跟主码流一样高。
改法:双管齐下。解码侧给hwaccel_args: preset-vaapi(Intel/AMD 核显)并透传/dev/dri/renderD128设备;检测侧把detect.width/height降到 640x360 级别、fps 保持 5。检测模型的输入本身不需要 1080p 的精度,小模型+小输入帧是 CPU 场景下的标准解法。如果愿意加硬件,换个检测器更彻底,这段配置控制检测模型跑在哪块设备上:
detectors: coral: type: edgetpu device: usb换到 USB Coral 后检测延迟从几十毫秒降到几毫秒,CPU 占用基本回落到解码本身的水平。可选的检测器和对应镜像见 docs/docs/configuration/object_detectors.md。
资源指引与社区入口
深入配置看 docs/docs/configuration/ 下的分主题文档,摄像头参数细节在 docs/docs/frigate/camera_setup.md;想动手改检测器或通信层,入口分别是 frigate/detectors/ 和 frigate/comms/;写测试可以参考 frigate/test/。问题反馈走项目仓库的 Issue 和 Discussion。下次那只野猫再路过花坛,你只需要在配置里加一行only_records_and_snapshots或者给它划个不推送的 zone,手机就能安安静静睡到天亮。
【免费下载链接】frigateNVR with realtime local object detection for IP cameras项目地址: https://gitcode.com/GitHub_Trending/fr/frigate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考