Frigate介绍与部署:基于AI的本地视频监控系统
Frigate 是一个开源的、高性能的本地视频监控系统,它利用 AI (特别是通过 Google Coral TPU 进行边缘计算)来实现实时目标检测,例如检测人、车辆、宠物等。与传统监控系统只是录像不同,Frigate 能够智能识别画面中的物体,并只在检测到感兴趣的事件时进行录像或发送通知,大大减少了存储空间和误报,同时提高了事件分析的效率。
“让你的摄像头变得更智能,只记录你真正关心的事件。”
一、Frigate 是什么?
Frigate 是一个基于 FFmpeg 和 TensorFlow 的 AI 目标检测视频监控系统。它的核心思想是利用神经网络在本地对视频流进行实时分析,识别预定义的目标(如人、车),然后根据这些识别结果进行录制、快照捕捉或触发自动化。
核心优势:
- 本地处理:所有视频流和 AI 推理都在本地完成,保障隐私,不依赖云服务。
- 实时目标检测:利用 Google Coral TPU 等硬件加速,实现毫秒级的实时检测。
- 智能录像与快照:只在检测到目标时录制完整的视频片段,并捕捉关键帧快照。
- 集成度高:与 Home Assistant 深度集成,可以作为强大的自动化触发器。
- 事件分组:自动将连续的检测事件进行分组,方便回溯和管理。
- 区域检测:可定义特定区域,只在该区域内进行目标检测。
- 丰富的通知:结合 Home Assistant 或其他服务,发送包含快照的通知。
- 高度可配置:通过 YAML 文件进行详细配置,满足各种高级需求。
- 开源免费:完全开放源代码,社区活跃。
二、为什么选择 Frigate?
- 告别误报:传统监控遇到树叶摇曳、光线变化、小动物经过等情况常会误报,Frigate 通过 AI 准确识别“人”或“车”,显著减少误报。
- 节省存储:只录制有事件发生的片段,而非持续录像,大大节省 NAS / NVR 的存储空间。
- 快速查找事件:通过 Frigate 的 Web UI 或 Home Assistant 界面,可以快速浏览所有检测到的“人”或“车”事件,而无需大海捞针般地查看大量录像。
- 强大的自动化:结合 Home Assistant,当 Frigate 检测到“人”时,可以自动开灯、发送通知、触发警报等。
- 隐私保护:所有处理都在本地完成,无需将视频流上传到第三方云服务。
三、部署前的准备
Frigate 推荐使用 Docker 部署。为了发挥其最佳性能,特别是实时 AI 推理,强烈建议使用 Google Coral TPU。
1. 硬件要求
- 服务器:一台能运行 Docker 的 Linux 服务器(如 NAS、NUC、树莓派 4B/5、Mini PC、旧电脑等)。
- CPU:建议有一定性能的 CPU,如 Intel Celeron J4125/J5005 或更好,用于运行 FFmpeg。
- 内存:建议 4GB 及以上。
- 摄像头:支持 RTSP 协议的 IP 摄像头(几乎所有现代网络摄像头都支持)。
- Google Coral TPU (强烈推荐):
- USB Accelerator:最常见的形式,通过 USB 3.0 接口连接到你的服务器。
- PCIe Accelerator:性能更高,适用于有 PCIe 插槽的服务器。
- 为何需要?:没有 Coral TPU,Frigate 也能运行,但 AI 推理将完全依赖 CPU,性能会非常差,可能无法满足多路摄像头的实时检测需求,甚至可能导致 CPU 占用过高。Coral TPU 可以极大地加速 AI 推理,让每秒帧数 (FPS) 大幅提升,从而实现实时分析。
2. 软件要求
- Docker 和 Docker Compose:确保你的服务器已安装。
- SSH 客户端:用于连接服务器进行命令行操作。
- 媒体存储路径:用于保存录像和快照的持久化存储目录。
- Python (如果需要 Coral):部分系统可能需要安装 Python 和 Coral 驱动。
3. 理解 Docker 部署的好处
- 环境隔离:Frigate 运行在独立的容器中,不影响宿主系统。
- 易于部署和管理:使用 Docker Compose 一键启动、停止、升级。
- 版本控制:方便升级和回滚 Frigate 版本。
- Coral TPU 兼容性:Docker 提供标准化的方式来将 Coral 设备映射到容器内部。
四、部署步骤(以 Docker Compose 为例)
1. 挂载 Coral TPU (如果使用)
如果你的服务器连接了 Google Coral TPU,需要确保宿主系统能够识别它,并将其映射到 Docker 容器中。
USB Coral
安装 Coral 驱动 (部分系统可能需要):
通常,Linux 系统会自动识别 USB Coral。如果遇到问题,可以参考 Coral 官方文档安装libedgetpu1-std。检查设备:
连接 Coral TPU 到 USB 3.0 端口,然后运行:1
2lsusb # 查看 USB 设备列表,应能看到 Google Inc. 或 Global Unichip Corp.
ls -l /dev/bus/usb/ # 查看 USB 设备文件你可能会看到一个类似
Bus 001 Device 002: ID 1a6e:089a Global Unichip Corp.的设备。
PCIe Coral
- 安装 Coral 驱动:
PCIe Coral 需要安装驱动。请参考 Coral 官方文档。 - 检查设备:应能看到 Coral PCIe 设备。
1
lspci -nn | grep -i coral
2. 创建目录结构
通过 SSH 连接到你的服务器,创建用于 Frigate 存储配置、录像、缓存等数据的目录。
1 | # 创建 Frigate 配置目录 |
注意: /mnt/data/frigate 仅为示例路径,请根据你的存储实际情况调整。
3. 编写 config.yml (Frigate 核心配置文件)
在 /mnt/data/frigate/config 目录下创建一个名为 config.yml 的文件。
这是 Frigate 最重要的配置文件,定义了你的摄像头、AI 模型、检测区域等。
1 | sudo nano /mnt/data/frigate/config/config.yml |
一个基本的 config.yml 示例(请根据你的摄像头和需求修改):
1 | # Frigate 配置示例 |
保存并关闭文件。
配置解释:
mqtt:用于与 Home Assistant 集成,将检测事件发布到 MQTT Broker。detectors:定义 AI 推理设备。cpu是默认的,edgetpu是为 Coral TPU 准备的。如果你有 Coral,记得取消注释coral_tpu部分。record/snapshots:控制录像和快照的行为,保留时间等。ffmpeg:FFmpeg 的参数配置。inputs是摄像头的 RTSP 地址,roles定义了该流的用途 (detect用于检测,record用于录像,rtmp用于 Web UI 预览)。cameras:定义你的每个摄像头。ffmpeg:每个摄像头的 FFmpeg 配置。detect.fps:用于检测的帧率,如果 CPU 性能不足且没有 Coral,可以适当降低此值。zones:定义感兴趣的检测区域,可以减少误报。objects.track:指定 Frigate 应该关注哪些类型的对象。motion.mask:定义忽略运动的区域。
4. 创建 Docker Compose 文件
在 /mnt/data/frigate 目录下创建一个名为 docker-compose.yml 的文件。
1 | sudo nano /mnt/data/frigate/docker-compose.yml |
将以下内容粘贴到 docker-compose.yml 文件中:
1 | version: "3.8" |
配置解释:
image: blakeblackshear/frigate:stable:使用 Frigate 的稳定版 Docker 镜像。privileged: true:必需。允许容器访问宿主机的/dev设备,这是为了让容器能够识别和使用/dev/dri(Intel GPU) 或/dev/bus/usb(Coral USB)。network_mode: host:为了简化,让容器直接使用宿主机的网络堆栈。这样 Frigate 就可以直接访问你的局域网中的摄像头,而无需复杂的端口转发或 Bridge 网络配置。缺点是容器不再拥有独立 IP。如果你需要为 Frigate 分配一个独立的 IP 地址,请使用bridge模式并手动映射端口。volumes:/etc/localtime:/etc/localtime:ro:同步容器和宿主机的时区。/mnt/data/frigate/config:/config:ro:将宿主机的config目录映射为容器内部的/config。ro表示只读,这意味着 Frigate 无法修改config.yml。/mnt/data/frigate/media:/media:将宿主机的media目录映射为容器内部的/media。Frigate 会将录像、快照、数据库文件等存储在这里。/dev/dri:/dev/dri(Intel GPU 解码/编码):如果使用 Intel CPU 的核显进行硬件加速,请取消注释此行。/dev/bus/usb:/dev/bus/usb(Coral USB TPU):如果使用 USB Coral TPU,请取消注释此行。
environment: 如果宿主机的文件权限与容器内 Jellyfin 的PUID/PGID不匹配,你可能需要根据实际情况设置这些环境变量,确保容器有权限写入media目录。restart: unless-stopped:保证 Frigate 在服务器重启后自动启动。
保存并关闭文件。
5. 启动 Frigate 容器
在 /mnt/data/frigate 目录下,执行以下命令来启动 Frigate:
1 | sudo docker compose up -d |
docker compose up:根据docker-compose.yml文件创建并启动服务。-d:表示在后台运行容器。
如果一切顺利,Frigate 容器应该已经启动并运行。
6. 检查容器状态和日志
1 | sudo docker ps -a | grep frigate |
在日志中,你应该能看到 FFmpeg 启动、摄像头流接收以及 Coral TPU 初始化成功的消息。
7. 访问 Frigate Web UI
打开你的浏览器,访问 http://你的服务器IP:5000。
你将看到 Frigate 的 Web UI 界面。
- 在
Live页面,你应该能看到你的摄像头实时画面。 - 在
Events页面,当 Frigate 检测到配置的对象时,会生成事件和快照。 - 在
Configuration页面,你可以查看当前的配置(只读)。
五、与 Home Assistant 集成(推荐)
Frigate 与 Home Assistant 官方集成,可以极大扩展其功能。
- 确保你的 Home Assistant 和 Frigate 都在同一个网络中,且 MQTT 服务已运行并配置在 Frigate 的
config.yml中。 - 在 Home Assistant 中,进入
设置->设备与服务->添加集成。 - 搜索
Frigate。 - Home Assistant 会尝试自动发现 Frigate。如果发现失败,你可能需要手动输入 Frigate 的 IP 地址。
- 通过集成,Home Assistant 会自动创建各种 Frigate 实体,包括:
binary_sensor:每次检测到对象时触发。media_player:用于查看摄像头直播流。camera:用于查看录像、快照。sensor:显示当前在线人数、车辆数等。
- 你可以利用这些实体在 Home Assistant 中创建强大的自动化,例如:
- 当 Frigate 检测到
person时,触发智能灯光亮起。 - 当 Frigate 检测到
car且是夜间时,发送包含快照的通知到手机。 - 结合门窗传感器,只有在门窗打开时才检测特定区域等。
- 当 Frigate 检测到
六、高级配置与优化
1. FFmpeg 硬件加速
如果你的服务器 CPU 是 Intel (带核显),强烈建议开启 FFmpeg 的硬件解码/编码,可以大幅降低 CPU 占用。
- 宿主机驱动:确保你的 Linux 系统已安装 Intel 显卡的 VA-API 驱动。
- Docker Compose:在
volumes中添加- /dev/dri:/dev/dri。 - Frigate
config.yml:
在ffmpeg部分的global_args中添加:并调整1
2ffmpeg:
global_args: -hwaccel vaapi -hwaccel_output_format vaapioutput_args中的编码器,例如:具体编码器名称(1
2
3
4# ...
output_args:
detect: -f segment -segment_times 10 -segment_format mp4 -r 10 -c:v h264_vaapi -preset ultrafast -tune zerolatency -crf 23 -bf 0 -g 30 -sc_threshold 0 -pix_fmt vaapi_vpp -movflags +faststart
record: -c:v h264_vaapi -map 0:v:0 -map 0:a? -f segment -segment_times 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -ar 44100 # 如果录像也想用VAAPI编码h264_vaapi) 和像素格式 (vaapi_vpp) 可能因 FFmpeg 版本和驱动而异,请查阅资料匹配。
2. 内存磁盘 (tmpfs)
Frigate 会在 cache 中存储一些临时文件。如果你的内存足够大,可以考虑将 /tmp/cache 映射为 tmpfs,以减少磁盘 I/O,并提升性能。
在 docker-compose.yml 中 volumes 部分添加:
1 | volumes: |
3. 多路 Coral TPU
如果你有多个 Coral TPU,可以在 config.yml 的 detectors 部分定义多个 edgetpu 检测器,并为每个摄像头指定使用哪个 TPU。
1 | detectors: |
4. 远程存储
Frigate 可以配置将录像和快照存储到远程位置(如网络共享、S3 存储桶)。这需要更复杂的配置和额外的工具(如 rclone)。
5. 自定义 AI 模型
Frigate 允许你使用自定义的 TensorFlow Lite 模型,来识别更多类型的物体或优化现有物体识别性能。这需要具备一定的 AI 模型训练和转换知识。
七、总结
Frigate 是一个革命性的本地视频监控解决方案,它将 AI 驱动的目标检测带入了家庭和小型办公室场景。通过智能识别和事件驱动的录制,它解决了传统监控系统在误报、存储空间和事件查找方面的痛点。配合 Google Coral TPU,Frigate 能够提供高性能的实时检测,并与 Home Assistant 无缝集成,开启无限自动化可能。
虽然部署 Frigate 需要一些 Docker 和 YAML 配置的知识,但一旦配置完成,它将大大提升你的监控体验,让你的智能家居系统真正“智能”起来。强烈推荐给所有希望升级自己视频监控系统的用户!
