介绍

我最近在研究从一个普通的IP摄像头,部署成一个智能的可接入的摄像头,通过软件层面本地实现这些功能。
其实市面上有很多针对家庭的摄像头了,但是他们的AI和视频文件是发送云端的,用户没有很多控制,我这套教程则是摄像头可以完全的隔离互联网,数据全部是在自己的手上,自动化也不依赖互联网。

摄像头选择

必须是IP摄像头,支持rtsp推流。我买的是工厂DIY那种的,大家淘宝搜IP 摄像头应该就能找到。

像小米之类的摄像头是不开放rtsp推流的,买设备之前记得问清楚!!!

准备工作

安装home assistant

首先你要先安装home assistant,本教程的home assistant是直接使用社区安装的

https://www.bilibili.com/video/BV1Jq4y157rU/

安装MQTT

直接社区安装mosquitto,全部默认安装,不要打开认证,名字要和应用名一样

home assistant安装MQTT集成

image.png

image.png

host是mosquitto.ix-mosquitto.svc.cluster.local
端口是默认的端口

Frigate

Frigate是一个NVR服务(录制保存监控视频),它是支持一些物品的检测,如检测到人移动自动录像和截图等,它也可以检测猫、狗、自行车等等。有非常多的参数,官方文档注释写的也比较全

应用安装

社区里其实有这个软件,但是是在孵化器,而且功能比较复杂,需要完全的代码重构,在进入稳定版之前不建议使用,所以我们使用custom app自己安装。

在安装之前我们需要先写一个配置文件

大家自行创建存放frigate的数据集或者文件夹,在文件夹下创建config.yml

mqtt:
  host: mosquitto.ix-mosquitto.svc.cluster.local
  port: 1883
    
birdseye:
  enabled: False
  mode: motion
  width: 1280
  height: 720
objects:
  track:
    - person
#    - car
#    - motorcyle
#    - cat
#    - dog   
        # Optional: list of objects to track from labelmap.txt (default: shown below)
ffmpeg:
  output_args:
    record: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c:v copy -c:a aac
cameras:
  cam:
    mqtt:
      timestamp: False
      bounding_box: False
      crop: True
      quality: 100
      height: 500
    ffmpeg:
      inputs:
        - path: rtsp://你的相机地址
          roles:
          - detect
          - rtmp
          - record
     
detect:
  height: 720
  width: 1280
  fps: 5
record:
  enabled: True
      # Optional: timeout for highest scoring image before allowing it
      # to be replaced by a newer image. (default: shown below)
  retain:
    days: 30  
snapshots:
  enabled: True

上面这套配置就是自动检测有人自动录像截图,并会推送到MQTT,更多配置去看官网吧。这个软件的探测官方推荐是使用谷歌的Coral TPU,但是这个东西不好买,默认是使用CPU。

接下来在文件夹创建一个文件夹用来存放截图,录像等

然后安装软件,使用custom app

image.png

名字最好和我一样

应用名称:frigate
Container Repository:blakeblackshear/frigate
Container Tag:stable-amd64nvidia

image.png

image.png

mountPath:/config/config.yml

image.png

mountPath:/media/frigate

image.png

mountPath:/tmp/cache

image.png

其他默认就行

部署完成后,你应该可以访问,看到你是摄像头的实时画面。

安装home assistant集成

image.png

在HACS安装frigate集成,重启

image.png

然后安装集成,地址是frigate-custom-app.ix-frigate.svc.cluster.local,端口5000,一般会自动发现!

安装double-take

介绍

这个软件可以把frigate和deepstack链接一起。frigate检测到人推送到double-take,double-take将截图发送给deepstack进行AI识别,同时double-take还提供人脸识别到某人将事件推送到MQTT等等推送。我们就是利用这一点可以做到自动化

安装

安装之前,请自行创建文件夹或者数据集用来存放文件。double-take我已经开发到社区,直接默认安装就行,把储存改为hostpath,挂载到你创建的文件夹就行,其他默认安装

image.png

配置

image.png

mqtt:
  host: mosquitto.ix-mosquitto.svc.cluster.local

  topics:
    # mqtt topic for frigate message subscription
    frigate: frigate/events
    #  mqtt topic for home assistant discovery subscription
    homeassistant: homeassistant
    # mqtt topic where matches are published by name
    matches: double-take/matches
    # mqtt topic where matches are published by camera name
    cameras: double-take/cameras
detect:
  match:
    # save match images
    save: true
    # include base64 encoded string in api results and mqtt messages
    # options: true, false, box
    base64: false
    # minimum confidence needed to consider a result a match
    confidence: 60
    # hours to keep match images until they are deleted
    purge: 168
    # minimum area in pixels to consider a result a match
    min_area: 1000

  unknown:
    # save unknown images
    save: true
    # include base64 encoded string in api results and mqtt messages
    # options: true, false, box
    base64: false
    # minimum confidence needed before classifying a name as unknown
    confidence: 40
    # hours to keep unknown images until they are deleted
    purge: 8
    # minimum area in pixels to keep an unknown result
    min_area: 0
    
