『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1124|回复: 20

[经验分享] 一个在pve lxc中跑frigate+核显加速的详细指南

[复制链接]

13

主题

49

帖子

430

积分

论坛分享达人

积分
430
金钱
381
HASS币
0
发表于 2024-10-21 16:52:44 | 显示全部楼层 |阅读模式
本帖最后由 gasment 于 2024-10-21 16:59 编辑

先看效果:
i5-8600 UHD630
4条2k 25fps流全时录制,4条720p 6fps流检测
平均cpu占用10%-15%,gpu占用5%内(触发检测达到10%左右),检测延迟在10ms内


需要的硬件配置:
1、推荐分配4核CPU
2、intel HD6xx 以上核显
      - 核显加速可用于视频编解码和对象识别,但是移动侦测主要还是在cpu,cpu识别出具有移动像素的帧喂给GPU跑模型做对象识别,因此无论如何CPU算力还是要吃一些的
        官方说法:https://docs.frigate.video/friga ... or-for-eli5-version
3、至少分配2GB内存

4、支持onvif/rtsp流的摄像头,支持多条码流,支持自定义流格式(海康大华的枪机、球机、室内机等,那种不开放协议的“智能摄像头”不合适)      
5、此文用途是使用frigate替代传统nvr,未涉及ha联动的玩法

需要的软件配置:
1、PVE 8 以上版本


一、部署lxc容器环境
1、下载使用alpine-3.18的ct模板,按常规部署好CT容器
    注意事项:
  •     无特权容器:否
  •     勾选嵌套、FUSE
  •     在对应id的/etc/pve/lxc/xxx.conf添加:
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
  • ls /dev/dri,检查内容
        在CT资源页添加device passthrough,添加/dev/dri/cardX和/dev/dri/renderD128  (cardX中的X根据 ls /dev/dri的结果修改,可能为0也可能为1)
  • (可选)挂载PVE 宿主目录来存放录制视频
        使用命令:pct set 容器id -mp0 (pve宿主路径),mp=(容器内路径)
        例如:pct set 100 -mp0 /mnt/pve/video,mp=/mnt/video

2、打开ct,检查ct内/dev/dri是否有对应内容


二、安装docker
全程使用命令行,可以在pve控制台,也可以安装ssh服务器
1、安装ssh服务器
  • 替换国内源:
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
apk update  
  • 安装时区设置:
apk add tzdata 
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
  • 清除缓存:
