概述

漏水检测的重要性

现代家庭装修水电煤系统中,用电和用煤的安全性已经被足够重视。因为涉及到生命安全,几乎每家都会安装断路器和漏电保护开关。煤气泄漏检测装置最近也流行起来。但漏水检测装置却罕有见到。

而家庭水管漏水却经常见到。现代家装中,木制材料、石膏板、照明电器都怕水,渗漏都会造成房屋经济损失或者无法修复的损伤。

本人曾经历过3次漏水事件,赔偿过楼下住户的石膏板吊顶,也修复过自家的木门和石膏板吊顶,墙布和木地板上至今仍有无法消除的痕迹。惨痛的教训使我一直比较关注水浸的主动防御方案。

目前市场上的产品

一、 水渍报警器

这类报警器用来检测环境中有没有水。两个距离相近的导体,当有水渍存在于导体之间的时候,导体之间的电阻会发生改变,随之报警器报警。

像下图这种,传感器拖着长长的探测线,使用时候,把线缠布置在可能漏水的地方。

漏水检测线

小米有出过水浸传感器,直接将它放在需要探测的地方就可以。

水浸传感器

这类报警器安装简单,可以用于重点区域的漏水点检测,但对于墙内的管路无能为例。在我的方案中,探测线被我用于缠绕厨房所有管道上,以及铺设于厨柜地面这些看不见的地方。小米水浸传感器用于洗衣机背后、卫生间脸盆底下。

二、 流量检测类报警器

这类报警器会持续的检测管中的流量,如果流量值超过一定的阈值,将触发报警。而根据流量测量的方式不同,可以划分为两类。

直接测量流量的报警器

这类报警器自带流量计,可以直接获取到管路中的流量。

做地漏的潜水艇,出了一款漏水保护器。直接将保护器熔接在家庭进水管路上。水流通过报警器上的流量计,保护器上的MCU对流量计数,达到阈值后触发报警。由于熔接安装是一种永久性的安装,因此需要在装修阶段就预先设计安装,并且后期损坏更换比较麻烦。

漏水保护器

FLUID一款智能漏水保护器,可接入智能家居系统。它直接夹子管路上而无需破管,通过超声波的方式,感知管路中的流量。截至到目前,似乎在没有正式发售。

FLUID

通过水表的方式获取流量

其实的管路上的水表,就是一个精确的流量计。现代的水表,已经可以感知到轻微的滴水产生的流量并在表盘上产生人眼感知的转动。因此通过感知水表的转动,就可获取当前流量。

flume一款智能漏水保护器,可接入智能家居系统。它直接绑在水表上就可以感知水表的转动。其原理是水表内部的金属部件,转动时候会引发磁场的变化。然而国内为了防止有人用磁铁吸住水表让它不能转来偷水,早就是全塑料的水表了。

flume

国外论坛上还有一种采用光学检测的方案探测流量的方法,将光点照射在表盘上,当指针转动碰到光点,由于指针和表盘的颜色不一样,光点的反射光强度也会不一样。通过对光强变化计数即可知道指针转了多少圈。这种方法要求传感器紧贴并阻挡表盘,在国内为了方便抄表,水表通常在室外,这么干的话估计抄表员会给你拆了。

反射法获取流量

除此之外,通过摄像头直接对表盘做图像识别,也可以获取到流量,不过这种方案尚未见到产品。

流量监测类报警器可以检测全屋的流量,发现隐蔽区域的渗漏。但对于后装市场,适合国内的产品并未发现。

适合国内的产品场景

水渍报警器在国内已经有很成熟的产品,像小米等科技企业都有介入,现在已经能做到发现漏水到联动阀门关闭,推送消息到手机的流程。但是企业对流量检测类报警器尚未涉足。

对于国内的用户场景惯有这么几个特点:

  • 国内的装修一般是需要管十年以上。比较知名的水管厂家,比如皮尔萨都提供了长达十年的质保。而十年对于电子类产品却可以更新好几代,因此用户对于在管路上固定安装一个不能拆卸的电子产品有些接受不能。这类产品一定是非专业人员可以方便拆装的。

  • 国内常见的塑料水表,导致水表在电、磁方面没有任何可供传感器测量的特征,只能在声波、光学方面想办法。

  • 国内的水表通常在室外,对传感器有防盗、供电方面的限制。

我尝试通过视觉识别的方式来构建一套水表识别系统,用于监测流量、判断漏水。选择这个方案的原因是:不用改动管路,或者在管道上挂任何东西。我可以将摄像头安装在足够高的地方,使得不容易被人拿走并可以利用屋顶部的电源。

硬件

环境介绍

我们小区,同一层楼的所有水表都安装在一个叫做“水表箱”的小屋子里,小屋子平时关门,漆黑一片,水表离地1.6m,层高2.8m。摄像头安装于屋顶角落。

设备选型

为了能够拍清楚表盘,需选用合适的摄像头和辅助光源。

开发平台

拍摄设备需要满足几个条件:

  • 体积和功耗足够小,满足隐蔽安装。
  • 可以更换镜头,以满足远距离拍摄、对焦。
  • 拥有光源照亮环境。
  • 拥有WiFi,可以传输数据。
  • 可以方便的进行远程开发调试,这样即使挂在屋顶可以改程序。

