基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法

英文论文题目:Tilt Correction Method of Pointer Meter Based on Deep Learning

周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724/SP.J.1089.2020.18288.

一、摘 要:

       针对仪表图像自动识别中倾斜仪表产生的读数误差,提出一种基于深度学习的圆形指针式仪表快速倾斜校正方法,可以实现仪表图像的倾斜校正和旋转校正,该方法利用卷积神经网络提取以表盘刻度数字为中心的关键点并采用最小二乘法对关键点进行椭圆拟合

        结合椭圆变换理论使用透视变换对仪表图像进行第 1 次倾斜校正,再根据一对关于仪表竖直中轴线对称的关键点计算仪表相对于水平方向的旋转角度,以拟合椭圆的几何中心为旋转中心旋转仪表图像实现第 2 次校正

        在变电站真实环境下采集图像数据,验证方法性能,实验结果表明,该方法相对于传统方法鲁棒性更好,校正有效率达到 100%,平均校正时间为0.45 s,满足实时校正需求,识别校正后的仪表图像读数的平均相对误差降低到 3.99%平均参考误差降低到 0.91%,充分显示该校正方法的有效性. 

        针对现有的指针式仪表倾斜校正方法不能同时实现仪表的倾斜校正和旋转校正,并且在校正过程中速度较慢、效果较差等问题,本文提出一种基于深度学习的指针式仪表倾斜校正方法。

二、算法检测流程

该方法分为 2 个部分:

        表盘关键点提取和仪表校正在仪表的关键点提取中,利用端到端的深度学习算法 YOLOv3 提取表盘上的以刻度数字为中心的关键点坐标。(可以网上找到仪表的图自己训练,目前没有找到作者公开的代码及数据)

关于关键点检测的方法网上资料很多,这里不做过多说明

例如下面的参考链接,提供了人脸关键点的训练方法以及检测流程

同时还提供了详细的代码和数据集

人脸与关键点检测:YOLO5Face实战_yolov5face_烧技湾的博客-CSDN博客

        仪表校正又分为倾斜校正和旋转校正,首先根据提取的关键点坐标计算透视变换矩阵,然后透视变换实现仪表的第 1 次倾斜校正:再根据图像上的一对以表盘竖直中轴线对称的关键点旋转图像实现仪表第 2 次旋转校正,图所示为本文仪表图像倾斜校正的框架图 。

三、检测效果及验证

         最后,为了验证本文校正方法相对于传统仪表校正方法[12,13]具有更好的稳定性和有效性,选择 10 幅变电站真实环境下采集的倾斜仪表图像进行实验校正.校正后的图像效果如图 12 所示,校正效率和时间如表3所示:其中有效率的统计中认为校正后的图像相对于原图有较大的比例尺度改善且可用于仪表读数,则视为校正有效.如图 12所示,部分图像经过透视变换后相对于原图像发生更大的形变,则视为校正无效,如图 12b 所示后7 幅图像及图 12c 所示后 5 幅图像 .

四、结语

        指针式仪表图像的倾斜校正是仪表读数识别研究中的一项重要任务,针对传统的图像校正方法难以满足复杂环境中仪表的校正任务,本文提出一种基于深度学习的指针式仪表倾斜校正方法该方法通过深度卷积神经网络提取表盘上以刻度数字为中心的关键点,然后根据关键点信息同时实现了仪表图像的倾斜校正和旋转校正.实验结果表明,与传统校正方法相比,本文校正方法能够得到更好的仪表校正效果,识别校正后的仪表图像提高了读数的准确度.在变电站及工业环境中采集的仪表图像会出现各种各样的倾斜,通过本 文方法倾斜校正后再识别仪表图像,提高了读数准确度,具有实用价值。

五、拓展,基于SIFT特征的仪表倾斜校正方法(opencv python代码)

