Frigate 是一个开源的、高性能的本地视频监控系统,它利用 AI (特别是通过 Google Coral TPU 进行边缘计算)来实现实时目标检测,例如检测人、车辆、宠物等。与传统监控系统只是录像不同,Frigate 能够智能识别画面中的物体,并只在检测到感兴趣的事件时进行录像或发送通知,大大减少了存储空间和误报,同时提高了事件分析的效率。

“让你的摄像头变得更智能,只记录你真正关心的事件。”


一、Frigate 是什么?

Frigate 是一个基于 FFmpegTensorFlow 的 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

  1. 安装 Coral 驱动 (部分系统可能需要)
    通常,Linux 系统会自动识别 USB Coral。如果遇到问题,可以参考 Coral 官方文档安装 libedgetpu1-std

  2. 检查设备
    连接 Coral TPU 到 USB 3.0 端口,然后运行:

    1
    2
    lsusb # 查看 USB 设备列表,应能看到 Google Inc. 或 Global Unichip Corp.
    ls -l /dev/bus/usb/ # 查看 USB 设备文件

    你可能会看到一个类似 Bus 001 Device 002: ID 1a6e:089a Global Unichip Corp. 的设备。

PCIe Coral

  1. 安装 Coral 驱动
    PCIe Coral 需要安装驱动。请参考 Coral 官方文档
  2. 检查设备
    1
    lspci -nn | grep -i coral
    应能看到 Coral PCIe 设备。

2. 创建目录结构

通过 SSH 连接到你的服务器,创建用于 Frigate 存储配置、录像、缓存等数据的目录。

1
2
3
4
5
6
7
8
9
10
11
# 创建 Frigate 配置目录
sudo mkdir -p /mnt/data/frigate/config
sudo chmod -R 777 /mnt/data/frigate/config # 确保容器有读写权限

# 创建 Frigate 媒体存储目录
sudo mkdir -p /mnt/data/frigate/media
sudo chmod -R 777 /mnt/data/frigate/media # 确保容器有读写权限

# 如果你还有额外的用于存储录像的目录,如NAS的共享文件夹,也一并创建并设置权限
# sudo mkdir -p /mnt/your_nas_share_for_recordings
# sudo chmod -R 777 /mnt/your_nas_share_for_recordings

注意: /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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# Frigate 配置示例

# MQTT 配置 (与 Home Assistant 集成需要)
# 如果不使用 Home Assistant 或 MQTT,可以禁用或删除此部分
mqtt:
host: YOUR_MQTT_BROKER_IP # 例如 Home Assistant 的 IP
# user: mqtt_user # 如果你的 MQTT 需要认证
# password: mqtt_password # 如果你的 MQTT 需要认证
# port: 1883 # 默认端口

# TensorFlow Lite AI 模块配置
detectors:
cpu1: # 定义一个 CPU 检测器,如果你没有 Coral TPU,推理会非常慢
type: cpu
# coral_tpu: # 如果你有 Coral TPU,请取消注释并使用此配置
# type: edgetpu
# device: usb # 或 "pci" 如果是 PCIe 版本,如果只有一个 TPU 可以不指定 device

# Frigate 主配置
database:
path: /media/frigate.db # 数据库文件路径 (推荐默认,会自动挂载到持久化目录)

# 视频录制和快照等配置
record:
enabled: True # 启用录制
events:
pre_capture: 5 # 事件发生前录制 5 秒
post_capture: 5 # 事件发生后录制 5 秒
max_seconds: 300 # 最长录制 300 秒 (5分钟)
# objects: # 仅录制哪些类型的对象 (默认录制所有配置的检测对象)
# - person
# - car
retain:
default: 10 # 默认保存 10 天的录像 (按事件保留)
# days: # 也可以按天数设置 (默认按事件数量)
# default: 7
snapshots:
enabled: True # 启用快照
bounding_box: True # 快照中显示检测框
timestamp: True # 快照中显示时间戳
retain:
default: 7 # 默认保存 7 天的快照
# days:
# default: 7
object_detection:
enabled: True
# lp_detector:
# enabled: False # 是否启用车牌检测,需要额外模型
ffmpeg:
# 线程数根据你的CPU核心数调整,如果CPU性能不够,可能需要降低
# global_args: -hwaccel vaapi -hwaccel_output_format vaapi # 如果Intel CPU支持VAAPI硬件加速FFmpeg解码
output_args:
detect: -f segment -segment_times 10 -segment_format mp4 -r 10 -c:v libx264 -preset ultrafast -tune zerolatency -crf 23 -bf 0 -g 30 -sc_threshold 0 -pix_fmt yuv420p -movflags +faststart # 检测流的FFmpeg输出参数,推荐
record: -c copy -map 0:v:0 -map 0:a? -f segment -segment_times 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -ar 44100 # 录制流的FFmpeg输出参数,推荐
rtmp: -c copy -map 0:v:0 -map 0:a? -f flv # RTMP 流输出参数
# Web UI 配置
web:
port: 5000 # Web UI 端口
# password: your_password # 如果需要为Web UI设置密码

