V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
msmmbl
V2EX  ›  分享创造

求教用图像识别水表的算法

  •  
  •   msmmbl · 2019-09-09 16:11:58 +08:00 · 7364 次点击
    这是一个创建于 1904 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自从用上了 homeassistant,总是想着把家里的各种东西集成进去。上次把总电量接入了(参考我的贴子: https://bbs.hassbian.com/thread-6410-1-1.html )。

    这次又想着把用水量也接进去。收集这些数据,期望可以发现:

    1. 每天的用水习惯是怎样的
    2. 是不是存在漏水的情况(水表一直缓慢转动,或者在家没有人的情况下发生转动,说明有地方漏水了)
    3. 是不是忘记关水了(水表一直长时间转动)

    家里的水表是放在门外的公共水表间里面的。大概就是在楼道里面有一个门,门里面排着很多水表,门一关里面黑黑的。水表就是普通的塑料水表了。

    为了低调,在水表间房顶安装了 raspberry zero w 和 pi camera,用 gpio 控制当拍摄时,打开 8 颗红外 led 闪光照明。把所有的东西放在一个 3d 打印的盒子里面。用细线引直流电源供电。3d 打印的外壳为黑色,并且没有可见光照片,在黑漆漆的水表间中很没有存在感。pi camera 是 1 代的 500W 像素,距离水表表盘大概 4 米。表盘大小为 8cm 的样子。为了得到足够大的图,给 pi camera 换了一个焦距大概是 10mm 左右的监控镜头。

    这是第一版的图:画了块 PCB,上面有白光 led、dc-dc 电路、一个电机驱动(想后期接机械臂用来远程开关水阀)、光照度传感器、时钟芯片、还有块液晶屏。这一版没有最终采用,因为白光 led 实在是太高调了,夜晚楼道里一闪一闪的很是吓人。

    微信图片_20190909154747.jpg

    第二版就去掉了不少东西,led 换成了红外的,电机驱动、屏幕光照啥的全部去掉,这一版给直接安屋顶了没拍照片,不过 3d 打印外壳的时候,为了得到尺寸,做了个 3d 效果图。

    TIM 截图 20190909155818.png

    这样搞了一波后,在 respberry 中用 crontab 每隔 30s 跑脚本拍照,拍出来的照片大概是这样子的。最右边的那个表盘是咱家的。

    e0-2019-03-30-15-49-09.jpg

    经过一波 opencv 各种心态学、边界操作后(这图的特征是表盘比表盘的边暗很多,这特征很容易分开表盘)。找到了表盘。

    r0-2019-03-18-11-29-43.png

    在经过一波 opencv 的模板匹配(我只关心这种样子的水表,那做一个模板把对应的区域切出来)。得到了数字和指针。

    n0-2019-03-18-11-30-10.png p2-2019-03-18-13-44-10.png

    其中数字还是挺清晰的,0342,边缘增强,二值化也容易,然后四等分后,跑一个分类器,再考虑写边界条件,估计就 ok 了。

    指针有点模糊,但是肉眼还是可以分辨是指向下面的。分析:本身指针是红颜色的,表盘是白色的,在红外 led 的照射下,红色指针能反射红外光,表盘能反射红外光,所以两者的区别就不是很大。要二值化分离出来找形态特征似乎不是很容易。放 tensorflow 里面跑一跑(初学只是看了一些书),用了普通的回归做出来效果也不怎样。这块我就卡在这里不知道怎么办了,没有任何思路,求指点。

    第 1 条附言  ·  2019-09-11 10:28:28 +08:00
    已订购焦距更大的镜头,看能否拍到更大的图像,这样也许会清晰些
    第 2 条附言  ·  2019-09-14 23:41:41 +08:00

    新的镜头到货,原来16mm的镜头,换成了25mm的镜头,效果提升,至少现在能看清楚圆盘上的小字了,大赞! dark2-3.jpg

    第 3 条附言  ·  2019-09-20 01:39:54 +08:00
    发现一个 github 项目做类似的事情,学到了不少东西 https://github.com/jomjol/water-meter-measurement-system
    第 4 条附言  ·  2019-10-01 16:22:54 +08:00

    最近半个月一直在研究实践上面的github上的那个工程,学到了不少知识,也有一些进展,总结如下:

    1. 工程中用了opencv的matchTemplate函数去匹配表盘上的区域。以前我一直没弄明白opencv模板匹配的用法,这个工程真正让我学会了,而且匹配效果挺不错的。工程中的代码是用了相机拍摄的大图去匹配的,500W像素的照片,在raspberry zero w上跑需要将近40s,我给改了下,想将拍摄到的照片缩小8倍,然后在小图上做模板匹配,然后在大图上切割。时间优化到3s。
    2. 工程中使用了tensorflow对小表盘做识别。我收集标注了大约3000多张图片用工程中的模型进行训练,效果没有工程中的那么好。原因我觉得是工程中的光照条件比较好,红色的指针和白色的背景区分很明显,但是我这是红外图,基本没有色彩;工程中的输入图片大小是3232,而我这把图片缩放到3232后人眼都基本看不清了指针了。于是修改了工程中的那个模型,把输入层的大小改成了64*64,效果大为提升。
    3. 虽然说google官方提供了raspberry zero w上的tensorflow,可以直接用pip3 install tensorflow安装,但是实际上,我遇到了不少问题。一个就是报kernel _FusedConv2D没有注册的问题( https://github.com/tensorflow/tensorflow/issues/24732 ),最后看tensorflow的源码才发现,google在为arm6上使用openblas加速的时候,有些kernel不会被编译。最后我使用了这个工程( https://github.com/lhelontra/tensorflow-on-arm )自己编译了tensorflow,用里面的rpi_one.conf就行。用docker会比较方便,不过需要给docker提供5G的内存,开始我只给了4G一直编译不过。虽然这样不带openblas,但是工程中的模型,在raspberry pi zero上跑的惊人的快,不到1s可以识别一个。

    附一张识别结果图:每隔5分钟识别一次水表的最小两位表盘,识别结果在文件名中。由于条件限制,剩下的两个表盘拍不全(最近物业把水表箱全给上锁了,硬件先不调整了)

    捕获.PNG

    第 5 条附言  ·  2019-10-15 10:46:18 +08:00

    集成home assistant成功,结贴撒花。感觉各位提供思路。

    批注 2019-10-11 145044.PNG.jpg

    37 条回复    2019-10-03 05:01:08 +08:00
    SeaRecluse
        1
    SeaRecluse  
       2019-09-09 16:27:16 +08:00
    啊,你这都固定位置了,完全用不上模型啊。表盘边缘检测下,然后根据坐标不就知道数字了- -,另一个水表的数字直接 OCR,不用分类器
    optional
        2
    optional  
       2019-09-09 16:46:46 +08:00
    👍🏻 这行动力
    lxrmido
        3
    lxrmido  
       2019-09-09 17:00:13 +08:00
    求教 LZ 是用什么做效果图的?最近打印 pi 的外壳想装到花盆上观察植物生长,用尺子量尺寸量得心好累,一个外壳要打印七八次实物出来一点点修改等得心态快炸了
    sadfQED2
        4
    sadfQED2  
       2019-09-09 17:05:51 +08:00
    你都用上 opencv 了,简单二值化,然后直接丢 tesseract ocr 就完事了,还要什么 tensorflow
    chengxiao
        5
    chengxiao  
       2019-09-09 17:07:33 +08:00
    如果不在乎钱的话 可以找一些线上的打码平台,专门识别验证码的,价格差不多几离到 1 分一次
    allgy
        6
    allgy  
       2019-09-09 17:21:48 +08:00
    提高输入图像的质量,1.换高清摄像头,2 改善光线条线 ?
    nisnaker
        7
    nisnaker  
       2019-09-09 17:30:21 +08:00   ❤️ 1
    按 1 楼所说,监测一些固定的像素就能确定指针的指向吧;另外提供一个思路,我觉得直接用 0342 那张图,末位数字的纵坐标也能确定小数点后边的值,都不用看指针。
    就比如 0342 这张图,看 4 和 2 的位置,2 应该是向上移动的,按说应该是 2 垂直居中的时候是 2.0,现在看好像是往上走了一点点,但远没到 3,姑且认为是 2.1 或 2.05 吧,精确的值可以多搜集一些数据把公式求出来就行了。
    msmmbl
        8
    msmmbl  
    OP
       2019-09-09 17:37:41 +08:00
    @SeaRecluse 谢谢。表盘边缘检测我试试看能不能把特征搞出来。
    @lxrmido Altium Designer 可以导出 pcb 和 3d 元器件为 step 文件,然后导入 solidworks 中。然后就可以画外壳啦。
    @sadfQED2 谢谢,tesseract ocr 我去了解下。
    @chengxiao 哈哈,人肉识别,很强势
    @allgy 嗯,是,硬件上,后期考虑换树莓派 v2 的 camera,这样可以得到更多的像素,以及增加更多的红外 led (不过红色指针会不会在更多的红外 led 上更清晰还需要实验)。不过这一版既然已经人肉可分辨了,还是考虑能否在软件上搞定。
    seraphv3
        9
    seraphv3  
       2019-09-09 19:34:54 +08:00
    xmoiduts
        10
    xmoiduts  
       2019-09-09 19:56:42 +08:00
    觉得判定最小数字位置的方案可行;另外,那个黑色大兴机场型指针敏感度应该最高,如果能拍到视频,也可以间接测出水流量吧。
    msmmbl
        11
    msmmbl  
    OP
       2019-09-09 20:23:34 +08:00
    @xmoiduts 拍视频应该问题不大。可是这个黑色的东西有时候转的很快,快到只有阴影的那种。可能是这种弱光情况下帧率上不去……我得再看看。
    msmmbl
        12
    msmmbl  
    OP
       2019-09-09 20:24:06 +08:00
    @seraphv3 谢谢
    CloudnuY
        13
    CloudnuY  
       2019-09-09 20:39:10 +08:00
    @xmoiduts #10 大兴机场指针绝了🤣
    shintendo
        14
    shintendo  
       2019-09-09 20:59:34 +08:00   ❤️ 1
    原来是真的水表
    cshlxm
        15
    cshlxm  
       2019-09-10 09:22:50 +08:00
    这个查水表的方式 硬核~ 楼主行动力真 nb~ 6666
    koala9527
        16
    koala9527  
       2019-09-10 09:51:04 +08:00
    有这个动手能力,在家再接一个流量传感器就行了。。。
    qping
        17
    qping  
       2019-09-10 11:08:16 +08:00
    3d 打印是自己买设备么
    ty89
        18
    ty89  
       2019-09-10 12:46:35 +08:00
    把你家的总表换成智能的就行了,费这劲
    sorasyl
        19
    sorasyl  
       2019-09-10 15:41:48 +08:00
    你这头像,怪不得要查水表
    hahaayaoyaoyao
        20
    hahaayaoyaoyao  
       2019-09-10 15:55:34 +08:00 via Android
    自己写代码,我可惜帮你。
    ziding
        21
    ziding  
       2019-09-10 16:19:14 +08:00   ❤️ 1
    我说个我们原来水表上用过的方案,在最小的指针上嵌入一小块磁铁,然后外面用霍尔进而感应计数。
    deorth
        22
    deorth  
       2019-09-10 18:05:03 +08:00
    楼主这头像让我以为是要防查水表
    piaochen0
        23
    piaochen0  
       2019-09-10 22:27:01 +08:00
    我只知道有一个朋友的公司做这套算法,让一个程序员什么事情都没干,专研了半年搞出来了...
    classyk
        24
    classyk  
       2019-09-11 08:20:19 +08:00
    是否可以考虑加一点光源,在拍摄的时候打开光源,以提升图像质量
    msmmbl
        25
    msmmbl  
    OP
       2019-09-11 10:27:10 +08:00
    @koala9527 @ty89 我们这边水表以及附近的设备的物权属于自来水公司,而且管路都预埋在墙里了,我做不了什么,下次装修回考虑。
    @qping 3d 打印机现在基本从硬件到软件都开源了,我参考了这个贴子 https://post.smzdm.com/p/332896/组了台,外观丑了点但是效果还行。整个过程还是很有意思的,考虑组个?
    ![未标题-1.jpg]( https://i.loli.net/2019/09/11/maGrN9ROiUuHL52.jpg)
    @ziding 霍尔是个挺不错的方案,可以做到很低的功耗。用霍尔传感器检测磁性唤醒 MCU 计数就行。然而我这水表全塑料的,一点磁性都没。
    @piaochen0 原来这东西这么难啊
    @classyk 嗯,后期实在不行有个计划,在表盘附近按一个用电池驱动的绿光 led,和摄像头无线联动拍摄时候同步照亮指针区域,因为区域小可以用很小的 led,应该不会太高调。
    qping
        26
    qping  
       2019-09-11 10:33:30 +08:00
    @msmmbl #25 我仿佛看到了一个很深的坑。。。而且我还想跳进去。。。。
    msmmbl
        27
    msmmbl  
    OP
       2019-09-11 10:39:36 +08:00
    @qping 干起来干起来
    ziding
        28
    ziding  
       2019-09-11 11:47:48 +08:00
    @piaochen0 太长了吧,基础的图形学应用啊
    webshe11
        29
    webshe11  
       2019-09-12 05:48:53 +08:00
    头像 + 标题 = cha 水表
    tmsdy0404
        30
    tmsdy0404  
       2019-09-13 00:17:04 +08:00 via iPhone
    执行力 max!!

    也想入 3D 打印的坑。。。。
    zomco
        31
    zomco  
       2019-09-13 13:55:05 +08:00 via Android
    就用 OCR,不要用 tensorflow
    msmmbl
        32
    msmmbl  
    OP
       2019-09-14 23:43:54 +08:00
    @tmsdy0404 支持入坑,可以用了做一些 DIY,很不错的。
    @zomco ok,记住啦,我试试。
    ZeroW
        33
    ZeroW  
       2019-09-16 22:02:26 +08:00 via Android
    大哥,你网站挂了
    1314258
        34
    1314258  
       2019-09-28 14:32:07 +08:00 via iPhone
    @msmmbl 请问是红外灯摄像头还红外+普通 25mm 摄像头?淘宝关键字可以给一下吗
    msmmbl
        35
    msmmbl  
    OP
       2019-10-01 15:50:00 +08:00
    @1314258 目前树莓派有出两个版本的摄像头,一个是 500W 像素的,一个是 800W 像素的。800W 像素那个硬件上带了一个加密芯片,导致市场上没有第三方生产,而官方的那个又不能换镜头,所以不选用。500W 像素那个,随便淘宝上找下就好了,选有 M12 镜头座不带红外滤光片的那种,比如"树莓派 红外 夜视 调焦"这样的关键字。镜头可以去看看卖监控的店,M12 的小镜头,我最后选了 25mm 的镜头。
    msmmbl
        36
    msmmbl  
    OP
       2019-10-02 11:32:06 +08:00 via Android
    @1314258 红外+普通 25mm 摄像头
    1314258
        37
    1314258  
       2019-10-03 05:01:08 +08:00 via iPhone
    @msmmbl 谢谢,太奇怪,我说楼主应该很热心的人,为什么没回复。原来是 V2EX 没有发回复提醒
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:57 · PVG 21:57 · LAX 05:57 · JFK 08:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.