最近在做一个工业巡检的项目,主要涉及的内容是指针型表计的读取。本系列文章主要介绍实现表计读取的全流程开发(立个FLAG,想想真是肝...留下了不争气的眼泪),其中主要使用的工具为百度开发的PaddleX和Visual studio 2019。
如有问题,欢迎联系,作者微信:yikeAI14539
一般来讲,在工业领域使用深度学习技术来实施的项目主要为工业质检和工业巡检两部分,实现这两部分的流程均为:
![v2-209fd6b2ebff7977b375ff48e88bb249_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/c0b0e911f540d0236f13cfd787990ba0.png)
本系列文章的内容包含了上述流程的全部内容,其目录如下:
- 高效语义分割:基于PaddleX零代码快速实现表计分割
- 工业场景适配:Windows下PaddleX的C++编译、C#界面开发及dll调用
- 表计读取实战:表计读取算法开发方案
李是Lyapunov的李:工业党福利:使用PaddleX高效实现指针型仪表读取系列文章(1)
李是Lyapunov的李:工业党福利:使用PaddleX高效实现指针型仪表读取系列文章(2)
李是Lyapunov的李:工业党福利:使用PaddleX高效实现指针型仪表读取系列文章(3)
正文开始:
三、表计读取实战:表计读取算法开发方案
本节目录
- 上节回顾
- 表计读取流程
- 表计读取实现
1. 上节回顾
在系列文章的第二篇中,我们实现了C++预测代码的dll封装,并使用C#开发界面调用dll,最终实现压力表的分割。从下面的两张图片可以看出来,压力表的刻度和指针的分割效果还是非常好的,给后续的表计读取打下了很好的基础。
![v2-3041bef1da90f89df9d49a8728178a4e_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/9c6d685ca7984032ff0fa54035b92d30.jpeg)
![v2-0422932edeb854eb79c986543d6a4fc1_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/256e95f7f51ed59b158604115733afe5.jpeg)
2、表计读取流程
在整个表计读取的过程中,一般经过以下流程:
(1)采取车载相机或固定监控相机的方式,拍摄出高清表计图像。
(2)首先使用目标检测网络,定位单个表计的位置,输出单幅表计图像,一般使用YOLOv3等目标检测网络。
![v2-bd762830b92450f7a2ce3d6fbf7df9fb_b.png](https://i-blog.csdnimg.cn/blog_migrate/7637468e0a3cce42e4b430ecd5372c0c.png)
(3)将单幅表计图像喂入语义分割网络,提取出表计的刻度和指针。
(4)使用表计读数的计算算法,最终实现表计的读取。
本文的内容主要是读数计算这一部分。
在读数计算中,技术方案有很多,比如根据刻度线的位置和角度来计算读数,或者将表计展开为矩形后,由刻度的位置来计算读数,本文采取后一种方案。该方案的读取流程为:
![v2-1ad429931f8a9264425a2a4bc2b7105c_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/0cccd8a17cc2d76153f68a5307fb3763.jpeg)
下面按照流程中的步骤,一步一步讲解。
3、表计读取实现
(1)环形图像展开为矩形图像
将环形图像展开为矩形图像的核心在于找到表计的最外圆,目前主流的方法是使用霍夫变换来检测圆。
经过测试发现,使用二值化后的图像来检测外圆会更加准确。因此,首先对分割后的图像进行二值化操作。
在使用霍夫变换法检测圆之前,需要先对图像进行滤波降噪来达到平滑图像的目的。滤波的方法包括均值滤波、中值滤波和高斯滤波等等。滤波的作用是为了减少噪点对于圆形检测的影响。如下图所示,很多时候在检测圆时出现乱线或者多个圆,有很大的可能就是因为没有做好图像滤波工作。
![v2-32514c90d5311e9ce75b4e5b4559c15f_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/bc71baa87cd224a9acd96156d0740b03.jpeg)
在准确地检测出外圆后,就很容易将圆环展开为矩形了。
(2)二维图像转为一维数组
将二维图像转为一维数组是一个非常巧妙的指针和刻度定位方法。
如下图所示,通过记录刻度和指针的label标签(或者颜色),可以将矩形图像从头到尾的标签或颜色的数值记录在一个一维数组中。如下图所示,以像素为例,黑色数字表示刻度的像素数值(记为像素1),红色数字表示指针的像素数值(记为像素2)。
![v2-6df5258cda996290cefef3465377475d_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/e05e047cb79fba52ccac7aea4008ad54.png)
(3)数据过滤
数据过滤是为了使得一维数组的区分度更加明显,如果分割的效果比较好的话,数据过滤对最终读取结果的影响就不是很明显。
(4)刻度与指针定位
在二维图像转为一维数组中定义了两种像素:像素1和像素2,分别对应刻度和指针。假设,像素1以10为阈值,像素2以60为阈值,可得:
![v2-0929fff793fff97f157388ef5f7123b1_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/e3e53851701e768eec52dc080c1cdc6f.jpeg)
通过这种方法,可以很巧妙的定位出刻度的首尾位置,以及指针的位置。
(5)表计规格匹配
表计规格匹配是在读取多种规格的仪表时使用,长得一样的表格,量程是有可能不一样的,比如下图的这两种压力表,量程差了10倍。在做表计分割的时候,这两种表可以用同样的模型来做,在最终读数的时候要根据具体的量程来做匹配。为了增强通用性,表计的规格一般不固定死,应该设置为可灵活选择。
![v2-5bcbc3242d42e944d06043d15bdd5f08_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/3bf09e6ee530c9f0d44062ace1fc50b4.png)
(6)读数计算
通过以上的流程,就可以实现指针型仪表的读取。读取出的读数为0.917,实际的读数约为0.925,还是比较准确的。
![v2-d613cbde2d4b2527b2f8a1c777bf36f7_b.png](https://i-blog.csdnimg.cn/blog_migrate/8287cf257f0e34e9cad6814cddcdd7d6.png)
由于工作关系不方便,这一部分的代码就不放上面了,有需要的话可以联系我,再共同学习和讨论。
欢迎转发。如需转载,或有相关问题,欢迎联系。作者微信:yikeAI14539
![v2-ea8854df905c6fbb9a14f7f9b822b22c_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/21258f1ce77cd0a8c8dd17913c686a6d.png)