# 摄像头配置 (重点配置项)
cameras:
front_door: # 摄像头名称,唯一标识符
enabled: True
ffmpeg:
inputs:
- path: rtsp://user:password@192.168.1.100:554/stream1 # 摄像头的 RTSP 地址
roles:
- detect # 用于目标检测的视频流 (通常是低分辨率子码流,节省资源)
- record # 用于录像的视频流 (可以是高分辨率主码流)
# - path: rtsp://user:password@192.168.1.100:554/stream2 # 如果有第二个流用于 Web UI 预览
# roles:
# - rtmp # 用于 Web UI 预览的 RTMP 流
detect:
enabled: True
# 减小帧率以降低 CPU 占用,如果你没有 Coral。
# frigate默认会根据FFmpeg output的帧率进行检测。
# 如果你的RTSP流本身是30FPS,并且你想降低检测帧率,则可以在这里指定:
# fps: 5
zones: # 区域检测 (可选)
# 只在特定区域内进行检测,或者在特定区域内不检测
driveway:
coordinates: 0,0,0,1,1,1,1,0 # 定义一个多边形区域,以像素百分比表示 (左上角是0,0,右下角是1,1)
# 例如:0,0, 0.5,0, 0.5,0.5, 0,0.5 (上、右、下、左)
objects:
- person # 只在此区域检测人
objects:
track: # 跟踪的对象类型
- person
- car
- dog
- cat
filters: # 过滤条件
person:
min_area: 5000 # 最小检测面积
max_area: 1000000 # 最大检测面积
threshold: 0.7 # 置信度阈值
car:
min_area: 10000
motion:
mask: # 运动检测遮罩区域 (可选)
- 0,0,0,0.5,0.5,0.5,0.5,0 # 示例:遮蔽图像上半部分
threshold: 25 # 运动检测阈值
contour_area: 50 # 轮廓区域阈值

back_yard: # 第二个摄像头,如果需要
enabled: True
ffmpeg:
inputs:
- path: rtsp://user:password@192.168.1.101:554/H264_stream # 另一个摄像头的 RTSP 地址
roles:
- detect
- record
detect:
enabled: True
objects:
track:
- person
- car

保存并关闭文件。

配置解释:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
version: "3.8"
services:
frigate:
container_name: frigate
image: blakeblackshear/frigate:stable # 推荐使用 stable 标签
# image: blakeblackshear/frigate:0.13.0-beta # 如果你想尝试最新功能,使用特定版本

privileged: true # 必需,允许访问 /dev/dri 或 /dev/bus/usb

# 网络模式,通常 host 模式更简单,避免复杂的端口映射,且方便FFmpeg访问RTSP流
network_mode: host
# 或者用 bridge 模式,需要手动映射端口
# ports:
# - "5000:5000" # Frigate Web UI
# - "1935:1935" # RTMP 流

volumes:
- /etc/localtime:/etc/localtime:ro # 同步时区
- /mnt/data/frigate/config:/config:ro # 映射 Frigate 配置文件 (只读,避免容器修改)
- /mnt/data/frigate/media:/media # 映射录像、快照和数据库等数据 (读写)

# 如果使用 Intel 核显进行 FFmpeg 解码/编码硬件加速
# - /dev/dri:/dev/dri

# 如果使用 Coral TPU (USB 版本或 PCIe 版本通用设备映射)
# - /dev/bus/usb:/dev/bus/usb # 挂载整个 USB bus,让容器识别 Coral USB
# 如果你的Coral设备文件是固定的,可以精确映射,例如:
# - /dev/bus/usb/001/002:/dev/bus/usb/001/002 # 精确映射某个USB设备

# 如果使用 NVIDIA GPU (需要安装 NVIDIA Container Toolkit)
# devices:
# - /dev/nvidia0:/dev/nvidia0
# - /dev/nvidiactl:/dev/nvidiactl
# - /dev/nvidia-uvm:/dev/nvidia-uvm
# runtime: nvidia

environment:
# 在某些系统上,PUID/PGID 可能有助于文件权限
# - PUID=1000
# - PGID=100
# 更多环境变量可参考 Frigate 文档,例如:
# - FRIGATE_ENV_VAR=value

