基于深度学习的机器视觉表计识别

01 引言

针对仪表自动读数问题,新型数字式仪表的读数比较方便,现阶段已经有非常多成熟的方案落地,而针对传统指针式仪表自动读数的现有方案还不够成熟,存在识别不精确、易受环境干扰等问题,是亟待研究和攻克的难题。我们针对指针式仪表的读取设计了一种基于Im-YOLOv4-Tiny的表计识别算法。

02 基于Im-YOLOv4-Tiny的表计识别算法

实现表计识别算法自动识别,共有四步:仪表数据集制作与处理及迁移学习预训练、Im-YOLOv4-Tiny网络模型构建、网络训练策略及超参数设定、指针定位与自动识数。

第一步:仪表数据集制作与处理

在“变电站巡检”项目中,存在大量的表计图像,深度学习模型可以提取图片中的特征信息,结合项目中能获取的大量图片去持续优化深度学习模型可以帮助模型学习表计相关的特征信息,从图像中获取到有效且普遍的特征则需要大量的数据集。同时在训练过程中采用了数据扩增,在提升训练数据的多样性的同时,提升模型的泛化能力。

表盘在使用的过程中可能受到时间、角度、光照、焦距等影响存在磨损、倾斜、反光模糊等问题。所以在样本选择时,加入上述异常状态样本进行训练。

图片

异常状态样本图片数据集

第二步:Im-YOLOv4-Tiny网络模型构建

Im-YOLOv4-Tiny模型的搭建由:由骨干特征提取网络、特征金字塔和YoloHead三部分组成。网络的第一部分骨干特征提取网络主要用于输入图片前期的特征提取,在图像输入时会将图像进行resize,将图像处理成尺寸为416×416×3的输入图像,之后放入后续网络提取特征,骨干网络由卷积模块和残差模块组成。卷积模块中除了包含普通的卷积操作,还包含标准化和激活函数,为了避免梯度方向锯齿问题、使用了LeakyReLU作为激活函数。改进模型结构如下:

图片

 Im-YOLOv4-Tiny网络模型

网络的第二部分特征金字塔是对骨干特征提取网络的输出进行加强特征提取,从骨干网络的上层和下层分别取出两个维度为(26,26,256)和(13,13,512)的特征层进行特征提取,并将不同维度的特征层经过卷积和采样进行特征融合,通过不同尺度的特征结合来提取出更有利的特征。最后将两个融合后的特征图放入YoloHead进行预测。

由于制作的训练集规模较小,为了进一步丰富数据集,引入了实时Mosaic数据增强。每一次训练前,从训练集中取出一个batch的图片,从这个batch中随机取出4张图片进行裁剪拼接,重复batchsize次后生成新的一个batch的图片放入网络进行训练。通过这种图像随机组合拼接的方式,丰富检测物体的背景,增加数据集各尺度的目标数量。其流程如下:

图片

数据增强流程

第三步:网络训练策略与超参数设定及迁移学习微调预训练模型

利用“迁移学习”算法将设计好的网络在其他数据集中进行特征学习,之后将学习到特征的网络进行部分网络结构冻结以保留学习到的特征,再将冻结部分结构的网络以目标任务的数据集进行预训练,预训练结束以后再将网络解冻作为初始权重网络。在迁移学习的数据集中包含了变电站的各类电表,如电压表、电流表、功率表、SF6气压表等,其中大部分为圆形仪表图像,但由于图像分辨率低,大部分图像连肉眼无法对仪表进行读数,因此仅作为迁移学习定位仪表用。

(1)损失函数改进优化

YOLO网络的损失函数主要包含三部分:正负样本的损失函数、预测种类的损失函数,以及IoU Loss。通过对IoU函数的改进新函数为GIoU,其中C表示包围两个框的最小外接矩形的面积。通过矩形大小可以反映两个框的距离,通过IoU反映相交程度,减去二者未相交部分矩形的比例,既能反映重合程度,又能对未重合的情况进行量化表示。

图片

损失函数改进

(2)学习率

