本帖最后由 acdxxx188 于 2021-2-11 09:59 编辑
最近放假了,准备把百度的人体识别接入,来充当人体感应,想感应室外门口有没有人来,做一些自动化,但是插件写到一半就看见@guitengyue大神分享的纯本地方案,想着不用重复造轮子了,但是我的摄像头也不支持动作检测和上传图片,就到网上搜了一下,发现下面几款本地化的软件
第一款人体物体识别插件(Frigate)
搬运地链接:https://community.home-assistant.io/t/local-realtime-person-detection-for-rtsp-cameras/103107
这款不需要摄像头接入homeassistant,他是直接接入frigate里,可以当NVR来使用,动态检测,可以保存短视频,提供addon repository接入homeassistant界面比较友好,无需写配置文件(但是本身需要写配置文件)
有两种方法安装
如果你是HASSOS的话,直接在前端Supervisor > Add-on Store > 右上角三个点>Repositories,里面输入https://github.com/blakeblackshear/frigate-hass-addons,点ADD,就会出现插件
点击Frigate NVR>Install 安装就可以了,根据下面配置文件配置,命名frigate.yml,放入你的config目录,然后在网页上启动
docker安装方式,我也是这种,因为不想绑定在hassos上
首先第一步先建好3个文件夹,clips,config,recordings
照下面写好配置文件,命名config.yml,保存在刚刚建好的config目录下(add-on安装的话保存frigate.yml,放在homeassistant的config目录)
# 检测硬件,目前就先这么配置
detectors:
coral:
type: cpu
# mqtt,必须
mqtt:
# mqtt的服务地址
host: 192.168.3.22
# mqtt的用户
user: xxxxxx
# mqtt的密码
password: xxxxx
# 摄像头接入
cameras:
# 摄像头名称,自定义
fristcamera:
ffmpeg:
inputs:
# 摄像头地址
- path: rtsp://admin:[email protected]:554/Streaming/Channels/1
# 要开启的功能,下面这些功能,不需要就删掉
roles:
# 检测功能
- detect
# 短片剪辑功能
- clips
# 录像功能
- record
# 像外提供播放功能(一个坑,要确定你的摄像头是不是h265编码的,如果是就不要开启这个,不然就会一直报错)
- rtmp
# 摄像头画面的分辨率,一定要准确,不然会花屏,先在本地电脑上用软件播放,查看下分辨率,填入下面,
width: 2560
height: 1440
fps: 3
detect:
# 开启检测
enabled: True
# 不检测的区域,可以先不设置在网页游览器里复制过来
motion:
mask:
- 1198,134,1243,299,1552,289,1530,0,0,0,0,145
- 482,1440,457,408,0,416,0,1440
# 区域,可以先不设置在网页游览器里复制过来
zones:
zone_0:
coordinates: 766,1440,1103,591,1241,442,1616,535,1697,193,1802,1440
# 剪辑
clips:
# 是否开启
enabled: True
# 拍摄前3秒
pre_capture: 3
#拍摄后5秒
post_capture: 5
retain:
# 保留录像天数
default: 5
# 特定的物体保留天数
objects:
person: 10
# 快照
snapshots:
enabled: True
# 在快照上打印时间戳 默认False
timestamp: False
# 在快照上绘制边界框 默认False
bounding_box: True
# 裁剪快照 默认False
crop: False
# 将快照大小调整为的高度(默认值:原始大小)
#height: 175
retain:
# 默认保留天数(默认值:如下所示)
default: 10
# 每个对象的保留天数
objects:
person: 15
objects:
# 选择需要检测的物体,能选择的列表在labelmap.txt
track:
- person
- bicycle
- car
- motorcycle
- cat
- dog
# 定制过滤器减少误报
filters:
person:
# 检测到的对象的边框的最小面积,宽度*高度(默认:0)
#min_area: 0
# 检测到的对象的边框的最大面积,宽度*高度 (默认: 24000000)
#max_area: 100000
# 启动跟踪的对象的最低分数 (默认: 0.5)
min_score: 0.5
# 将被跟踪对象的计算分数的最小十进制百分比视为真实正值 (默认: shown below)
threshold: 0.7
启动docker,我是esxi里的Ubuntu,至于你是其他平台或其他方式启动,请参加官网:https://blakeblackshear.github.io/frigate/
#启动Frigate
docker run --rm \
--name frigate \
--privileged \
--mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \
-v (刚刚建好的clips路径):/media/frigate/clips \
-v (刚刚建好的recordings路径):/media/frigate/recordings \
-v (刚刚建好的config路径):/config:ro \
-v /etc/localtime:/etc/localtime:ro \
-e FRIGATE_RTSP_PASSWORD='password' \
-p 5000:5000 \
-p 1935:1935 \
blakeblackshear/frigate:0.8.1-amd64
启动后,本地游览器输入http://{宿主机的IP}:5000,能看见摄像头画面就成功了
接入homeassistant
插件下载地址:https://github.com/blakeblackshear/frigate-hass-integration
把里面的custom_components目录下的frigate目录 放入自己custom_components目录里
重启homeassistant
重启成功后,在配置-集成-右下角添加集成-里面搜索frigate,点击后,输入frigate的IP,(如果是Add-on Store添加的,输入http://ccab4aaf-frigate:5000或http://ccab4aaf-frigate-beta:5000)
下一步后,选择区域就完成了
添加的实体有:
传感器
摄像头
一些感应开关
而且传感器和摄像头都是根据配置文件里的object分类的,比如我配置了人,自行车,摩托车,汽车,猫,狗,它们各自有一个传感器和摄像头
并且摄像头会捕捉最佳照片显示过来,可以供其他插件使用,比如人脸识别,狗脸识别,猫脸识别,汽车牌照识别等等,你自己发挥
还有一个比较厉害的功能,可以在前端媒体游览器里直接观看捕获的录像和图片
点击媒体游览器,里面多了一个Frigate,点击即可观看,前提是配置rtmp
其余的自己发挥吧
优化建议
这款插件占资源挺大的,下面是我自己的优化建议首先摄像头的分辨率不要太大,毕竟只是物体识别,如果要做人脸识别,现在的摄像头基本上都有主码流和子码流,可以物体识别用子码流分辨率小,人脸识别用主码流 最好在配置文件里配置motion.mask,来去掉一些不需要识别的区域,比如摄像头在外面,外面路上的行人车辆我们就不需要识别了,可以用motion.mask遮住不识别 操作步骤: 先打开frigate网页,点击需要的摄像头 > masks & zones > MOTION MASKS边上的add,然后在摄像头上单击点,让点围城一个封闭区域,红色部分就是遮住不识别区域,完成后,点copy,复制到配置文件,具体看配置文件通过上面这些操作,接入2个摄像头我的CPU使用率降到的60%,我是3215U,装exsi,Ubuntu分配2CPU,2G内存,其他设备自己测试 插件还支持Google Coral Accelerator,但是国内买不到,某宝代购的开价1000+,想想还是算了,有能力自己测试 https://coral.ai/products/
第二款人体物体识别插件(deepstack-object)@guitengyue大神分享过的,补充homeassistant插件
搬运地链接:https://community.home-assistant.io/t/face-and-person-detection-with-deepstack-local-and-free/92041这块需要先把摄像头接入homeassistant,具体接入方法论坛搜索吧
首先也需要找个地方运行docker,来启动deepstack
我的deepstack启动命令
#首先创建一个docker网络:
docker network create --driver bridge deepstack-network
创建一个目录用来保存数据,必须全英文,启动deepstack
#启动deepstack (我的是esxi里的Ubuntu ,所以用的是x64,其他平台可以看https://docs.deepstack.cc/里)
docker run -d -e VISION-DETECTION=True -e VISION-FACE=True -v (你刚刚创建目录的路径):/datastore -p 5000:5000 --network deepstack-network --name deepstack deepquestai/deepstack:latest
运行后,本地游览器输入http://{宿主机的IP}:5000,能打开网页就算成功
这里推荐另一个插件,也是homeassistant插件的作者弄得,可以直接网页打开上传图片识别,用来测试
github链接:https://github.com/robmarkcole/deepstack-ui
#运行deepstack-ui
docker run -d -p 8501:8501 -e DEEPSTACK_IP='deepstack' -e DEEPSTACK_PORT='5000' --network deepstack-network --name dDEEPSTACK_PORTeepstack-ui robmarkcole/deepstack-ui:latest
运行后,本地游览器输入http://{宿主机的IP}:8501,就可以在里面上传图片进行识别
1.加入homeassistant
下载homeassistant插件的github链接:https://github.com/robmarkcole/HASS-Deepstack-object
把里面的custom_components下的deepstack_object的文件夹放入自己的custom_components文件夹下
configuration.yaml文件里输入
image_processing:
- platform: deepstack_object
# deepstack的ip地址
ip_address: 192.168.3.12
# deepstack的端口
port: 5000
# deepstack的密码,上面docker启动没有设置
#api_key: mysecretkey
# 你自己训练的模型名称,训练模型参加官网
# custom_model: mask
# 置信度,默认80
# confidence: 80
# 下面roi开头的为检测区域,可以在deepstack_ui网页里设置后,填入下方
# roi_x_min: 0.35
# roi_x_max: 0.8
# roi_y_min: 0.4
# roi_y_max: 0.8
# 图片保存的地址,最好保存在media目录下,每个平台madia目录都不一样
save_file_folder: /mnt/f/python/baidu-renti-homeassistant/config/media
# 是否按时间保存检测到的人
save_timestamped_file: True
# 是否保存最后一次检测的图片
always_save_latest_jpg: True
# 保存图片的缩放
scale: 0.75
# 检测目标列表
targets:
# 检测目标: 人,置信度默认
- target: person
# 检测目标:汽车,置信度40
- target: car
confidence: 40
# 接入的摄像头id
source:
- entity_id: camera.menkou
填好后,重启,就可以见到实体了
他是不会自动扫描的,需要有服务调用才进行识别
比如下面我每5秒调用一次的自动化功能
配置-自动化-新建自动化-从空的模板新建
触发条件
动作
保存,就可以了
如果你把上面保存目录设置在media目录的话,在前端直接打开媒体游览器,进入文件夹,可看到检测到物体的图片,点击即可观看
然后是事件触发,比如检测到人后,你需要检测到的参数做自动化(下面示例下,检测到后,在前段通知)
配置-自动化-新建自动化-从空的模板新建
触发
动作
title: >-
{{ trigger.event.data.entity_id.split(".")[1] }}发现了{{
trigger.event.data.object_type }}
message: >-
{{ trigger.event.data.object_type }}可信度为:{{
trigger.event.data.confidence}},位置为{{ trigger.event.data.centroid.x
}},{{trigger.event.data.centroid.y }}
具体能返回的参数,自己事件监听一下,跟github上文档写的返回数据不一样
结果展示
然后你可以尽情的发挥了
人脸识别插件(Deepstack-face)
也是出自跟第2款插件一样的作者
搬运地链接:https://community.home-assistant.io/t/face-and-person-detection-with-deepstack-local-and-free/92041
启动docker方式,跟第2款插件一样,不说了,下面就介绍下接入homeassistant下载插件地址:https://github.com/robmarkcole/HASS-Deepstack-face
把里面的custom_components下的deepstack_face 的文件夹放入自己的custom_components文件夹下
configuration.yaml文件里输入
image_processing:
- platform: deepstack_face
# deepstack的ip地址
ip_address: 192.168.3.12
# deepstack的端口
port: 5000
# deepstack的密码,上面docker启动没有设置
#api_key: mysecretkey
# timeout: 5
# 是否只检测人脸,设为True为检测人脸识别,不然只检测是否有人脸
detect_only: False
# 检测的图片保存目录,是否有没有人脸都保存的目录,目录必须事先建好
save_file_folder: /media/camera_pic/face
# 是否有没有人脸都保存
save_timestamped_file: False
# 检测到人脸是否保存
save_faces: True
# 检测到的人脸保存目录,目录必须事先建好
save_faces_folder: /media/camera_pic/face/
# 是否在人脸上显示框框
show_boxes: True
# 摄像头id
source:
- entity_id: camera.fristcamera_person
# 名字
name: face_counter
重启homeassistant后即可看见实体
由于我的摄像头是户外的,位置比较高,人脸识别都没识别成功过,大家可以试试
人脸识别也不会自己调用的,必须调用image_processing.scan服务才会扫描识别
比如跟第一款插件联动
第一款插件检测到人体,他会把图片用一个摄像头返回过来,配置文件配置为那个摄像头,然后等触发就调用,自动化如下
添加自动化
触发条件
动作
下面是注册人脸
注册人脸也是调用服务
首先把你的人脸保存到homeassistant上的某个目录
打开前端 开发者工具>服务,选择image_processing.deepstack_teach_face
在下面填入
name: 你的名字,英文的
file_path: 你保存的人脸图片地址
如下图片所示
点击调用,如果没有任何错误提示,表示注册成功
如果检测到人脸,可以在自动化中监听事件image_processing.detect_face,来获取人脸信息,可参照第2款插件那样设置
|