通过人体识别实现智能家居控制

市面上普遍使用的人体检测方案是红外传感器,缺点很多且显得特别弱智:

  • 只能检测运动物体;
  • 完全不能区分人或其它活动物体;
  • 不能区分人体是进入或离开某一区域。

设想一个最简单普遍的生活场景:当我晚上 7 点步入餐厅时,餐厅灯光应随之亮起;同理,当识别到餐厅无人时,应自动将餐厅灯关闭。通过人体传感器是死活做不到这点的。

转换思路,视餐厅为一平面图,上述问题即可抽象成 “如何检测一张图片内是否有人存在”,解决方案就显而易见了——目标检测。

识别算法

YOLOv5 没能部署到树莓派上(官方 32 位系统),也没深究。转头发现了 Paddle-Lite ,专为移动端、嵌入式硬件开发的深度学习推理框架。Paddle 提供了超多预训练模型 ,我选取了其中尺寸最小的MobileNetV3 Small ,实测在树莓派4 上每次推理仅需 < 200 ms。

摄像头

这甚至是个比识别率还严重的问题。基本上所有的 USB 摄像头都不具备夜视能力,用这种摄像头正应了达文西手电筒的梗。无奈买了一个网络摄像头,因为需通过 RTSP 协议获取视频流,缺点同样明显:

  • 占用宽带;
  • 高延时;
  • 需要解码。

所以我现在设定的采集帧率仅为 2 帧/秒,尽量降低树莓派的功耗。

问题

  • 识别速度。

    暂时没找到只一个人体分类的模型,这是推理速度的一个瓶颈。终极方案大概只能是自己训练模型。

  • 识别正确率。

    一个是模型没有按场景训练过;一个是单一摄像头角度固定,需要一个摄像头阵列从不同角度采集后综合得出是否有人的最终结论。这不管是从经济角度还是技术角度,都是个大工程。

  • 视频采集延时。

    得继续找一个更靠谱的摄像头,至少 3 米的夜视能力是基本要求,USB 有线是最好的了。现有的网络摄像头方案,大概可以通过把摄像头和树莓派都有线连接到路由器降低延时。

源码

(https://github.com/LiangZuoting/PersonMonitor) 。PersonMonitor 把识别结果推送到 SmartHome Web API,SmartHome 控制灯具做出响应。

后续

摄像头问题已完美解决。

  1. 在 1688 上淘到了这个 USB 接口的夜视摄像头

  2. 深究之后发现,摄像头延时问题除 RTSP 协议原因外,还有一个很重要的点是 OpenCV 会默认缓存 4-5 帧图像。解决方案就是把摄像头采集放在单独线程里进行,且采集速度应明显高于识别速度。比如我的设定是每 200ms 识别一次,每 100ms 采集一次,利用 100ms 的时间差尽可能丢掉前边的缓存帧,只保留最新的一帧。这样,识别也是基于最新帧了。

评论