研究生即将毕业,整理了去年完成的一个仪表识别的项目。目前已经落地应用,所以也在github上将主要代码开源,希望可以对相关研究者有所启发,很多问题也可以一起讨论。
本项目主要针对于自然场景下的指针仪表识别。因为对于数字仪表而言其实是个纯OCR问题,我们也用一些方法设计了方案,成熟以后会开源。对于指针仪表而言,主流的识别原理主要通过提取指针位置,零刻度位置,量程数字。最后通过三者之间的角度换算。画了张示意图简单介绍这个原理:
假设绿色箭头和红色箭头角度为
θ
1
\theta_1
θ1
,蓝色箭头(指针位置)和红色箭头(零刻度)角度为
θ
2
\theta_2
θ2
,量程是
α
α
α(本图为0.04) 。那么最后识别的结果就是
α
×
θ
1
θ
2
\alpha \times \frac{\theta_1}{\theta_2}
α×θ2θ1
基于此原理,我们设计了三阶段的仪表识别系统,分别为仪表检测,仪表矫正,仪表识别。
第一阶段为仪表检测。主要为了从远距离自然场景中图像获得仪表区域,通过排除背景干扰来提高后续处理效果。这个问题和目标检测类似,因此我们直接用开源的YOLOv5来检测。数据集已开源。
第二阶段为仪表矫正。坦率说这部分做的并不好,主要通过分割网络得到仪表外轮廓。然后用椭圆进行拟合,而椭圆的外接圆就是理想的校正后区域。因此椭圆-外接圆就有了四对matching points,用它可以去做透视变换了。这样做的缺点主要是速度慢,论文里用了新的训练方法但是还是开销比较大,因此项目里并没有放这部分的代码进去。大家可以考虑用传统方法去进行校正。
第三阶段为仪表识别,这部分自己搭建了一个网络用于多任务训练。主干网络可以是vgg或者resnet, 得到特征图后出几个通道用于分割相关的元素,例如指针预测,刻度预测。损失函数用的都是分割的dice loss,同时用了OHEM等方法提高效果。同时还有一个分支用于OCR识别量程,具体即使根据量程所在区域(0.04)的特征构建文字识别头,用CTC文字识别损失函数去预测。这块跟端到端的文字提取模型非常类似。这部分的训练代码和数据集也已经开源。详细的说明可以去看论文中的描述。
最后放一些效果图
欢迎对本项目感兴趣的同学使用以及提issue!
论文地址:https://arxiv.org/pdf/2302.14323.pdf
代码地址:https://github.com/shuyansy/Detect-and-read-meters