frigate:
  url: http://frigate-custom-app.ix-frigate.svc.cluster.local:5000

  # object labels that are allowed for facial recognition
  labels:
    - person

  attempts:
    # number of times double take will request a frigate latest.jpg for facial recognition
    latest: 10
    # number of times double take will request a frigate snapshot.jpg for facial recognition
    snapshot: 10
    # process frigate images from frigate/+/person/snapshot topics
    mqtt: true
    # add a delay expressed in seconds between each detection loop
    delay: 0

  image:
    # height of frigate image passed for facial recognition
    height: 500

  # only process images from specific cameras
  cameras:
     - cam
    # - garage

  # only process images from specific zones
  zones:
    # - camera: garage
    #   zone: driveway

detectors:
  deepstack:
    url: http://deepstack.ix-deepstack.svc:10049
    key: 等会要设置的deepstack密码
    timeout: 15

double-take是可以设置登录的账号密码的,我这里就不设置了,具体请参考官方

安装deepstack

这个应用是用来提供AI服务的,社区里已经有了,直接安装即可,记得名字要和应用名一样

image.png

这里可以选择使用CPU/GPU处理,如果选择GPU的话,下面资源也要选上你的显卡

image.png

image.png

其他默认即可

double-take教程

以上设置好之后,你会看到所有的灯变成绿色

image.png

训练

你可以去摄像头下面走一圈,回来之后立刻就会发现double-take match下面出现你的图片
image.png

点击add new,创建你的名字,然后选下面你的图片

image.png

点击训练,理论上训练越多识别越精确

自动化

在设置自动化之前,我们要先了解一下double-take能给出哪些接口。我们可以在home assistant的MQTT集成中看到,已经自动发现了传感器

image.png

其中double_take_cam传感器会在检测到人的时候输出一个人数,然后在30s后恢复为0,我们可以利用这个传感器检测是否有人,相当于人体传感器。

double_take_unknown 传感器会在人脸识别不出,或者识别到未知人的时候输出一个json,里面包含时间,截图文件名,甚至可以设置base64图像

double_take_sagit,这个传感器是因为我训练了我自己的图片,所以检测到我,就会输出json,和unknown一样

其实这些传感器都是MQTT发布的,他们在MQTT的主题为:
double_take_cam:double-take/cameras/cam (cam是frigate和double-take配置文件里面配置的摄像机名字)
double_take_unknown:double-take/matches/unknown
double_take_sagit:double-take/matches/sagit

知道这些之后我们就可以设置自动化了,double-take官方一个home assistant的自动化示例,但是我觉得home assistant的自动化不如node-red好用。所以我们直接使用node-red

安装node-red

node-red安装社区版,一直下一步默认安装就好了,没什么好讲的

配置node-red

安装好之后,我们需要配置node-red和ha(homeassistant缩写ha)链接

image.png

image.png

我们需要安装node-red-contrib-home-assistant-websocket

安装之后在左边可以找到ha的一些组件

image.png

我们随便拖一个到流程画布里面,双击打开,设置新的ha节点

image.png

Base URL:http://home-assistant.ix-home-assistant.svc.cluster.local:8123
到社区生成内部DNS

Access Token获取方法,到ha里面创建

image.png

完成之后点击部署

检测到人,自动执行

上面说到,double-take提供了人体传感,可以使用这个当做人体传感器使用

image.png

如图,检测到人,判断灯是否开着,如果关着,那就开灯

image.png

image.png

image.png

检测到sagit,自动发送telegram

也可以实现检测到某人,通知,警报等等操作,我这里用的是tg 机器人,网上也有很多用微信企业的,server酱的一些教程,根据自己需求更改吧

image.png

这里我们需要使用MQTT来订阅double-take,获取信息

image.png

image.png

然后转化json为对象

image.png

然后设置函数
image.png

var $filename = msg.payload.match.filename;
var url = 'https://xxxx:9443/api/storage/matches/'+$filename;
msg.payload = {
    chatId: '86358xxxx',
    type: 'message',
    content: 'Sagit!抓住你了!'+url
}
return msg;

解读一下
double-take可以直接调用它的链接直接查看图片,而推送的json里面是没有给出链接的,但是给出了文件名

image.png

经过转化json为对象,我们可以直接调用msg.payload.match.filename来获取文件名,所以变量$filename获取文件名,再与我们的链接组合就可以拿到截图完整的地址了!
同理,我们可以获取时间,名字,等等

我用的telegram插件为node-red-contrib-telegrambot

tg如何设置机器人我就不说了,网上很多,这个插件设置方法官方也有(填机器人名,token,chartid)

image.png

一些其他的通知方法,如微信等,都要自己去查看发信的规则,如何调用,大家自行测试吧

最后修改:2022 年 06 月 02 日
感谢您的支持