如果大家对智能家居比较感兴趣的话,一定知道阻碍智能家居自动化发展的一个大问题就是,房间里有没有人,如果有人,那人究竟在做些什么,系统又该如何调整环境的照明,温度甚至安防。
在很长的时间里,我们检测人体都依靠两类设备,一类是热释电红外传感器,例如Aqara/小米人体传感器:
说明里面已经说的很清楚了,检测人或宠物移动,所以不动肯定是检测不到的,很多人都把这锅扔给小米背,但实际上,不管是哪个品牌,都做不到静止检测。还有一类叫做微波传感器,例如最近在智能家居玩家群里讨论的很热烈的静止人体传感器:
这个传感器号称可以检测静止人体,不过在企业官方的文档中明确写道:动态探测距离 6-8 米,静态探测距离最大2 米; 而其静态探测是检测人的微小动作,例如呼吸啥的。并且安装位置要与人体平行:
大家其实也可以看出来,这个号称静止人体检测的玩意,实际上也就是个动作传感器,只是灵敏度非常高罢了。先不说安装问题,微波传感器的灵敏度高了之后,电风扇,空调,任何轻微动作都可能触传感器动作。
除了这两种外,本站值友@blindlight正在实验利用无线信号来检测人体,参考文档:
大概意思是用一圈WIFI设备把房间围起来,然后实时监测各个节点的WIFI信号变化,来推断哪里有人。听上去不是啥难事,但是实际上应用起来还是要动些脑筋,我表示能看懂意思,但是抱歉,我做不来,相信看文的各位大部分人也搞不定,所以这里介绍一个大家都能玩的玩意——YOLO。
一、YOLO简介
大道理不说,其实我也不懂,这里大家只要知道YOLO的全称是You only look once,也就是你就看了一眼,看了一眼怎么了呢,看了眼就知道是什么了,这是一个基于深度学习方法的端到端实时目标检测系统。其主要特点一是快,二是安装使用简单,在ubuntu下只需要4条命令就可以开始工作。以下片段来自CSDN @泉伟
不过根据他文中的介绍,他使用的配置为1080Ti,使用YOLO v3原始权重,Resize以后的图片大小为608*608,检测速度可以达到20帧每秒。当然,如果使用tiny权重的话速度会快很多。除了人之外,YOLO还能检测其他常见物体,例如宠物:
不过说实话,如果只是检测有没有人的话,即使不用1080TI,开一台PC我都觉得有些浪费。所以这篇的主旨其实是利用树莓派来实现静态图片的检测。
二、树莓派安装darknet-nnpack
之前说了,如果在ubuntu上安装YOLO的话只需要3条命令:
git clone https:// github.com/pjreddie/dar knetcd darknet
make
然后下载权重文件,权重文件分两个版本,一个是标准的,一个是轻量(Tiny)的:
wget https:// pjreddie.com/media/file s/yolov3.weights (标准版)wget wget https:// pjreddie.com/media/file s/yolov3-tiny.weights (TINY版)
一般来说,标准版的检测准确率会高很多,但是非常非常慢(2400G单线程虚拟机下检测一张大约要30秒+),没有GPU加速是没有应用价值的,所以日常CPU使用都使用TINY版的权重(2400G单线程虚拟机下检测一张大约要2秒+),虽然准确率差了一些,但是找找人啊,猫狗也已经足够。但是标准版的Dakrnet在树莓派3b上面跑的话即使是tiny权重,也要40秒左右一张,显然是没有任何实用价值的。所以如果在树莓派上运行的话,我们需要针对无GPU并且ARM芯片进行优化过的darknet-nnpack。通过它来运行YOLO,我们能将tiny的识别速度提高到1秒/张左右,虽然依旧做不了实时检测,但是考虑到无论是硬件成本,还是运行成本(电费),树莓派都是性价比之选。
当然,根据此表,X86平台使用darknet-nnpack也能获得非常不错的优化速度。而安装只要参照darknet-nnpack的github页面一步步做下去就好,这里就不再复制粘帖了,全程无坑,而在下载weights文件时我们只要下载tiny版的就好:
wget wget
全部完成后我们可以利用自带图片测试下:
运行速度不错,1.1秒就完成了识别,只是load weights还需要3-4秒,总体上在5秒左右。这里值得说明的是,命令的默认参数是输出准确率超过25%的物体,我们可以根据自身环境来调整参数:
./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights data/person.jpg -thresh 0.1例如这个就是输出准确率10%以上的物体。
三、接入摄像头
这里我使用的是上一篇原创提到的45元的ESP32-CAM摄像头模块, 当然,你要是其他摄像头,只要能获取到静态JPG文件也都可以使用,这个摄像头没有夜视,视角也比较小,如果有大范围以及夜间检测需求的话其实并不是很合适。不过这里要提醒的是,红外补光摄得的黑白图像YOLO的识别率会进一步降低。调整好摄像头角度,确保人在厨房的每个角落,YOLO都能把人找出来。
这个摄像头最大的好处是,可以直接通过http获取JPG静态图像,所以我这做了个批处理文件,首先是获取静态影像到指定文件夹,然后运行detector来进行识别:
当然,这样只是跑程序识别,结果并不会输出到其他系统,所以我又拼拼凑凑搞了个PY文件,对结果进行分析,数输出结果里面有几个person:
然后将person数量传送给domoticz变量:
最后就是应用了,因为不是实时检测,所以用来自动化开灯啥的是不可能了,但是配合小米红外做到更快的自动关灯还是非常方便的,例如原先我们都是设定人体传感器检测到几分钟后无人关灯,现在就可以配合这个变量,在人体传感器检测到无人时去查看摄像头检测到的结果,如果是0就直接关灯,不用再等待几分钟。
当然,这里的YOLO只是利用其现成的库做的简单应用,并没有完全展示出YOLO的威力。深入应用的话可以自行训练得到模型,来判断更多的内容,例如你是在看电视,玩手机,还是睡觉等等。或者垃圾倒没倒,碗有没有洗啥的。