本帖最后由 gasment 于 2025-5-20 11:39 编辑
我使用frigate 做nvr(网络录像机)来替代群晖的Surveillance Station已有半年,
期间尝试过的方案也不少,踩坑也不少,从单纯的录像,到HA联动,到人在检测,
现在已达成一套比较稳定的方案,可以拿出来供大家参考了
需要注意,frigate并不是一个轻量级的应用,要实现比较理想的运行效果,平台需要一定的性能,
(推荐为4核心带GPU的处理器,8G以上内存)
如果你只是需要一个简单的NVR,frigate并不适合你
那frigate可以做什么呢?
1、传统NVR 24x7监控录制,多种回看模式
2、基于本地特化AI模型推理的的对象识别
3、联动homeassistant,拓展为各类传感器
···
frigate(0.15.1)目前缺点:
1、没有移动端app,移动端浏览器回看操作不方便
2、资源占用比较大
3、没有汉化界面
···
看完以上,对部署frigate有兴趣的,可以进入正文了:
本文目录:
一、设备选型
二、frigate容器搭建参考
三、frigate配置参考
四、联动HA
五、其他问题
一、设备选型参考
先说明下几个会提到的术语:
- 编解码:frigate需要解码视频流才可以进行后续处理,而编码是可选的(在保存视频格式不符需求时使用),编解码是资源密集型任务,需要占用一定性能
- 推理:frigate对象识别需要根据不同的模型进行推理识别,其单帧耗时为推理速度,推理速度跟模型参数量和处理的硬件水平有关,以官方推荐的Coral TPU为例子,其典型推理速为10ms,每秒可处理1000/10=100帧画面,再多就会丢失部分检测或排队阻塞,官方推荐每个视频流检测帧数为5,也就是最大可能接入20个视频流
- 模型:模型的类型与frigate检测器相关,模型有参数量大小之分,参数量大的模型,识别越精确,代价是推理速度的相应增加,比如yolo_nas模型分yolo_nas_s/m/l 三种
目前实践过的设备方案情况(功耗不含硬盘): G4560(双核四线程)+ iGPU编解码+iGPU推理,平台功耗20~30W - OpenVino/ssdlite_mobilenet_v2模型推理速度:10-20ms,CPU平均占用50%,峰值70%;
- OpenVino/yolo_nas_s模型推理速度:20-30ms,CPU平均占用60%,峰值80%;
G4560(双核四线程)+ iGPU编解码+Coral推理,平台功耗20~30W - TensorFlow Lite模型推理速度:<10ms,CPU平均占用50%,峰值70%
I3-8100T(四核四线程)+ iGPU编解码+iGPU推理,平台功耗20~30W - OpenVino/ssdlite_mobilenet_v2模型推理速度:10-20ms,CPU平均占用30%,峰值50%;
- OpenVino/yolo_nas_s模型推理速度:20-30ms,CPU平均占用40%,峰值70%;
I3-8100T(四核四线程)+ iGPU编解码+Coral推理,平台功耗20~30W - TensorFlow Lite模型推理速度:<10ms,CPU平均占用30%,峰值50%
I3-8100T(四核四线程)+ nvidia T600编解码+nvidia T600推理,单显卡功耗20-30W - yolov7-320模型推理速度:20-30ms,CPU平均占用20%,峰值40%
N100(四核四线程)+iGPU编解码+iGPU推理,平台功耗10~20W - OpenVino/ssdlite_mobilenet_v2模型推理速度:10-20ms,CPU平均占用30%,峰值50%;
RK3588(八核ARM) + VPU编解码+NPU推理,平台功耗5~8W - rknn/yolo_nas_s模型推理速度:30-40ms,CPU平均占用30%,峰值50%;
- rknn/yolo_nas_m模型推理速度:40-50ms,CPU平均占用30%,峰值50%;
总结参考: 性价比之选: intel 4核,6代及以上CPU + 8G及以上内存+OpenVino/ssdlite_mobilenet_v2模型 一个CPU即可包揽编解码和检测,而且与大部分人在用的设备重合度高,基本不用新增额外设备即可食用,缺点是模型识别精度较低; intel 6核以上,可以使用yolo_nas模型,提高识别精度同时降低CPU整体占用
锦上添花之选: 如果你有大量摄像头需要跑检测,而且对识别精度有一定要求,可以在性价比之选上,额外增加一个Coral TPU Coral推荐买M.2接口的,实测群晖、飞牛OS都可以编译驱动,威联通官方有这玩意,但是注意适配机型 M.2接口版本市场价300左右,USB版无需驱动,兼容性更强,但是贵了1倍多,不是很推荐
不差钱之选: 4核以上CPU + 8G及以上内存 + NVIDIA (RTX)显卡 + yolov模型 各项性能都可以,就是功耗不行,性价比低,不差钱或者有其他用途的可以考虑下
极致低功耗之选: RK3588 + 8G及以上内存 +yolo_nas_s/m模型 一个芯片同时具备编解码的VPU和推理的NPU,整合度很高,跑yolo_nas_m模型大概可同时检测5-7条视频流 不含硬盘时极致低功耗,日常运行5-7W ! 缺点是RK3588整机略贵,8G版市场价600~800,16G价格起飞,8G基本跑了frigate就干不了其他事了,属于专机专用
- PS:A卡/APU也可以跑,官方文档也有提到,具体情况我没硬件测试不了
监控摄像头输入:
每个摄像头提供至少一条RTSP协议视频流即可,视频格式最好调整为H264或H265,音频为ACC,其他格式则需要额外重编码;
如果同时有最低720P的5FPS的子码流最好
docker容器统一使用docker-compose部署,怎么玩docker-compose就不讨论了,可以自行学习 frigate的web默认端口为5000和8971,5000无密码,注意保护,8971为有密码的https
方案1:Intel CPU+ iGPU编解码+iGPU或Coral推理 注意#号后注释说明!
version: "3.9"
services:
frigate:
container_name: frigate
privileged: true # 使用特权模式
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:0.15.1
shm_size: "512mb" # 这个根据视频流数量来定,我这边7条流
devices:
- /dev/dri/renderD128:/dev/dri/renderD128 # GPU透传
#- /dev/apex_0:/dev/apex_0 #使用Coral推理,请取消#注释
volumes:
- /etc/localtime:/etc/localtime:ro
- /volume1/docker/frigate/config:/config #配置存放目录,请修改
- /volume4/NVR/frigate:/media/frigate #录像存放目录,请修改
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "1984:1984" # go2rtc web
- "8971:8971"
- "5000:5000" # 群晖会冲突,修改为其他如5555:5000
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: "passwd"
方案2:NVIDIA (RTX)显卡编解码+NVIDIA (RTX)显卡推理,容器首次启动会比较耗时,需要等待模型构建完成
version: "3.9"
services:
frigate:
container_name: frigate
privileged: true # 使用特权模式
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:0.15.1-tensorrt #使用特定镜像
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
shm_size: "512mb" # 这个根据视频流数量来定,我这边7条流
volumes:
- /etc/localtime:/etc/localtime:ro
- /volume1/docker/frigate/config:/config #配置存放目录,请修改
- /volume4/NVR/frigate:/media/frigate #录像存放目录,请修改
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "1984:1984" # go2rtc web
- "8971:8971"
- "5000:5000" # 群晖会冲突,修改为其他如5555:5000
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: "passwd"
方案3:rockchip平台,由于frigate-rk镜像带的go2rtc无法调用rk的硬件编解码加速,这里需要另起一个go2rtc容器来处理前期的转码工作 排版可能有问题,可下载yaml文件: 注意#号后注释说明!
services:
go2rtc:
container_name: go2rtc
image: alexxit/go2rtc:master-rockchip #使用特定镜像
network_mode: bridge
ports:
- 11984:1984
- 18554:8554
- 18555:8555 #端口需与frigate错开
privileged: true # 使用特权模式
restart: unless-stopped
environment:
- TZ=Atlantic/Shanghai
volumes:
- "/mnt/docker-data/go2rtc:/config" #配置存放目录,请修改
version: "3.9"
services:
frigate:
container_name: frigate
privileged: true # 使用特权模式
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:0.15.1-rk #使用特定镜像
shm_size: "512mb" # 这个根据视频流数量来定,我这边7条流
volumes:
- /etc/localtime:/etc/localtime:ro
- /volume1/docker/frigate/config:/config #配置存放目录,请修改
- /volume4/NVR/frigate:/media/frigate #录像存放目录,请修改
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "1984:1984" # go2rtc web
- "8971:8971"
- "5000:5000"
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: "passwd"
三、frigate配置参考
frigate的大部分设置由一个config文件来配置,在web配置的功能比较少,这也是上手难度比较大的原因
进入frigate web->Config Editor进行在线编辑,以下提供的配置参考,请按顺序逐项添加
由于yaml对缩进格式要求严格,如有排版错误,可下载完整配置,逐项对比修改:
注意#号后注释说明!
1、mqtt配置:
version: 0.15-1
mqtt:
enabled: true #如有mqtt服务器,请改为true,否则false
host: 192.168.32.26 #mqtt服务器ip、用户名、密码
user:
password:
2、go2rtc配置
使用go2rtc前,请在go2rtc的web页(frigate ip + 1984端口)-> add ->ffmpeg hardware 处确认是否有"OK"状态的编解码器
go2rtc:
streams:
main-door-right: #摄像头名称,爱自己喜好修改
- rtsp://视频流地址 #主码流地址
- "ffmpeg:main-door-right#audio=acc" #启用重新编码音频为ACC
- "ffmpeg:main-door-right#video=h264#audio=acc#hardware" #启用重新编码视频为为H264,音频ACC,启用硬件加速
#rk3588请勿使用以上转码参数,如需转码,请按docker容器部署方法,部署专用go2rtc容器
main-door-right-sub: #摄像头子码流名称(如有)
- rtsp://视频流地址 #子码流地址
streams:
main-door-right: #摄像头名称,爱自己喜好修改
- ffmpeg:rtsp://视频流地址#video=copy#audio=aac#hardware=rkmpp #启用重新编码音频为ACC
main-door-right: #摄像头名称,爱自己喜好修改
- ffmpeg:rtsp://视频流地址#video=h264#audio=aac#hardware=rkmpp #启用重新编码视频为为H264,音频ACC,启用硬件加速
然后frigate中的视频流连接修改为外部专用go2rtc重编码的连接
go2rtc:
streams:
main-door-right: #摄像头名称,爱自己喜好修改
- rtsp://专用go2rtc所在ip:18554/cam-name
3、ffmpeg全局预设(选其一)
ffmpeg:
hwaccel_args: preset-vaapi #intel/amd
hwaccel_args: preset-nvidia #nvidia
hwaccel_args: preset-rk-h265 #rk3588
#rk也有preset-rk-h264,如果你的视频流混杂h265和h264,可以在h264的摄像头字段下另起“hwaccel_args: preset-rk-h264”,后文提及
4、摄像头全局配置
全局配置可以简化一些重复的摄像头配置,如果有不一样的,可以在后面对应的字段修改,字段配置优先级比全局高
detect: #统一检测帧规格为720p 5fps
enabled: true
width: 1280
height: 720
#分辨率不是越大越好,需要根据检测物体的尺寸在画面中的比例来确定,详情见 #https://docs.frigate.video/frigate/camera_setup#choosing-a-detect-resolution
fps: 5
#5fps为官方推荐制,对于快速运动的画面,可以稍作调高,最高不要高于10
objects:
track: #需要跟踪检测的对象类型
- person
- bicycle
- car
- motorcycle
- cat
- dog
record: #录制时长,我这里是全时录制,保存18天
enabled: true
retain:
days: 18
mode: all
alerts: #告警片段也保存18天,基于运动检测的保留
retain:
days: 18
mode: motion
5、检测模型配置 - coral pcie (intel/amd) (容器自带模型)
detectors:
coral:
type: edgetpu
device: pci
#无需配置model
- openvino/ssdlite_mobilenet_v2 (intel)(容器自带模型)
detectors:
ov:
ype: openvino
device: GPU
model:
width: 300
height: 300
input_tensor: nhwc
input_pixel_format: bgr
path: /openvino-model/ssdlite_mobilenet_v2.xml
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
- openvino/yolonas (intel)(需要自行构建)
(页面有一个google colab的连接,进入该连接,逐条执行写好的python命令,之后就可以下载得到预训练的模型)
detectors:
ov:
type: openvino
device: GPU
model:
model_type: yolonas
width: 320
height: 320
input_tensor: nchw
input_pixel_format: bgr
path: /config/yolo_nas_s.onnx #将模型放入此路径
labelmap_path: /labelmap/coco-80.txt
- tensorrt-yolov7 (nvidia) (需要本地构建)
此模型需要本机在线构建,网络不好容易构建失败(最好有科学上网)
detectors:
tensorrt:
type: tensorrt
device: 0
model:
path: /config/model_cache/tensorrt/yolov7-320.trt
labelmap_path: /labelmap/coco-80.txt
input_tensor: nchw
input_pixel_format: rgb
width: 320
height: 320
- rknn/yolonas (rk3588) (容器模型自带)
detectors:
rknn:
type: rknn
num_cores: 3 #启用全部3个npu
model:
path: deci-fp16-yolonas_s
#以下模型可选:
#deci-fp16-yolonas_s
#deci-fp16-yolonas_m
#deci-fp16-yolonas_l
#可以自建模型,存放路径:
#/config/model_cache/your_custom_model.rknn
width: 320
height: 320
input_pixel_format: bgr
input_tensor: nhwc
labelmap_path: /labelmap/coco-80.txt
6、摄像头配置 示例为单个摄像头,多个摄像头就按格式新建多个字段即可
cameras:
main-door-right: #摄像头名称,与go2rtc中配置的一致
ffmpeg:
hwaccel_args: preset-rk-h265 #ffmpeg预设,根据视频流格式来定,如preset-vaapi、preset-nvidia、preset-rk-h264
output_args:
record: preset-record-generic-audio-copy
#音频保存格式,目前15.1正式版本还是不支持acc外的音频格式(测试版16已支持)
#官方预设preset-record-generic-audio-aac会导致录制视频没有音频流,需要在go2rtc中预先转码,然后使用copy参数
inputs:
- path: rtsp://127.0.0.1:8554/main-door-right #本地go2rtc-rtsp复用,对应你的摄像头名称
roles:
- record #摄像头功能:开启录制
- detect #摄像头功能:开启检测
onvif: #支持onvif和云台功能的摄像头可以配置云台功能
host: 192.168.x.x
port: 80
user: admin
password: admin
main-door-left: #配置第二个摄像头
如果有全局配置中不适用的小项,可以在ffmpeg同层级添加对应的配置,这里的配置优先级比全局高,如修改不同于全局的单个摄像头录制保留时间:
cameras:
main-door-right:
ffmpeg:
hwaccel_args: preset-rk-h264
output_args:
---
inputs:
---
onvif:
---
detect:
enabled: false
record: #录制时长,我这里是全时录制,保存18天
enabled: true
retain:
days: 7
mode: all
alerts: #告警片段也保存18天,基于运动检测的保留
retain:
days: 7
mode: motion
main-door-left: #配置第二个摄像头
7、按顺序完成以上配置后,重启frigate,观察frigate web上的日志是否有报错或警告 8、web相关配置 - 进入frigate的5000端口web管理页,进入setting->UI Settings->First Weekday,这里可改成monday
- 进入Users,新建一个用户,用于8971端口登录,可以删掉原有的admin用户
- 进入Masks / Zones,配置某个摄像头的区域:
- zones:为检测区域,比如想检测人在,就框起来一个区域,Objects选person
- Motion Masks:运动遮罩区域,用于排除一些固定存在的元素,比如摄像头带的水印、OSD时间戳等,区域大小不要过大,不要滥用Motion Masks来限制检测,会造成对象跟踪困难
- Object Masks:对象遮罩,用于排除一些固定的误报区域,比如风吹动的树,固定停放的车等
- 进入Motion Tuner,可以调整触发运动检测的阈值,可以使用隔壁的debug画面来调试
- 完成以上,记得重启frigate容器
9、摄像头补充配置(review/snapshots)
cameras:
main-door-right:
ffmpeg:
---
onvif:
---
zones:
---
motion:
---
review: #回放页面
alerts: #告警片段仅记录特定区域中的特定对象
required_zones:
- zones-name
labels:
- person
snapshots: #快照仅记录特定区域
required_zones:
- zones-name
四、联动homeassistant HACS商店直接搜索frigate安装集成即可,接入后就有很丰富的实体,这是最简单直接的方法 需要搭建MQTT服务器,比如EMQX,在frigate配置中配置mqtt参数后,其他mqtt客户端就可以订阅相关主题,自动化可以配合nodered食用 https://docs.frigate.video/integrations/mqtt 使用http get/post等协议来获取一些数据,或者控制一些参数 https://docs.frigate.video/integrations/api/frigate-http-api 官方的Advanced Camera Card功能太杂,我用的WebRTC Camera集成,配置集成连接frigate的go2rtc端口1984即可 卡片模板:
type: custom:webrtc-camera
url: #在go2rtc中配置的摄像头名字,如main-door-right
五、其他问题 1、如果你的视频流是h265,需要使用支持HEVC的浏览器才可以正常预览视频 - windows10及以上可以安装HEVC Video Extensions扩展+EDGE/Chrome浏览器
- linux(debian/ubuntu等)可以使用Chromium浏览器,配合启动参数:
--enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder
我在debian12+kde桌面环境上测试成功 手机iOS使用Safari、edge等都可,安卓我使用小米自带浏览器也可 2、检查rk3588 NPU的使用率(这个功能在下个大版本16.x会集成到web)
cat /sys/kernel/debug/rknpu/load
NPU load: Core0: 0%, Core1: 0%, Core2: 0%
3、群晖、飞牛OS使用N卡,安装商店提供的驱动即可 4、群晖、飞牛OS使用coral TPU(pcie),需要编译驱动文件,加载后才可使用
|