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

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

英文论文题目: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.rhkb.cn/news/98228.html

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

相关文章

使用zoom预览出图和系统相机预览出图,画质不一样的问题分析

1、问题背景 最近在基于 Android 的平台调试一款摄像头&#xff0c;客户有反馈一个问题&#xff0c;系统自带的 Camera2 app 预览出图是正常的&#xff0c;但用 Zoom app 打开摄像头&#xff0c;出图画面存在畸变、锯齿、过曝的问题&#xff0c;现象如下图所示。 2、问题分析 …

kafka--kafka基础概念-ISR详解

kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据&#xff0c;要同步到紫色的P1S1和P1S2 如何保证一致性呢&#xff1f; 使用In Sync Replicas 也就是ISR概念 为什么不一致的&#xff1f; 因为P1S1同步数据 可能花费 50ms P1S2可能花费60ms…

java Spring Boot properties多环境配置拆分文件管理

上文 java Spring Boot yml多环境拆分文件管理优化 我们用yml 做了一个多环境配置文件的拆分管理 我们将 application.yml 改为 application.properties 参考代码如下 spring.profiles.activedev我们知道 yml 是用 : 来区分高低基本 而 properties是直接通过 . 来表达 其他基本…

重新认识小米

被镁光灯聚焦的企业&#xff0c;总是会被贴上各种标签。 8月14日&#xff0c;小米科技创始人雷军以“成长”为主题的年度演讲&#xff0c;刷遍社交网络。提到小米&#xff0c;你首先想到什么&#xff1f;手机发烧友、极致性价比&#xff0c;还是最年轻的500强&#xff1f; 这…

OLED透明屏采购指南:如何选择高质量产品?

着科技的不断进步&#xff0c;OLED透明屏作为一种创新的显示技术&#xff0c;在各个行业中得到了广泛应用。 在进行OLED透明屏采购时&#xff0c;选择高质量的产品至关重要。在这篇文章中&#xff0c;尼伽将为您提供一个全面的OLED透明屏采购指南&#xff0c;帮助您了解关键步…

ArcGIS Pro如何制作不规则形状图例

在默认的情况下&#xff0c;ArcGIS Pro生成的图例是标准的点、直线和矩形的&#xff0c;对于湖泊等要素而言&#xff0c;这样的表示方式不够直观&#xff0c;我们可以将其优化一下&#xff0c;制作不规则的线和面来代替原有图例&#xff0c;这里为大家介绍一下制作方法&#xf…

嵌入式设备应用开发(boost库应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式开发过程中不可避免在很多情况下,需要使用到posix的api函数。一方面,这些api函数确实可以帮助我们解决一些问题;但是另外一方面,因为平台的差异,如果一段时间不做嵌入式…

No114.精选前端面试题,享受每天的挑战和学习

文章目录 vue3中的ref、toRef、toRefs说明下TS的优缺点说下函数式组件说下函数式编程 vue3中的ref、toRef、toRefs 下面是对Vue 3中的ref、toRef和toRefs进行比较的表格&#xff1a; reftoReftoRefs参数类型值类型或引用类型响应式对象响应式对象返回值Ref 对象Ref 对象响应式…

cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件&#xff0c;并且支持正则/通配符&#xff0c;使用起来还是很方便的。 #语法file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])#example file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cp…

http库 之 OKHttpUtil

源码位置 方便实用&#xff0c;个人感觉不错 依赖 <dependency><groupId>io.github.admin4j</groupId><artifactId>common-http-starter</artifactId><version>0.7.5</version> </dependency>代码实践 /*** 通用http的pos…

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)。 一、简介 单点登录(Single Sign On),简称为 SSO。 它的解释是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 ❝ 所谓一次登录,处处登录。同样一处退出,处处退出。 ❞ 二…

基于ChatYuan-large-v2 微调训练 医疗问答 任务

一、ChatYuan-large-v2 上篇基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练了广告生成任务&#xff0c;总体生成效果还可以&#xff0c;但上篇文章的训练是微调的模型全部的参数&#xff0c;本篇文章还是以 ChatYuan-large-v2 作为基础模型&#xff0c;继续探索仅训练解…

Centos 8 网卡connect: Network is unreachable错误解决办法

现象1、ifconfig没有ens160配置 [testlocalhost ~]$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopba…

基于HTML+CSS+Echarts大屏数据可视化集合共99套

基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…

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

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

【面试专题】Java核心基础篇②

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Java面试专题 目录 1.接口和抽象类有什么区别&#xff1f; 2.两个对象的 hashCode() 相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f; 3.说一说hashCode()和equals()的…

机器学习基础之《分类算法(3)—模型选择与调优》

作用是如何选择出最好的K值 一、什么是交叉验证&#xff08;cross validation&#xff09; 1、定义 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成5份&#xff0c;其中一份作为验证集。然后经过5次(组)的测试&#x…

【简单认识Docker基本管理】

文章目录 一、Docker概述1、定义2.容器化流行的原因3.Docker和虚拟机的区别4.Docker核心概念 二、安装docker三、镜像管理1.搜索镜像2.下载&#xff08;拉取&#xff09;镜像3.查看已下载镜像4.查看镜像详细信息5.修改镜像标签6.删除镜像7.导出镜像文件和拉取本地镜像文件8.上传…

cloud 问题

eureka 自我保护机制 eureka 是定时去拿 统计最近15分钟的eureka实例正常的心跳占比&#xff0c;如果低于85%&#xff0c;那么就会触发自我保护机制。 触发了自我保护机制&#xff0c;eureka 暂时会把失效的服务保护起来&#xff0c;不让其过期&#xff0c;但是这些服务也不是…