使用Frigate + Google TPU 将普通摄像机变为AI摄像机

Frigate 是一款开源本地 NVR系统,具有 AI 物体检测功能。使用 OpenCV 和 Tensorflow 对本地摄像机进行本地实时物体检测,本教程以PVE安装Ubuntu虚拟机在Docker中部署Frigate为例讲解Frigate的部署与基本配置,其他系统方法类似,如何在PVE中建立虚拟机并安装Ubuntu不在本教程范围,请另行参考其他教程

硬件直通

本教程以PCIE版本Google Tpu为例,其他版本操作类似

先在PVE中停止虚拟机,并进入PVE Shell

执行指令 lspci -nnk | grep 089a 回车并查看返回结果

  1. 输入指令 nano /etc/default/grub 进入编辑界面
  2. 找到 GRUB_CMDLINE_LINUX_DEFAULT=“quiet” 这一行,将这行改为: GRUB_CMDLINE_LINUX_DEFAULT=“quiet intel_iommu=on”
  3. CTRL + X 并按 Y 保存退出
  4. 继续输入 update-grub 等待命令执行完成

  1. 输入 nano /etc/modules 进入编辑界面
  2. 在末尾加入一下四行:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

完成后按 CTRL + X 并按 Y 保存退出,然后重启一下PVE

再次进入PVE控制台,点击已经安装好的Ubuntu虚拟机,选择 硬件 - 点击添加

在设备栏点击下拉,找到图中所示的 Coral Edge TPU ,确认,直通完成

  1. 启动虚拟机,进入虚拟机的Shell
  2. 输入 lspci -nnk | grep 089a 查看直通是否成功,如返回和第一步中相同信息说明直通成功

安装配置TPU驱动

继续在虚拟机的Shell中输入下列命令(每一条都需要回车确认),等待全部运行结束

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update

继续输入命令并等待安装结束后重启Ubuntu虚拟机:

sudo apt-get install gasket-dkms libedgetpu1-std

注意:以上命令推荐在科学上网环境中运行,降低失败的可能性

再次进入虚拟机Shell,验证驱动是否安装成功,输入:ls /dev/apex_0

部署并配置Frigate

  1. 首先确认虚拟机中已经安装好Docker环境
  2. 进入虚拟机Shell,创建Frigate目录
mkdir /home/frigate
  1. 在刚才创建的目录中创建配置文件 config.yml,可将下面内容复制黏贴至文本文件中,并保存命名为 config.yml
  2. 通过 Winscp 软件将创建好的配置文件传入刚才创建的目录中 /home/frigate
mqtt:
 #你的 mqtt broker IP地址
 host: 10.0.0.1
 #你的 mqtt broker 端口
 port: 1883
 #你的mqtt 登陆用户名,没有的话可以留空
 user: username
 #你的 mqtt 登陆密码,没有的话可以留空
 password: zjing0910z
 #用于区分客户端,可以自己定义
 client_id: frigate 

detectors:
  coral_pci:
    #Tpu类型
    type: edgetpu
    #如果是使用 USB 版本的TPU,这里写usb
    device: pci 

#配置你的摄像机
cameras: 
  #摄像机在Frigate中的名称,可以自定义
  camera_1: 
    record:
      #是否开启录制功能,如需要录制,设置为 true
      enabled: false 
    ffmpeg:
      inputs:
        #这里设置你的摄像机的 rtsp 流地址,不同的摄像机流地址不一样,根据自己的实际情况修改
        - path: rtsp://username:password@ip:554/h264/ch1/main/av_stream
          roles:
            - detect

detect:
  width: 1280
  height: 720
  fps: 5
  enabled: True
  max_disappeared: 25
  stationary:
    interval: 0
    threshold: 50
    max_frames:
      default: 3000
      objects:
        person: 1000

# 通过摄像机进行人体移动侦测的冷却时间,单位是秒
motion:
  mqtt_off_delay: 10

# 设置检测对象为人(person),可在官网查看具体的其他可供使用参数
objects:
  track:
    - person
  filters:
    person:
      # 最小置信度,识别目标时的置信度,下面参数意思为超过 65% 相似度的就会判定为有识别目标
      min_score: 0.65

使用命令行部署Frigate

docker run -d \
  --name frigate \
  --restart=unless-stopped \
  --mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
  --device /dev/apex_0:/dev/apex_0 \
  --shm-size=64m \
  -v /home/frigate/storage:/media/frigate \
  -v /home/frigate/config.yml:/config/config.yml \
  -v /etc/localtime:/etc/localtime:ro \
  -e FRIGATE_RTSP_PASSWORD='123456a' \
  -p 5000:5000 \
  -p 8554:8554 \
  -p 8555:8555/tcp \
  -p 8555:8555/udp \
  ghcr.io/blakeblackshear/frigate:stable

等待部署完成后在浏览器中输入 http://ip:5000 ,如果部署正常,就可以进入Frigate界面了

在Ecore Home Center 中的运用

首先在EH组件里创建一个多选的虚拟设备

打开Node-Red,按照下面步骤建立流(全部完成后点右上角部署):



现在就可以通过在触发:状态节点中调用刚创建的多选虚拟设备来做触发