☰
Frigate 部署教程:Docker 搭建本地 AI 监控 NVR,摄像头视频不出家门
2026/10/24 18:44:23 网站建设 项目流程

家庭摄像头默认的工作方式是:视频先上传厂商云服务器,你在 App 里回看要订阅,AI 识别(有人/没人之类)是云端功能也要单独收费。Frigate 把这个链路整个搬回本地——用 Docker 在一台旧电脑、树莓派或 NAS 上跑一个 NVR,AI 识别和录像全部发生在你自己家里。它在 GitHub 上有 35.3k Star、3.5k Fork,MIT 协议。

本文不是泛泛介绍,而是给出完整可复现的部署过程,并把两件事讲透:Frigate 靠什么在两路、四路摄像头上跑得动(两段式检测 + 多进程架构),以及加速器怎么选(Coral / Hailo / OpenVINO / RKNN 各自的配置差异)。

一、为什么需要本地 NVR:云监控的隐性成本

先算一笔账。云摄像头的成本分三块:设备钱、订阅费、隐私。设备是一次性的,订阅是月月扣的(云存储 + 云 AI),隐私是你看不到的——视频文件存在别人的服务器上,识别在别人的机器上跑,你只能选择信任。

Frigate 换了个思路:设备 + 一块 AI 加速器一次投入,录像、识别、告警全在本地。官方文档里明确写了设计目标:“use of a GPU or AI accelerator is highly recommended”(强烈建议上加速器),“AI accelerators will outperform even the best CPUs with very little overhead”(专用加速器比最强的 CPU 都快,且功耗低得多)。

二、核心架构:两段式检测,不是每一帧都跑 AI

这是 Frigate 跟普通 NVR 最本质的区别,也是它能在一台几瓦的小机器上跑多路摄像头的原因。

物体检测是很贵的操作。一帧 1080p 画面丢给模型,哪怕有硬件加速也要几十毫秒;1080p 30fps 意味着每秒 30 帧,任何家用机器都顶不住。Frigate 的官方 README 是这样描述自己的设计取舍的:

  • “Uses a very low overhead motion detection to determine where to run object detection”(先用极低开销的运动检测决定在哪里跑对象检测)
  • “Object detection with TensorFlow runs in separate processes for maximum FPS”(对象检测在独立进程运行以最大化帧率)
  • “an emphasis on realtime over processing every frame”(实时优先,而不是逐帧处理)

落到流水线上就是三步:

最省钱的是中间那步:运动检测把绝大多数静止画面挡在了模型外面。模型只在"有必要的时间和地点"(官方原话:only looking for objects when and where it is necessary)才被唤醒。

这个设计在配置里的体现就是detect.fps和detect的分辨率——它们跟录像无关。检测可以跑在 720p、5fps 的低规格上,录像依然是摄像头推送的原画。很多第一次配置的人在这里会困惑:"我 detect 设了 720p,为什么回看还是 4K?"因为这是两条独立的链路。

三、完整部署:docker-compose + config,30 分钟内跑起来

先给出可复现的最小配置。运行环境:一台 x86 或 ARM 的 Linux 机器,装好 Docker + Docker Compose(树莓派、NAS、旧笔记本都行;官方明确 Windows 不在支持范围)。

docker-compose.yml:

services:frigate:container_name:frigaterestart:unless-stoppedimage:ghcr.io/blakeblackshear/frigate:stableshm_size:"256mb"volumes:-/etc/localtime:/etc/localtime:ro-/path/to/your/config:/config-/path/to/your/storage:/media/frigate-type:tmpfstarget:/tmp/cachetmpfs:size:1000000000ports:-"8971:8971"# Web UI-"8554:8554"# RTSP 转发-"8555:8555/tcp"# WebRTC-"8555:8555/udp"

docker compose up -d后浏览器打开http://你的IP:8971。但此刻还没有摄像头,Web 界面里检测是空转的。Frigate 官方提供了测试配置:用一个本地 mp4 文件模拟一路视频源,先把检测流程跑通再买设备。

config.yml(测试模式):

mqtt:host:mqttcameras:test:ffmpeg:inputs:-path:/media/frigate/car-stopping.mp4input_args:-re-stream_loop-1-fflags +genptsroles:-detect-rtmpdetect:height:1080width:1920fps:5

把 mp4 放到/media/frigate/(对应宿主机--storage挂载目录)就能循环播放检测。看懂这个配置就懂了 Frigate 八成用法:cameras下每路摄像头是一个键,ffmpeg.inputs指定视频源,detect指定检测分辨率。

接真实摄像头时只需把path换成 RTSP 地址:

cameras:front_door:ffmpeg:inputs:-path:rtsp://user:pass@192.168.1.64:554/stream1roles:-detectdetect:width:1280height:720fps:5

四、加速器怎么选:检测器类型与配置对比

Frigate 默认用 CPU 跑 TensorFlow Lite 模型,但官方文档明确标注 CPU detector 是"not recommended"(不推荐),并建议:没 GPU 或 EdgeTPU 时,用 OpenVINO 的 CPU 模式往往比原生 CPU 检测器更高效。