# 设定 CPU 核心和内存限制,防止占用过多资源
# deploy:
# resources:
# limits:
# cpus: '3.0' # 限制为3个CPU核心
# memory: 4G # 限制为4GB内存

restart: unless-stopped # 容器崩溃或服务器重启后自动重启

配置解释:

  • 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 目录映射为容器内部的 /configro 表示只读,这意味着 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
2
sudo docker ps -a | grep frigate
sudo docker logs -f frigate # 查看实时日志,检查是否有错误,特别是关于FFmpeg和Coral TPU的

在日志中,你应该能看到 FFmpeg 启动、摄像头流接收以及 Coral TPU 初始化成功的消息。

7. 访问 Frigate Web UI

打开你的浏览器,访问 http://你的服务器IP:5000

你将看到 Frigate 的 Web UI 界面。

  • Live 页面,你应该能看到你的摄像头实时画面。
  • Events 页面,当 Frigate 检测到配置的对象时,会生成事件和快照。
  • Configuration 页面,你可以查看当前的配置(只读)。

五、与 Home Assistant 集成(推荐)

Frigate 与 Home Assistant 官方集成,可以极大扩展其功能。

  1. 确保你的 Home Assistant 和 Frigate 都在同一个网络中,且 MQTT 服务已运行并配置在 Frigate 的 config.yml 中。
  2. 在 Home Assistant 中,进入 设置 -> 设备与服务 -> 添加集成
  3. 搜索 Frigate
  4. Home Assistant 会尝试自动发现 Frigate。如果发现失败,你可能需要手动输入 Frigate 的 IP 地址。
  5. 通过集成,Home Assistant 会自动创建各种 Frigate 实体,包括:
    • binary_sensor:每次检测到对象时触发。
    • media_player:用于查看摄像头直播流。
    • camera:用于查看录像、快照。
    • sensor:显示当前在线人数、车辆数等。
  6. 你可以利用这些实体在 Home Assistant 中创建强大的自动化,例如:
    • 当 Frigate 检测到 person 时,触发智能灯光亮起。
    • 当 Frigate 检测到 car 且是夜间时,发送包含快照的通知到手机。
    • 结合门窗传感器,只有在门窗打开时才检测特定区域等。

六、高级配置与优化

1. FFmpeg 硬件加速

如果你的服务器 CPU 是 Intel (带核显),强烈建议开启 FFmpeg 的硬件解码/编码,可以大幅降低 CPU 占用。

  1. 宿主机驱动:确保你的 Linux 系统已安装 Intel 显卡的 VA-API 驱动。
  2. Docker Compose:在 volumes 中添加 - /dev/dri:/dev/dri
  3. Frigate config.yml
    ffmpeg 部分的 global_args 中添加:
    1
    2
    ffmpeg:
    global_args: -hwaccel vaapi -hwaccel_output_format vaapi
    并调整 output_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.ymlvolumes 部分添加:

1
2
3
4
5
6
volumes:
# ... 其他 volumes
- type: tmpfs # 内存磁盘
target: /tmp/cache
tmpfs:
size: 1g # 设定为1GB,根据你的内存和摄像头数量调整

3. 多路 Coral TPU

如果你有多个 Coral TPU,可以在 config.ymldetectors 部分定义多个 edgetpu 检测器,并为每个摄像头指定使用哪个 TPU。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
detectors:
coral_tpu_0:
type: edgetpu
device: usb:0 # 引用第一个 USB Coral
coral_tpu_1:
type: edgetpu
device: usb:1 # 引用第二个 USB Coral

cameras:
front_door:
detector: coral_tpu_0 # 指定使用哪个检测器
# ...
back_yard:
detector: coral_tpu_1 # 指定使用哪个检测器
# ...

4. 远程存储

Frigate 可以配置将录像和快照存储到远程位置(如网络共享、S3 存储桶)。这需要更复杂的配置和额外的工具(如 rclone)。

5. 自定义 AI 模型

Frigate 允许你使用自定义的 TensorFlow Lite 模型,来识别更多类型的物体或优化现有物体识别性能。这需要具备一定的 AI 模型训练和转换知识。

七、总结

Frigate 是一个革命性的本地视频监控解决方案,它将 AI 驱动的目标检测带入了家庭和小型办公室场景。通过智能识别和事件驱动的录制,它解决了传统监控系统在误报、存储空间和事件查找方面的痛点。配合 Google Coral TPU,Frigate 能够提供高性能的实时检测,并与 Home Assistant 无缝集成,开启无限自动化可能。

虽然部署 Frigate 需要一些 Docker 和 YAML 配置的知识,但一旦配置完成,它将大大提升你的监控体验,让你的智能家居系统真正“智能”起来。强烈推荐给所有希望升级自己视频监控系统的用户!