Frigate NVR实测:3步搭好本地实时对象检测监控系统
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:password192.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: cant start new thread那就是进程数到顶了再加pids_limit细节见 docs/docs/frigate/installation.md。案例 3纯 CPU 跑 4 路 1080pCPU 常年在 90%问题默认配置下 CPU 打满Live 页面开始掉帧。原因两个叠加一是解码全靠 CPU没配硬件加速二是detect分辨率跟主码流一样高。改法双管齐下。解码侧给hwaccel_args: preset-vaapiIntel/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),仅供参考