学习率采用了TensorFlow中的ReduceLROnPlateau方法控制,这是一种在训练过程中逐步下降学习率的方法,使用固定学习率常常导致网络训练效果不理想,通过学习率逐步下降的方式既能在开始时损失函数收敛更快,又能在训练到尾声时损失函数能够收敛到较小处。

(3)训练策略

训练策略方面主要采用了三个策略:第一个策略是在训练开始前需要冻结网络的部分权重,训练过50个epoch之后再将权重解冻,主要是为了保持迁移学习所学习到的权重特征;第二个策略是在训练过程中加入了Dropout策略,即全连接层有一定概率断开部分连接,可以在训练时减少参数量;第三个策略则是在训练即将结束时,加入了Earlystop策略,即当损失函数在一定数量的epoch之后不再变化时就认为已经达到最好的效果,提前结束训练。

第四步:指针定位与自动读数算法

将仪表裁剪出来进行指针的识别和读数,基于霍夫圆检测和轮廓检测的指针分离算法,将指针在原图像上标识出来,并使用极坐标展开法和阈值分割法进行关键刻度线的分离以及指针读数,算法的基本流程如图所示。

图片

指针定位与自动读数算法

(1)指针定位

使用高斯滤波对裁剪后的图像进行降噪,将其转换为灰度图后采用自适应阈值二值化的方法获取仪表盘的二值化图像。

图片

图像预处理流程图

经过霍夫圆检测裁剪以后的图像四角的背景已经被剔除,仪表圆心也被定位出来了,之后使用轮廓检测算法来分离指针。为了进一步分离指针,采用了膨胀和腐蚀细化了表盘边缘,进一步突出了指针,最后采用霍夫直线检测法。

图片

表盘指针定位

(2)读数计算

读数计算通过分离刻度线来实现,通过极坐标展开的方法进行刻度线分离,将仪表盘边缘的圆环展开成一条矩形带,矩形带宽度为2/5r,长度为2πr,将圆环上的点记为(x,y)和原图的坐标记为(X,Y),加入补偿以后其对应关系如公式中w为圆环长度2πr,r为表盘半径,W、H为原图的宽和高。

图片

表盘拉伸对应关系式

展开之后如极坐标展开图所示。将圆环带进行二值化并经过一次膨胀和腐蚀操 作去除部分噪点干扰,如圆环带二值化图所示。之后使用一条纵向直线对圆环带进行 横向扫描,筛选出可能存在刻度线的位置,可以看到图像中存在刻度线的位置, 其有效像素会超过一定的阈值,通过多次试验求得最佳阈值为 4/9 的圆环带宽度, 扫描并记录下被认定为是刻度线的 X 坐标数组,并在圆环图上以红线标记。因为指针的存在,在横向扫描时也会将指针所在位置判定为刻度线位置,可以利用极坐标展开图中最下方像素即指针位置标绿来排除指针对于刻度线定位的影响, 同时也将刻度线所在直线标红。最终标记后圆环图如关键刻度线分离图所示。

图片

图片

刻度线分离流程图

实际刻度线在圆环带上存在一定宽度,因此在X坐标数组中每处刻度线可能存在一簇连续的横坐标被记录,因此需要对这些连续的X坐标求平均作为该刻度线所在位置的坐标。除此之外,还需考虑当指针与关键刻度线重合,此时求平均后处理完的X坐标数组会少一个关键刻度信息,此时可以根据指针与左右两侧刻度线数量的关系求出指针所指向刻度的值。而当指针并未与关键刻度线重合时,记平均后的关键刻度线数组为[X1,X2,,X3…Xn],刻度线对应数值记为[V1,V2,,V3…Vn],指针位置为T,利用位置关系与比例法公式计算读数。

图片

图片

读数计算公式

至此,整个基于深度学习的机器视觉表计识别过程就已经结束了通过对样本图像数据的收集,样本扩充,算法模型搭建、训练,刻度线分离以及利用位置关系与比例法公式计算读数。

“Im-YOLOv4-Tiny 的表计识别算法”与“传统的表计识别算法”相比,由于检测的指针式仪表种类、量程等各不相同,传统的图像处理后在进行表计识别的两段式识别不同的是,Im-YOLOv4-Tiny采用机器学习的方式进行自动识别读数,充分展示了利用机器视觉算法对表计识别的可行性。