apk del tzdata
rm -rf /var/cache/apk/*
                 检查时间:date
  • 安装openssh:
apk add openssh
  • 激活ssh服务:
rc-update add sshd
  • 设置允许root登录:
nano /etc/ssh/sshd_config       #提示没有nano就安装一个: apk add nano
           将PermitRootLogin一行取消#号注释,并修改为PermitRootLogin yes,按ctrl+x,再按y保存退出
  • 启动ssh服务:
service sshd start
           使用你喜欢的ssh客户端连接

2、安装docker
  • 安装执行:
apk add docker
  • 安装完清理缓存:
rm -rf /var/cache/apk/*
  • 设置开机启动:
rc-update add docker boot
  • 手动启动:
service docker start          #可能会报错permission denied (are you root?)之类,不必理会
  • 检查状态:
 docker info    ### 注意检查:Storage Driver是否为overlay2
  • 安装docker-compose:
 apk add docker-compose
  • 检查版本:
docker-compose -v
  • 跑个镜像验证下:
docker run hello-world
              看到Hello from Docker!表明docker正常运行


三、部署frigate
1、创建两个文件夹:config和video
    config用于存放frigate配置,video存放录制文件

2、在config同级目录创建docker-compose.yaml文件:
nano docker-compose.yaml
  • 文件内容如下,注意解读备注信息,修改完按ctrl+x,再按y保存退出
version: "3.9"
services:
  frigate:
    container_name: frigate
    privileged: true # 使用特权模式
    restart: unless-stopped
    image: ghcr.io/blakeblackshear/frigate:stable
    shm_size: "256mb" # 这个根据摄像头数量来定,我这边4个,其实128mb就足够了
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128  # GPU透传
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /root/frigate/config:/config       # 冒号前替换为你自己的本地config文件夹路径
      - /mnt/frigate_storage:/media/frigate # 冒号前替换为你自己的本地用于存放录像的文件夹路径
      - type: tmpfs
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - "8971:8971"
      - "5000:5000" # Internal unauthenticated access. Expose carefully.
      - "8554:8554" # RTSP feeds
      - "8555:8555/tcp" # WebRTC over tcp
      - "8555:8555/udp" # WebRTC over udp
    environment:
      FRIGATE_RTSP_PASSWORD: "passwd"


3、cd到docker-compose.yaml所在目录,执行:
docker-compose up -d
      稍等片刻,进入lxc的ip:5000端口,应该就可以进入frigate的web页面了


四、配置frigate
1、配置摄像头流参数,尽量贴合frigate,减少处理环节,节省资源
    我使用的是海康的DS-2CD3T系列
    登录摄像头web,配置->音视频:
    主码流为复合流,最高分辨率,最高帧率,H265
    子码流为复合流,720p,帧率6,H265
    音频流,acc编码

2、配置frigate config
    可以在web页面设置->configuration editor编辑,那里有语法格式检查
    以下内容建议逐项添加后保存,方便检查语法(yaml对缩进格式要求严格,注意检查编辑)

  • (可选)配置mqtt,我没联动ha,就不配置mqtt,有需要的可以自行学习
version: 0.14
mqtt:
     enabled: false
  • 配置go2rtc,go2rtc可以流复用,减少摄像头带宽占用,提升回放质量

          这里是海康的rtsp流格式,admin:xxxxx为摄像头web的用户名与密码,后面接摄像头ip+554端口
          101为主码流,102为子码流
          这里主码流用作全时录制,子码流用作对象检测(越高分辨率流检测压力越大)
          不同品牌的流格式不同,可以自行查找,将得到的流地址放进potplayer播放,来验证流可用性和视频格式
go2rtc:
    streams:
         cam-1:  #摄像头名称,起一个自己喜欢的
             - rtsp://admin:[email protected]:554/Streaming/Channels/101    #2k主码流
         cam-2:
             - rtsp://admin:[email protected]:554/Streaming/Channels/101    #2k主码流

         cam-1-sub:
              - rtsp://admin:[email protected]:554/Streaming/Channels/102    #720P子码流
         cam-2-sub:
              - rtsp://admin:[email protected]:554/Streaming/Channels/102    #720P子码流

  • 配置对象检测器,核显目前能跑openvino,效率还算可以
detectors:
  ov:
    type: openvino
    device: GPU
detect:
  width: 1280
  height: 720
  fps: 6
  enabled: true
  #分辨率和帧率按你自己的子码流来
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


  • 配置视频录制规则与编解码GPU加速
ffmpeg:
  hwaccel_args: preset-vaapi
   #硬件加速参数,玩过emby/jellyfin的应该知道vaapi是什么了
objects:
  track:
    - person
    - bicycle
    - car
    - motorcycle
    - cat
    - dog
    - tree
     #对象识别的类型
record:
  enabled: true
  retain:
    days: 7
    mode: all
    #启用全时录像,保留7天
  events:
    retain:
      default: 14
      mode: active_objects
       #事件触发的录像片段保留14天
    pre_capture: 15
    post_capture: 15
    #事件录像片段裁切包含前15s和后15s


  • 配置摄像头角色,角色有3,record用于录制,detect用于对象检测,audio用于声音检测
cameras:
  cam-1: #摄像头名字,与在go2rtc中设置的一致
    ffmpeg:
      output_args:
        record: preset-record-generic-audio-copy
      inputs:
        - path: rtsp://127.0.0.1:8554/cam-1  #cam-1要与go2rtc中配置的摄像头名称对应
          input_args: preset-rtsp-generic
          roles:
            - record   #取主码流做录制
        - path: rtsp://127.0.0.1:8554/cam-1-sub
          input_args: preset-rtsp-generic
          roles:
            - detect  #取子码流做检测

  cam-2:
    ffmpeg:
      output_args:
        record: preset-record-generic-audio-copy
      inputs:
        - path: rtsp://127.0.0.1:8554/cam-2
          input_args: preset-rtsp-generic
          roles:
            - record
        - path: rtsp://127.0.0.1:8554/cam-2-sub
          input_args: preset-rtsp-generic
          roles:
            - detect


        还需要配置检测区域zones,zones使用web页面配置更方便,不在config里写
        更多摄像头按以上格式逐个添加即可

  • 完整yaml配置: frigate_config.yaml (2.14 KB, 下载次数: 16)
       以上配置设置为全局参数,仅针对所用摄像头输出参数一致的情况,如果你的摄像头参数不一,可以在cameras字段下对应的摄         像头input/output参数添加针对特定摄像头的args,比如分辨率和帧率,音频流视频流格式等,详情参考官方文档


3、保存并重启frigate,如无意外,容器启动后可以在web页左下角看到intel GPU的使用率      system metrics 中也可以看到GPU Usage intel-vaapi 使用率
        (可选)使用intel性能工具查看更具体的使用率
          宿主机,也就是pve,安装intel-gpu-tools: apt install intel-gpu-tools
          运行:intel_gpu_top
          可以看到ffmpeg和frigate.detecto进程,表明正在利用核显加速(多少个摄像头就有多少个ffmpeg进程)
   
   3-1 如有意外,firgate容器不断重启,先检查日志:docker logs frigate
          翻查日志,看看是否有【[GPU] Context was not initialized for 0 device】这个报错
          如果有,参考以下方法:
          这个是pve内核问题,需要升级到6.8.8版本(pve8.2.2)
          先看一下当前版本内核:uname -r
          搜索下当前可用的内核版本:apt search proxmox-kernel
          截稿最新为proxmox-kernel-6.8.8-4-pve
          如果搜不到,需要给pve换源,这个网上很多了,不赘述
          直接apt install 最新版即可,重启再次uname -r检查
          启动frigate,应该可以正常运行了
   
   3-2 调整检测区域和检测灵敏度         直接在web页->settings->masks/zones和motion tunner设置即可

其他等待补充。。。。。



评分

参与人数 4金钱 +35 收起 理由
Aureliano- + 5 高手,这是高手!
xyz5378 + 10 马克一下,之前ha安装的套件一直占用率太高.
DDDear + 10 高手,这是高手!
firewater + 10 论坛有你更精彩!

查看全部评分

回复

使用道具 举报

0

主题

77

帖子

1971

积分

金牌会员

Rank: 6Rank: 6

积分
1971
金钱
1894
HASS币
0
发表于 2024-10-22 00:59:22 | 显示全部楼层
感谢:在提高性能给我很大启发
- 复用rstp 通过go2rtc走8554端口生成可复用的rtsp链接
- 分开检测流跟录制流
回复

使用道具 举报

0

主题

1

帖子

28

积分

新手上路

Rank: 1

积分
28
金钱
27
HASS币
0
发表于 2024-10-22 02:54:07 | 显示全部楼层
收藏个先。
去年搞了一个n100迷你主机,也是用pve的lxc搭了一个frigate。还折腾了一个M.2 Coral。可惜这个机器硬件不稳定,隔三岔五死机。回头重新搭系统的时候就参考你这个。
回复

使用道具 举报

0

主题

77

帖子

1971

积分

金牌会员

Rank: 6Rank: 6

积分
1971
金钱
1894
HASS币
0
发表于 2024-10-22 07:36:03 | 显示全部楼层
[segment @ 0x5d19b33d2a40] Non-monotonous DTS in output stream 0:0; previous: 10493415, current: 10493415; changing to 10493416. This may result in incorrect timestamps in the output file.
怎么解决呀
回复

使用道具 举报

11

主题

304

帖子

1631

积分

金牌会员

Rank: 6Rank: 6

积分
1631
金钱
1327
HASS币
0
发表于 2024-10-22 08:48:53 | 显示全部楼层
本帖最后由 fay000fay 于 2024-10-22 08:51 编辑
mqtt:
  host: 192.168.100.189
  port: 1883
  user: admin
  password: *****



detectors:
  detector_name:
    type: cpu

logger:
  # Optional: Default log verbosity (default: shown below)
  default: info
  # Optional: Component specific logger overrides
  logs:
    frigate.event: debug

objects:
  track:
    - person
    - car
    - cat
    - dog

record:
  enabled: true
  retain:
    days: 7
    mode: all
  events:
    retain:
      default: 7
      mode: motion
snapshots:
  enabled: false
  retain:
    default: 7



cameras:
  laojiaoutdoor: 
    enabled: true
    ffmpeg:
      hwaccel_args: preset-vaapi
      inputs:
        - path: rtsp://admin:********@192.168.2.229:554/stream1
          roles:
            - detect
            - audio
          
    detect:
      width: 2560
      height: 1440
      fps: 15
    zones:
      outdoor:
        coordinates: 
          0.053,0.54,0.198,0.417,0.388,0.354,0.579,0.383,0.591,0.345,0.704,0.307,0.816,0.323,0.995,0.454,0.996,0.992,0.108,0.989,0.003,0.611,0.005,0.315
        loitering_time: 0
        inertia: 3
    motion:
      threshold: 45
      contour_area: 15
      improve_contrast: 'true'
      mask: 
        0.001,0,0.998,0.008,0.998,0.43,0.981,0.43,0.906,0.378,0.824,0.312,0.713,0.296,0.635,0.307,0.587,0.332,0.579,0.369,0.391,0.345,0.192,0.406,0.053,0.537,0.002,0.249
    review:
      alerts:
        required_zones: outdoor1
      detections:
        required_zones: outdoor1
    objects: {}
version: 0.14

我是tplink的摄像头,接入后,没有音频。
回复

使用道具 举报

1

主题

64

帖子

512

积分

高级会员

Rank: 4

积分
512
金钱
448
HASS币
0
发表于 2024-10-22 09:15:35 | 显示全部楼层
感谢分享。
回复

使用道具 举报

0

主题

3

帖子

24

积分

新手上路

Rank: 1

积分
24
金钱
21
HASS币
0
发表于 2024-10-22 09:17:37 | 显示全部楼层
感谢楼主分享~~~~~~~~~~
回复

使用道具 举报

13

主题

49

帖子

430

积分

论坛分享达人

积分
430
金钱
381
HASS币
0
 楼主| 发表于 2024-10-22 10:06:16 | 显示全部楼层
本帖最后由 gasment 于 2024-10-22 10:07 编辑
fay000fay 发表于 2024-10-22 08:48
我是tplink的摄像头,接入后,没有音频。

先把rtsp流放进potplayer播放看看有没有声音,有的话看看音频编码格式是不是acc
其他音频格式需要转码,frigate录制默认不带音频,开启音频需要添加output_arg:cameras:
  laojiaoutdoor:
    enabled: true
    ffmpeg:
      hwaccel_args: preset-vaapi
      output_args:
        record: preset-record-generic-audio-copy   #如果音频流为acc则直接复制流
#       record: preset-record-generic-audio-aac   #如果音频流不是acc则直接需要转码
      inputs:
        - path: rtsp://admin:********@192.168.2.229:554/stream1
          roles:
            - detect
            - audio

回复

使用道具 举报

0

主题

14

帖子

99

积分

注册会员

Rank: 2

积分
99
金钱
85
HASS币
0
发表于 2024-10-22 10:36:33 | 显示全部楼层
厉害了,边学边收藏!
回复

使用道具 举报

11

主题

304

帖子

1631

积分

金牌会员

Rank: 6Rank: 6

积分
1631
金钱
1327
HASS币
0
发表于 2024-10-22 13:48:07 | 显示全部楼层
gasment 发表于 2024-10-22 10:06
先把rtsp流放进potplayer播放看看有没有声音,有的话看看音频编码格式是不是acc
其他音频格式需要转码,fr ...

VLC里看有声音的。我的是G.711编码的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 20:27 , Processed in 1.642754 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表