为此,我选择了树莓派Zero W作为开发平台。Zero系列是树莓派家族中体积和功耗最小的开发板,带Wifi、摄像头接口。跑Debian系统可以方便的SSH、VNC,apt-get。

摄像头

树莓派官方支持两款摄像头:OV5647和IMX219。前者500W像素,后者800W像素。IMX219相机模块带有加密芯片,现在只有官方能够制造,其镜头为固定镜头。而OV5647开源的设计,导致市场上出现了很多兼容的摄像头。

我选择了下图中的可拆卸镜头设计的OV5647图像传感器。M12镜头底座设计,可以方便的更换镜头。

OV5647

镜头

M12底座的镜头,常见于监控摄像头。可以在监控配件的店里,找到各种形式的镜头。对于监控用镜头来说,有一个重要的指标是焦距,单位是mm。通常焦距越大,看的越远。

焦距

为了在屋顶能够看清表盘,我选用了一颗25mm的监控镜头,它可以让表盘尽可能的充满画面。

辅助照明

由于环境全黑,因此在拍摄的时候需要提供照明。通常图像传感器的感光范围,除了人眼所见的可见光外,它也能看得见红外光。为了满足隐蔽性,选用了IR333C红外Led作为光源,其波长为940nm,对人眼完全不可见。

根据树莓派相机库piCamera的文档,可以指定树莓派任意GPIO作为闪关灯信号输出。

将这些硬件组合起来

我设计了一块PCB,用于布置红外LED,此外还有一些补助电路,用于供电、时钟。

PCB

和3D打印的外壳 3D

硬件搭建完毕,我把它安装在屋顶。

软件

利用这套系统,我拿到了拍摄的图像。

拍摄的图像

拍摄间隔分析

下方的四个指针,分别代表0.0001、0.001、0.01、0.1的值。安装在屋角的缘故,有些指针有些被遮挡,只能看到并识别左下角两个指针的刻度。

我试着将水龙头开到最大,将一个5L的容器装满水,用了50s,流量0.006m³/min。也就是说一分钟内,左下角第二个指针最多能转半圈。理论上,每隔一分钟拍摄一次图像,就可以知道一分钟内流过的水的体积。增加些余量,我选择每隔40s拍摄一次。

识别

参考github项目

指针的定位

由于光照条件差,下图中的指针(绿框)特征不是很明显。而红框中符号的特征却很明显。由于红框和绿框的几何位置是固定的,只需要找到红框的位置,就可以推算出绿框的位置——这称之为模板匹配。

指针定位

把红框区域的图片切出作为模板。在openCV中,提供了matchTemplate函数,用于在画面中找出和模板最相似的图片区域的位置。通过这个函数,可以找出红框的坐标。接着计算出绿框的坐标,把指针分离区域出来。

指针分割

指针识别

传统的图像处理方法需要将指针和刻度分离,再通过判断指针的形状计算角度。由于光照条件差,很难将指针于表盘分离,因此使用训练AI的方式来识别。

数据集

采集了一周的图片,切割后,人工标注,形成了一个约有3000张表盘图片的数据集。

数据集

模型

参考了github上的模型,但做了修改,增加了第一层的输入尺寸,模型如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
batch_normalization (BatchNo (None, 64, 64, 3)         12        
_________________________________________________________________
conv2d (Conv2D)              (None, 64, 64, 64)        4864      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 16, 16, 64)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 16, 16, 32)        51232     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 4, 4, 32)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 4, 4, 32)          9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 2, 2, 32)          0         
_________________________________________________________________
flatten (Flatten)            (None, 128)               0         
_________________________________________________________________
dense (Dense)                (None, 128)               16512     
_________________________________________________________________
dense_1 (Dense)              (None, 64)                8256      
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 130       
=================================================================
Total params: 90,254
Trainable params: 90,248
Non-trainable params: 6
_________________________________________________________________

其输入为64*64像素的图片,经过3次卷积运算后,经过全连接层,输出值为角度的Sin和Cos值。

训练

训练在PC上进行,参照github项目,分为两步。

第一次训练30个EPOCH,同时对图像施加随机的亮度变化。

第一次训练

第二次训练60个EPOCH,同时对图像施加随机的亮度变化和平移。

第二次训练

总共90个EPOCH。

验证AI的预测值和实际值,较为一致。

验证

部署到树莓派

由于官方tensorflow在arm处理器上不支持卷积运算,参考这个项目,使用提供的rpi_one.conf 重新编译tensorflow。

将训练好的模型部署在树莓派上。为了方便查看,我将识别直接画在了图片通过mjpg协议传输给群晖。 预览

数据分析

流量数据,通过WiFi传输给HomeAssistant储存,下图是典型的24小时流量图。其中,夜晚几乎没有流量,而白天多为短促的流量。

预览

从流量本身,可以使用模型判定是否需要进行漏水报警:

  • 长时间大流量,很可能预示这出现爆管。
  • 持续小流量,很可能出现渗漏。

HomeAssistant的好处是可以和遍布家中的其他传感器联动,进而判断报警。

  • 通过homeAssistant的deviceTracker,可以知道家中是否有人,在无人的时候,出现流量,进行报警。