(3)实验验证

将算法应用于实际采集中对表计进行读数识别,对于1000 张各种状态下的仪表图像进行机器视觉识表,最终识别成功 1000 张,识别失败 0 张,识别成功率达到了100%。偏差维持在±1%以内。以下是部分典型识别结果表和识别图。

下图:实验验证结果表

图片

图片

实验验证典型图

03 后续展望

对于基于Im-YOLOv4-Tiny的仪表定位算法,仪表定位已经比较准确,速度也能满足实时性要求,使用基于轮廓检测和极坐标展开法的指针分离与读数识别方法,在表盘的识别正确率上也能满足一般工业对表计识别准确度的要求,并在项目中已得到验证。

我国工业仪表和公用事业单位表计总量超过60亿,广泛应用于石油、燃气、化工、电力、制造、水务等行业。仪表作为生产经营活动中的关键核心计量设施,在可靠性、稳定性、准确性方面要求严苛。在生产过程中产生的数据作为关键过程参数,对于保证生产安全、生产质量及效益至关重要。利用视觉算法对仪表图像进行识别和上传,就能轻松地完成所有仪表的读数和记录工作。这不仅大大简化了工作流程,节省了人力物力,还提高了工作效率,基于机器视觉的表计识别研究具有广阔的市场前景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/95670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ICS PA1

ICS PA1 init.shmake 编译加速ISA计算机是个状态机程序是个状态机准备第一个客户程序parse_argsinit_randinit_loginit_meminit_isa load_img剩余的初始化工作运行第一个客户程序调试:零断点TUI 基础设施单步执行打印寄存器状态扫描内存 表达式求值词法分析递归求值…

Vue.js2+Cesium1.103.0 十一、Three.js 炸裂效果

Vue.js2Cesium1.103.0 十一、Three.js 炸裂效果 Demo ThreeModelBoom.vue <template><div:id"id"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint-d…

20 MySQL(下)

文章目录 视图视图是什么定义视图查看视图删除视图视图的作用 事务事务的使用 索引查询索引创建索引删除索引聚集索引和非聚集索引影响 账户管理&#xff08;了解非DBA&#xff09;授予权限 与 账户的相关操作 MySQL的主从配置 视图 视图是什么 通俗的讲&#xff0c;视图就是…

(Windows )本地连接远程服务器(Linux),免密码登录设置

在使用VScode连接远程服务器时&#xff0c;每次打开都要输入密码&#xff0c;以及使用ssh登录或其它方法登录&#xff0c;都要本地输入密码&#xff0c;这大大降低了使用感受&#xff0c;下面总结了免密码登录的方法&#xff0c;用起来巴适得很&#xff0c;起飞。 目录 PowerSh…

数据仓库总结

1.为什么要做数仓建模 数据仓库建模的目标是通过建模的方法更好的组织、存储数据&#xff0c;以便在性能、成本、效率和数据质量之间找到最佳平衡点。 当有了适合业务和基础数据存储环境的模型&#xff08;良好的数据模型&#xff09;&#xff0c;那么大数据就能获得以下好处&…

深入了解Nginx:高性能的开源Web服务器与反向代理

一、Nginx是什么 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;也可以作为负载均衡器和HTTP缓存服务器使用。它采用事件驱动、异步非阻塞的处理方式&#xff0c;能够处理大量并发连接和高流量负载&#xff…

supervisorctl(-jar)启动配置设置NACOS不同命名空间

背景 由于需要在上海服务器上面配置B测试环境&#xff0c;原本上面已有A测试环境&#xff0c;固需要将两套权限系统分开 可以使用不同的命名空间来隔离启动服务 注&#xff1a;本文章均不涉及公司机密 1、新建命名空间 命名空间默认会有一个public&#xff0c;并且不能删除&a…

Java 中数据结构HashMap的用法

Java HashMap HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中&#xff0c;词向量&#xff08;…

分布式集群框架——有关zookeeper的面试考点

