共计 2562 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
传统监控系统往往存在几个明显短板:

- 功能单一:多数仅支持基础录像和移动侦测,缺乏真正的 AI 分析能力
- 封闭生态:厂商锁定严重,难以集成自定义算法
- 高成本:专业 NVR 设备价格昂贵,且扩展性差
Frigate 作为开源解决方案脱颖而出,其核心优势在于:
- 实时对象检测:内置 TensorFlow Lite,支持人 / 车 / 宠物等常见目标识别
- 轻量级架构:基于 Python 开发,资源占用远低于商业方案
- 完美 Docker 化:一键部署,支持 GPU 加速
- 开放 API:方便二次开发和算法替换
技术选型对比
横向对比主流开源监控方案:
| 特性 | Frigate | ZoneMinder | Shinobi |
|---|---|---|---|
| AI 检测 | ✅内置 | ❌需插件 | ❌需插件 |
| Docker 支持 | ✅原生 | ⚠️社区版 | ✅官方 |
| 硬件加速 | ✅NVENC | ❌ | ✅FFmpeg |
| 配置复杂度 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 移动端支持 | ✅ | ⚠️ | ✅ |
特别适合选择 Frigate 的场景:
- 需要快速验证 AI 监控原型
- 已有 RTSP/ONVIF 摄像头
- 希望使用消费级硬件(如 Intel NUC)
核心实现细节
基础环境准备
- 安装 Docker 及 Docker Compose(所有命令以 Ubuntu 为例)
sudo apt update && sudo apt install -y docker.io docker-compose
sudo usermod -aG docker $USER
- 创建项目目录结构
mkdir -p frigate/config
cd frigate
关键配置文件
config/config.yml示例(重点参数说明):
mqtt:
host: 192.168.1.100 # MQTT 服务器地址(可选)detectors:
coral: # 使用 Google Coral 加速
type: edgetpu
device: usb
cameras:
living_room: # 摄像头自定义名称
ffmpeg:
inputs:
- path: rtsp://admin:password@192.168.1.50:554/stream1
roles: [detect] # 主检测流
- path: rtsp://admin:password@192.168.1.50:554/stream2
roles: [record] # 高分辨率录制流
detect:
width: 1280
height: 720
fps: 5
容器部署
docker-compose.yml标准模板:
version: "3.9"
services:
frigate:
container_name: frigate
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "64mb" # 共享内存大小
devices:
- /dev/bus/usb:/dev/bus/usb # Coral USB 设备映射
volumes:
- /etc/localtime:/etc/localtime:ro
- ./config:/config
- /media/frigate:/media/frigate # 录像存储
ports:
- "5000:5000" # Web 界面
- "1935:1935" # RTMP 流
environment:
FRIGATE_RTSP_PASSWORD: "your_password"
restart: unless-stopped
启动命令:
docker-compose up -d
自定义算法集成
替换默认检测模型
-
准备自定义 TensorFlow Lite 模型(需满足输入输出格式要求)
-
修改配置中的模型路径:
detectors:
custom:
type: tflite
model:
path: /config/custom_model.tflite
labelmap: /config/custom_labels.txt
通过 API 扩展检测逻辑
Python 示例代码(需配合 Frigate 的 MQTT 事件):
import paho.mqtt.client as mqtt
def on_message(client, userdata, message):
payload = json.loads(message.payload)
if payload["type"] == "new":
print(f"检测到 {payload['label']} 在 {payload['camera']}")
# 可添加自定义处理逻辑
client = mqtt.Client()
client.connect("localhost")
client.subscribe("frigate/events")
client.on_message = on_message
client.loop_forever()
性能优化建议
-
视频流优化
-
为检测单独配置低分辨率子码流(如 640×360)
-
设置合理的 FPS(通常 5 -10 帧足够)
-
硬件加速方案
| 设备类型 | 配置示例 | 检测速度 |
|---|---|---|
| CPU | Intel i5-1135G7 | 80ms |
| Coral USB | EdgeTPU | 10ms |
| GPU | NVIDIA Jetson Nano(TensorRT) | 30ms |
- 存储策略
record:
enabled: True
retain:
days: 7
mode: motion # 仅保存有事件的录像
常见问题解决
摄像头连接失败
- 确认 RTSP URL 格式正确(可用 VLC 测试)
- 检查防火墙是否放行 554 端口
高 CPU 占用
- 降低检测分辨率
- 使用
ffmpeg参数跳过 B 帧解码:
ffmpeg:
input_args: -avoid_negative_ts make_zero -fflags nobuffer -flags low_delay -strict experimental -fflags +genpts+discardcorrupt
模型误检率高
- 收集场景样本进行模型微调
- 调整检测阈值:
detect:
threshold: 0.7 # 默认 0.5
安全注意事项
-
网络隔离
-
将摄像头划入单独 VLAN
-
禁用 UPnP 协议
-
访问控制
-
修改默认 API 密钥
-
启用 HTTPS(通过 Nginx 反向代理)
-
固件更新
-
定期检查摄像头厂商安全补丁
实践建议
建议从单摄像头开始验证基础功能,逐步扩展。遇到问题时可以:
- 检查 Frigate 日志:
docker logs frigate - 在 Github Issues 搜索相似问题
- 加入 Frigate 官方 Discord 社区
期待大家在评论区分享自己的配置技巧和优化方案!特别欢迎以下经验:
- 在树莓派上的部署心得
- 自定义模型训练过程
- 多摄像头集群管理方案
正文完
