中国語の論文タイトル:深層学習に基づくポインタ器具の傾き補正方法
英語論文タイトル:ディープラーニングに基づくポインタメーターの傾き補正手法
Zhou Dengke、Yang Ying、Zhu Jie、Wang Ku.深層学習に基づくポインタ機器の傾き補正方法[J].Journal of Computer-Aided Design and Graphics、2020、32(12):9.DOI:10.3724/SP。 J .1089.2020.18288。
1. 要約:
メーター画像の自動認識におけるメーターの傾きによる読み取り誤差に着目し、畳み込み演算を利用したメーター画像の傾き補正と回転補正を実現する深層学習に基づく円形指針メーターの高速傾き補正手法を提案する。抽出するニューラルネットワーク ダイヤルスケール番号を中心のキーポイントとし、最小二乗法を用いてキーポイントを楕円に当てはめます。
楕円変換理論と組み合わせて、透視変換を使用して計器画像に最初の傾き補正を実行し、次に、画像の垂直中心軸に関して対称な 1 対のキーポイントに従って、水平方向に対する計器の回転角度を計算します。測定器を使用し、フィッティング楕円の幾何学的中心を回転として使用します。中心は、2 回目の補正のためにゲージ画像を回転させます。
この方法の性能は、変電所の実環境で画像データを収集することによって検証されています。実験結果は、この方法が従来の方法よりも堅牢であることを示しています。機器の画像読み取り値の平均相対誤差は 3.99% に減少しました」 、平均基準誤差は 0.91% に減少しており、補正方法の有効性が十分に示されています。
既存の指針式メーターの傾き補正方法ではメーターの傾き補正と回転補正を同時に実現できず、補正処理が遅く効果が乏しいという問題点に着目し、本論文は指針式メーターの傾き補正方法を提案する。深層学習に基づいたポインターメーター。
2. アルゴリズム検出処理
この方法は 2 つの部分に分かれています。
ダイヤルのキーポイント抽出と計器のキャリブレーション 計器のキーポイント抽出では、エンドツーエンドの深層学習アルゴリズム YOLOv3 を使用して、目盛番号を中心としたダイヤル上のキーポイント座標を抽出します。(この機器の図はインターネット上で見つけることができ、自分でトレーニングすることができますが、著者が公開したコードやデータは今のところ見つかっていません)
キーポイントの検出方法についてはインターネット上にたくさんの情報があるので、ここではあまり説明しません。
たとえば、次の参考リンクは、顔のキーポイントのトレーニング方法と検出プロセスを提供します。
詳細なコードとデータセットも提供されます
機器の補正は傾き補正と回転補正に分けられ、まず抽出されたキーポイント座標に基づいて透視変換行列を計算し、次に透視変換を実行して機器の最初の傾き補正を実現します。文字盤の垂直中心軸に対して対称な画像を要点で回転させ、計器の第 2 回転補正を実現します 図は、本稿での計器画像傾き補正のフレーム図を示します。
3. 検出効果と検証
最後に、この論文の校正方法が従来の機器校正方法 [12,13] と比較して優れた安定性と有効性を備えていることを検証するために、変電所の実際の環境で収集された 10 枚の傾斜機器画像が実験校正用に選択されました。補正画像の効果は次のとおりです。 図 12 に示すように、補正効率と時間を表 3 に示します。効率の統計では、補正画像は元の画像と比較して大幅な改善があり、機器に使用できると考えられます。図 12 に示すように、図 12b に示す最後の 7 枚の画像と最後の 5 枚の画像のように、一部の画像が透視変換を受けて元の画像よりも大きく変形している場合、補正は無効とみなされます。画像を図 12c に示します。
4. 結論
指針メーター画像の傾き補正は検針認識研究において重要な課題であるが、従来の画像補正手法では複雑な環境下でのメーターの校正課題を満たすことが困難であることを考慮し、本稿では、深層学習に基づく指針計の傾き補正手法では、ディープ畳み込みニューラルネットワークを用いて目盛番号を中心とした文字盤上のキーポイントを抽出し、計器画像の傾き補正と回転補正を同時に実現します。実験の結果、従来の補正方法と比較して、本論文の補正方法は、より優れた機器校正効果が得られ、補正された機器画像を識別することにより読み取り精度が向上することがわかりました。変電所や産業環境で収集された画像はさまざまな傾きで表示され、この論文の方法で傾きを補正した後に機器を識別します。画像は読み取り精度を向上させ、実用的な価値があります。
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.
1. 既存の opencv-python インストールをアンインストールします。pip アンインストール opencv-python
2. opencv-contrib-python バージョン 3.2 以下をインストールします。
pip インストール opencv-contrib-python==3.4.2
2.
バージョン番号を減らさずにコンパイルすることも可能 詳細な手順はリンク先
https://blog.csdn.net/m0_50736744/article/details/129351648
/*------------------------------------------------ ----------------------------------
// 著者: ひげおじさん
// 著作権表示: 同意しないでください転載不可、インターネットからの画像が数枚あります。侵害がある場合は、削除するために連絡してください
---------------------------- ------ -------------------------------------------- -------*/