3.掌握Zookeeper的概念 当涉及到大规模分布式系统的协调和管理时&#xff0c;Zookeeper是一个非常重要的工具。 1. 分布式协调服务&#xff1a;Zookeeper是一个分布式协调服务&#xff0c;它提供了一个高可用和高性能的环境&#xff0c;用于协调和同步分布式系统中的各个节点…

js深拷贝三种方法

使用递归函数实现深拷贝 const obj {name: zzz,age: 18,hobby: [篮球, 足球],family: {baby: baby}} // 深拷贝 数组 对象 一定要先筛数组再筛对象,因为万物皆对象function deepcopy(newObj, oldObj) {for (const k in oldObj) {// 判断值是否属于array类if (oldObj[k] i…

[Android AIDL] --- AIDL工程搭建

0 AIDL概念 AIDL&#xff08;Android Interface Definition Language&#xff09;是一种 IDL 语言&#xff0c;用于生成可以在 Android 设备上两个进程之间进行进程间通信&#xff08;IPC&#xff09;的代码。 通过 AIDL&#xff0c;可以在一个进程中获取另一个进程的数据和调…

FPGA VR摄像机-拍摄和拼接立体 360 度视频

本文介绍的是 FPGA VR 相机的第二个版本&#xff0c;第一个版本是下面这样&#xff1a; 第一版地址&#xff1a; ❝ https://hackaday.io/project/26974-vr-camera-fpga-stereoscopic-3d-360-camera ❞ 本文主要介绍第二版本&#xff0c;第二版本的 VR 摄像机&#xff0c;能够以…

从零做软件开发项目系列之八——系统部署调试

前言 软件项目的部署和调试工作是项目开发生命周期中的重要阶段&#xff0c;它涉及将开发完成的软件应用程序部署到目标环境并进行测试和调试&#xff0c;以确保系统能够正常运行并满足用户需求。本文将详细描述软件项目的部署和调试工作。 1 硬件基础设施和操作系统及基本软…

Python科研绘图--Task05

目录 SciencePlots 安装SciencePlots 安装LaTeX ① 安装 MikTex 和 Ghostscript ② 将软件的安装路径添加到系统环境变量中 SciencePlots 绘图示例 SciencePlots 虽然 Matplotlib 或 ProPlot 库能够绘制出插图结果&#xff0c;但用户还需要根据期刊的配图绘制要求进行…

Flink CDC介绍

1.CDC概述 CDC&#xff08;Change Data Capture&#xff09;是一种用于捕获和处理数据源中的变化的技术。它允许实时地监视数据库或数据流中发生的数据变动&#xff0c;并将这些变动抽取出来&#xff0c;以便进行进一步的处理和分析。 传统上&#xff0c;数据源的变化通常通过…

PCL common模块应用实例

目录 一、common模块中的头文件二、基本函数1、angles.h2、centriod.h3、common.h4、distance.h5、copy_point.h6、geometry.h参考链接本文由CSDN点云侠原创,

Excel:如何实现分组内的升序和降序?

一、POWER 1、构建辅助列D列&#xff0c;在D2单元格输入公式&#xff1a; -POWER(10,COUNTA($A$2:A2)3)C2 2、选中B1:D10&#xff0c;注意不能宣导A列的合并单元格&#xff0c;进行以下操作&#xff1a; 3、删除辅助列即可 二、COUNTA 第一步&#xff0c;D2建立辅助列&#xf…

day 6 c++

#include <iostream>using namespace std; class Animal { public:Animal(){cout << "训练员的无参构造" << endl;}virtual void perform(){} }; class Tiger:public Animal {string tezheng;string biaoyan; public:Tiger(){cout << "…

财务部发布《企业数据资源相关会计处理暂行规定》

导读 财务部为规范企业数据资源相关会计处理&#xff0c;强化相关会计信息披露&#xff0c;根据《中华人民共和国会计法》和相关企业会计准则&#xff0c;制定了《企业数据资源相关会计处理暂行规定》。 加gzh“大数据食铁兽”&#xff0c;回复“20230828”获取材料完整版 来…