中文论文题目:基于深度学习的指针式仪表倾斜校正方法
英文论文题目: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-python
2. 安装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.shape
pts = 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 color
singlePointColor=None,
matchesMask=matchesMask, # draw only inliers
flags=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
/*----------------------------------------------------------------------------------
// 作 者: 大胡子大叔
// 版权声明: 未经同意请勿转载,里面有几张图来自网络,如果侵权请联系删除
----------------------------------------------------------------------------------*/