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

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

  •  
  •   msmmbl · 65 天前 · 3612 次点击
    这是一个创建于 65 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自从用上了 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 条附言  ·  64 天前
    已订购焦距更大的镜头,看能否拍到更大的图像,这样也许会清晰些
    第 2 条附言  ·  60 天前

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

    第 3 条附言  ·  55 天前
    发现一个 github 项目做类似的事情,学到了不少东西 https://github.com/jomjol/water-meter-measurement-system
    第 4 条附言  ·  43 天前

    最近半个月一直在研究实践上面的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 条附言  ·  30 天前

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

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

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

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