import numpy as np
import cv2
from matplotlib import pyplot as plt
#参考链接
#https://www.javaroad.cn/questions/347518#toolbar-title# FIXME: doesn't work
def deskew():im_out = cv2.warpPerspective(img1, M, (img2.shape[1], img2.shape[0]))plt.imshow(im_out, 'gray')plt.show()# resizing images to improve speed
factor = 0.4
img1 = cv2.resize(cv2.imread("./img/zheng2.png", 0), None, fx=factor, fy=factor, interpolation=cv2.INTER_CUBIC)
img2 = cv2.resize(cv2.imread("./img/xie2.png", 0), None, fx=factor, fy=factor, interpolation=cv2.INTER_CUBIC)#有专利,SURF_create,SIFT_create可以直接跑
'''
1. 卸载已有安装opencv-python:pip uninstall opencv-python2. 安装opencv-contrib-python  3.2版本以下:pip install opencv-contrib-python==3.4.2
也可以不降低版本号,进行编译,详细流程见链接
https://blog.csdn.net/m0_50736744/article/details/129351648'''
surf = cv2.xfeatures2d.SIFT_create()
kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)# store all the good matches as per Lowe's ratio test.
good = []
for m, n in matches:if m.distance < 0.7 * n.distance:good.append(m)MIN_MATCH_COUNT = 10
if len(good) > MIN_MATCH_COUNT:src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)matchesMask = mask.ravel().tolist()h, w = img1.shapepts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)dst = cv2.perspectiveTransform(pts, M)deskew()img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA)
else:print("Not  enough  matches are found   -   %d/%d" % (len(good), MIN_MATCH_COUNT))matchesMask = None# show matching keypoints
draw_params = dict(matchColor=(0, 255, 0),  # draw  matches in  green   colorsinglePointColor=None,matchesMask=matchesMask,  # draw only    inliersflags=2)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
plt.imshow(img3, 'gray')
plt.show()

上面算法的效果图

上面的代码及仪表图像数据,已经上传至资源,自行下载

https://download.csdn.net/download/sunnyrainflower/88221223

#参考链接
#https://www.javaroad.cn/questions/347518#toolbar-title

特别说明

#SURF_create有专利,直接运行报错,SIFT_create可以直接跑

使用SURF_create的方法如下

一、
1. 卸载已有安装opencv-python:

      pip uninstall opencv-python

2. 安装opencv-contrib-python  3.2版本以下:

      pip install opencv-contrib-python==3.4.2

二、
也可以不降低版本号,进行编译,详细流程见链接
https://blog.csdn.net/m0_50736744/article/details/129351648


/*----------------------------------------------------------------------------------
// 作    者:    大胡子大叔
// 版权声明: 未经同意请勿转载,里面有几张图来自网络,如果侵权请联系删除
----------------------------------------------------------------------------------*/ 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…

《强化学习:原理与Python实战》——可曾听闻RLHF

前言&#xff1a; RLHF&#xff08;Reinforcement Learning with Human Feedback&#xff0c;人类反馈强化学习&#xff09;是一种基于强化学习的算法&#xff0c;通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励&#xff0c;还融合了人类专家…

kafka安装说明以及在项目中使用

一、window 安装 1.1、下载安装包 下载kafka 地址&#xff0c;其中官方版内置zk&#xff0c; kafka_2.12-3.4.0.tgz其中这个名称的意思是 kafka3.4.0 版本 &#xff0c;所用语言 scala 版本为 2.12 1.2、安装配置 1、解压刚刚下载的配置文件&#xff0c;解压后如下&#x…

【机器学习】处理不平衡的数据集

一、介绍 假设您在一家给定的公司工作&#xff0c;并要求您创建一个模型&#xff0c;该模型根据您可以使用的各种测量来预测产品是否有缺陷。您决定使用自己喜欢的分类器&#xff0c;根据数据对其进行训练&#xff0c;瞧&#xff1a;您将获得96.2%的准确率&#xff01; …

Integer中缓存池讲解

文章目录 一、简介二、实现原理三、修改缓存范围 一、简介 Integer缓存池是一种优化技术&#xff0c;用于提高整数对象的重用和性能。在Java中&#xff0c;对于整数值在 -128 到 127 之间的整数对象&#xff0c;会被放入缓存池中&#xff0c;以便重复使用。这是因为在这个范围…

Python绘制爱心代码(七夕限定版)

写在前面&#xff1a; 又到了一年一度的七夕节啦&#xff01;你还在发愁送女朋友什么礼物&#xff0c;不知道怎样表达你满满的爱意吗&#xff1f;别担心&#xff0c;我来帮你&#xff01;今天&#xff0c;我将教你使用Python绘制一个跳动的爱心&#xff0c;用创意和幽默为这个…

Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一&#xff1a;错误出现 这个错误的意思是&#xff0c;拒绝将字符串评估为 JavaScript&#xff0c;因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二&#xff1a;错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…

JavaWeb_LeadNews_Day6-Kafka

JavaWeb_LeadNews_Day6-Kafka Kafka概述安装配置kafka入门kafka高可用方案kafka详解生产者同步异步发送消息生产者参数配置消费者同步异步提交偏移量 SpringBoot集成kafka 自媒体文章上下架实现思路具体实现 来源Gitee Kafka 概述 对比 选择 介绍 producer: 发布消息的对象称…

寻路算法小游戏

寻路算法小demo 寻路算法有两种&#xff0c;一种是dfs 深度优先算法&#xff0c;一种是 dfs 深度优先算法 深度优先搜索的步骤分为 1.递归下去 2.回溯上来。顾名思义&#xff0c;深度优先&#xff0c;则是以深度为准则&#xff0c;先一条路走到底&#xff0c;直到达到目标。这…

矩形重叠问题

矩形重叠 文章目录 题目描述解题思路方法一方法二 题目描述 矩形以列表 [x1, y1, x2, y2] 的形式表示&#xff0c;其中 (x1, y1) 为左下角的坐标&#xff0c;(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴&#xff0c;左右边平行于 y 轴。 如果相交的面积为 正 &#xff0…

linux tomcat server.xml 项目访问路径变更不生效

如果想改成默认的127.0.0.1:8080 访问项目 先确定更改的作用文件 server.xml 的 host:appBase 标签 默认找到appBase webapps 下的war包&#xff0c;并解压&#xff0c;解压后的appname为访问路径 也就变成了 127.0.0.1:8080/appname host:Context:path 标签 appBase的 优先…

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…

菜鸟Vue教程 - 实现带国际化的注册登陆页面

初接触vue的时候觉得vue好难&#xff0c;因为项目中要用到&#xff0c;就硬着头皮上&#xff0c;慢慢的发现也不难&#xff0c;无外乎画个布局&#xff0c;然后通过样式调整界面。在通过属性和方法跟js交互。js就和我们写的java代码差不多了&#xff0c;复杂一点的就是引用这种…

Python数据分析实战-多线程并发处理列表(附源码和实现效果)

实现功能 Python数据分析实战-多线程并发处理列表 实现代码 import threading有15个列表&#xff0c;尝试多进程并发处理&#xff0c;每个列表一个进程&#xff0c;进程数和 CPU 核数一致def sum_list(lst):return sum(lst)if __name__ __main__:lists [[1,2,3], [4,5,6], …

BDA初级分析——SQL清洗和整理数据

一、数据处理 数据处理之类型转换 字符格式与数值格式存储的数据&#xff0c;同样是进行大小排序&#xff0c; 会有什么区别&#xff1f; 以rev为例&#xff0c;看看字符格式与数值格式存储时&#xff0c;排序会有什么区别&#xff1f; 用cast as转换为字符后进行排序 SEL…

mysql+jdbc+servlet+java实现的学生在校疫情信息打卡系统

摘 要 I Abstract II 主 要 符 号 表 i 1 绪论 1 1.1 研究背景 1 1.2 研究目的与意义 2 1.3 国内外的研究情况 2 1.4 研究内容 2 2 系统的开发方法和关键技术 4 2.1 开发方法 4 2.1.1 结构化开发方法 4 2.1.2 面向对象方法 4 2.2 开发技术 4 2.2.1 小程序开发MINA框架 4 2.2.2 …

快速搭建图书商城小程序的简易流程与优势

很多人喜欢阅读电子书&#xff0c;又有很多人依旧喜欢实体书&#xff0c;而实体书店拥有一个图书商城小程序便成为了满足用户需求的理想选择。如果您也想进入这一充满潜力的领域&#xff0c;但担心开发难度和复杂流程&#xff0c;别担心&#xff01;您能做到快速搭建一个专业、…

【令牌桶算法与漏桶算法】

&#x1f4a7; 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

2023年Java核心技术面试第五篇(篇篇万字精讲)

目录 十 . HashMap&#xff0c;ConcurrentHashMap源码解析 10.1 HashMap 的源码解析&#xff1a; 10.1.1数据结构&#xff1a; 10.1.2哈希算法&#xff1a; 10.1.3解决哈希冲突&#xff1a; 10.1.4扩容机制&#xff1a; 10.1.5如何使用 HashMap&#xff1a; 10.2 HashMap 关注…

开源后台管理系统Geekplus Admin

本系统采用前后端分离开发模式&#xff0c;后端采用springboot开发技术栈&#xff0c;mybatis持久层框架&#xff0c;redis缓存&#xff0c;shiro认证授权框架&#xff0c;freemarker模版在线生成代码&#xff0c;websocket消息推送等&#xff0c;后台管理包含用户管理&#xf…