注意一个官方提示:多个检测器不能混用做对象检测(例如 OpenVINO 和 Coral EdgeTPU 不能同时用于检测)。多个检测器会各自跑独立进程,但从所有摄像头共享的同一个检测队列取任务。

检测器硬件典型配置要点
EdgeTPU(Coral)Google Coral USB / Mini PCIe / M.2type: edgetpu,device: usb或pci;默认模型 Mobiledet,可换 YOLOv9
Hailo-8 / Hailo-8LM.2 模块 + 树莓派 HATtype: hailo8l,自动选 YOLOv6n,可指定本地.hef或 URL
OpenVINOIntel 6 代+ CPU / GPU / NPU(也支持 AMD CPU)type: openvino,device: CPU/GPU/NPU;默认 SSDLite MobileNet v2
RKNNRockchip NPU(RK3588 等)社区支持,板卡自带 NPU
CPU任何 x86/ARMtype: cpu,num_threads: 3;不推荐用于实际使用

Coral 的配置最典型,USB 版最常用:

detectors:coral:type:edgetpudevice:usbmodel:path:/edgetpu_model.tflite# 容器内置默认模型

Hailo-8 的配置稍不同,它会根据硬件自动选默认模型:

detectors:hailo:type:hailo8ldevice:PCIemodel:width:320height:320input_tensor:nhwcinput_pixel_format:rgbmodel_type:yolo-genericlabelmap_path:/labelmap/coco-80.txt

成本参考(官方文档标注):Google Coral USB 官方定价 $59.99,Hailo-8 AI Kit 约 $70,Nvidia GPU 看你预算,RK3588 等板卡的 NPU 随板自带。所以最省钱的玩法是:一台吃灰旧电脑/树莓派 + 一块几十到几百块的加速器 + 几路几十块的 RTSP 摄像头,几百块搭一套全本地 AI 监控。不上加速器行不行?行,但别指望同时带八路 4K——那是算力物理极限,不是 Frigate 的 bug。

五、为什么 shm 内存必须显式给够

Frigate 用共享内存(shm)存放解码后的原始帧。Docker 默认只有 64MB,两路 720p 检测基本就顶满了,视频一多会报Bus error——这是最常见的翻车点之一。

官方文档给过内存估算公式:一路 1280x720 检测,1280 × 720 × 1.5 × 20 + 270480字节,加上日志开销约 66MB。所以上面 compose 里shm_size: "256mb"不是拍脑袋:如果你加到八路 720p,需要约 253MB。

六、和 ZoneMinder、云监控比,差在哪

ZoneMinder 是做了二十多年的老牌开源 NVR(5.9k Star),功能全,支持模拟、IP、USB 摄像头。但它的定位是"录像 + 移动侦测",不带内置 AI 物体识别这层——它告诉你"画面有变化",不告诉你"变化的是人还是狗"。Frigate 的杀手锏恰恰在 AI 层:区分人、车、狗、猫、包裹,支持车牌识别、人脸识别、语义搜索,检测到"人"才告警,风吹草动不会触发。

云监控的差别更本质:数据所有权。云方案里视频存在别人的服务器、识别跑在别人的机器、订阅费月月扣;Frigate 把这三样全拿回本地。这是选它的核心理由,不是性能。

七、踩坑清单

按真实反馈频次排:

  1. shm 不够 → Bus error。默认 64MB 只够一两次低规格检测,视频多了必挂,显式给shm_size。
  2. detect 分辨率和录像混淆。detect 是检测用低分辨率低帧率,录像永远是原画。配错的人以为"Frigate 降画质",其实是没分清两条链路。
  3. 加速器透传。虚拟机里跑,GPU 和 Coral 透传可能出问题(官方文档明确提示);Windows 不在支持范围。
  4. 多检测器不能混用。想同时上 Coral + OpenVINO 做检测,官方不支持;加速只能分别用于检测之外的语义搜索等任务。
  5. 默认 CPU 检测器慢。如果暂时没加速器,优先试 OpenVINO 的 CPU 模式,别用默认cpu类型硬扛。
  6. RTSP 认证字符串。摄像头 URL 里带user:pass@,注意有些摄像头对特殊字符要求 URL 编码,否则连不上流。

八、局限说清楚

第一,它有技术门槛。Docker、YAML、RTSP、shm,每一项都要求你有点 Linux 基础,不是插上就用的商品。第二,本地部署 = 自己维护:硬盘坏了录像没了,机器挂了告警停了,云监控外包的风险要自己扛。第三,默认模型识别的物体类别有限,想要更高准确率和更多类别,得用官方在开源之外的 Frigate+ 付费定制模型。第四,品牌注意:代码是 MIT 开源,但 “Frigate” 名称和 logo 是 Frigate, Inc. 的注册商标。

九、结论

如果你愿意花一个下午搭一套、之后视频永远不出家门,Frigate 是目前本地 AI 监控赛道里最成熟的开源选择,35k Star 的量级就是这个判断的背书。它的边界很清晰:本地、开源、可折腾,代价是自己扛运维。部署路径也固定:Docker Compose 起服务 → 测试配置先跑通 → 换真实 RTSP → 按摄像头数量配检测器与 shm。照这个顺序走,比直接堆配置少踩一半坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询