随着人工智能的发展,现在各行各业都在开始被AI渗透,其中最成功的当属工业,尤其是在安防、巡检板块。该文章将就工业中比较有挑战的仪表识别进行记录,免得自己以后忘了。毕竟做算法这一块,逻辑是最关键的,打死也不能忘的
该文章的方案是已实际应用到工程中,并部署到实际场景且通过测试和验收
#
torch 1.7.1
torchvision 0.8.2
scipy 1.6.0
numpy 1.19.5
opencv-contrib-python 4.5.1.48
opencv-python 4.5.1.48
pycocotools 2.0
图1
图2
图3
图4
图5
图6
从技术的角度,我将他们分为了4种,针对四种类型,分别做了一个project
就像图1、图2、图4,这种类型的仪表应该是最简单的
1、检测识别刻度
2、检测指针位置
3、计算度数
考虑到实际情况可能会出现超视距识别,就是小目标识别,而且我当时处理的时候实时要求比较高,但是得到的硬件支持又不足,所以,优先采用的yolo5x去进行刻度度数检测识别。
我们事先是采集了足够量的各种规格的仪表数据,所以就对所有仪表统一进行了表盘的度数识别(字符识别),获取到每个数字度数的值以及它所在的位置
这儿需要注意:模型输出的object会是一个最小外接框,但是考虑实际情况并不会是每张图都中规中矩的,会出现
图像畸变、倾斜等各种问题。所以,在进行这一步’我叫做度量定位‘的时候,会加入透视变换对图像进行矫正,使用
矫正之后的图像去进行后续步骤【训练的时候不需要提前进行透视变换】
检测指针采用的unet分割模型,分割效果没话说,杠杠的
这个模块,其实算法也很重要。模型检测出刻度度数、指针位置后,需要用算法去计算详细读数。对于这种仪表,逻辑也很简单,就是获取指针相邻的两边的度数,然后根据度数的坐标、加上偏移量,则可用数学的方式计算出读数
【此处我自定义了很多校验函数,在计算的过程中不停的进行各种偏移矫正,尽最大可能纠正误差】
如图5
这种类型的仪表思路和单指针、单刻度仪表的思路是相似的,不同之处在于:
单指针的分割图就一个目标,很轻松的就能随意获取需要的信息。但是多指针不同,他们的指针可能存在多种情况,尤其是指针会出现交叉情况。所以
需要对分割图进行线性拟合,获取到多根指针的信息
对于单行的刻度,也可能会像图5一样出现分段的情况
这里我采取的方案是提前定义刻度组合策略,例如:左边的刻度是 -10–70, 右边的是10 - 60。则根据模型识别出的结果,参考坐标对模型的结果进行组合,组合的结果就是各个不同的刻度段
剩下的思路就是延用单指针的思路
这种仪表稍微复杂一点点,也只是一点点。总的可以用下面一张图概括:
理论上它和上面的单指针仪表采用一样的方案也是可以的。当然,值存在于理论上,反正我自己用那个方案做出来的结果,惨不忍睹。
我开始按着百度飞浆官方的提案做了一次。不得不说,大厂果然是大厂,做的东西太理想【儿戏】化了,拿到实际场景完全没用。不过呢,也还是借鉴了一些思路
凡是做仪表,都离不开语义分割的哈。
这种仪表变态之处在于它的指针,真是一反常态,特别细小。还有,这种实际情况中,一旦有倾斜,刻度也比较不好识别。我前后试了好几种针对小目标的模型,效果都不尽如人意,最后,借鉴了飞浆推荐的deeplabv3,分割出来如上图【上图展示的分割图是我过度膨胀了的,实际模型出来的结果拟合还是挺好的】
将分割的刻度图进行过度膨胀,我使用的是(23, 23),还是够过度的。然后对膨胀的分割图进行圆拟合
指针分割出来后,直接采用最小二乘法进行线性拟合,当然,也可以用Hough变换进行检测,两种方法我都用了,效果不分伯仲。
我是一向崇尚sobel算子的,但是,既然发现有现成的api,就不能浪费前辈的功劳
找到指针指向的刻度位置,说白了,就是找到拟合的这个指针线与圆弧的交点、或者最近点
当确定了刻度的两个端点与交点这三个点后,剩下的就交给数学了
同样,里面需要在拟合、计算的时候加入偏移量进行控制,防止误差越滚越大
如果有好的建议,欢迎留言
也欢迎大家交流2577082896 vx/qq同号
如确有需要,可直接在我的资源中下载文档或者项目文件