V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
msmmbl

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

  •  
  •   msmmbl · Sep 9, 2019 · 8034 views
    This topic created in 2435 days ago, the information mentioned may be changed or developed.

    自从用上了 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 里面跑一跑(初学只是看了一些书),用了普通的回归做出来效果也不怎样。这块我就卡在这里不知道怎么办了,没有任何思路,求指点。

    Supplement 1  ·  Sep 11, 2019
    已订购焦距更大的镜头,看能否拍到更大的图像,这样也许会清晰些
    Supplement 2  ·  Sep 14, 2019

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

    Supplement 3  ·  Sep 20, 2019
    发现一个 github 项目做类似的事情,学到了不少东西 https://github.com/jomjol/water-meter-measurement-system
    Supplement 4  ·  Oct 1, 2019

    最近半个月一直在研究实践上面的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

    Supplement 5  ·  Oct 15, 2019

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

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

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

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