人工知能を用いて アナログメーターの読取りを行うのに 教科書の例題にあるMNISTで出来ます。
まずは、カメラと照明を固定して撮影条件が一定となるように設置をします。一定の範囲内で撮影出来る事を保証できると、人工知能による予測精度が向上します。
次に、特定のアナログメーターを 事前に撮影して針の位置の状態をそれぞれ準備します。どの程度のデーターを準備するかは、要求する分解能に従いますが、20-30分解能もあれば、十分と思われます。
なぜなら、アナログメーター自体の精度(誤差)は、±2.5%や±1.6%程度あり、つまり、約5%や3%程度の誤差は、アナログメーターを使う時点で、許容されています。
有効桁数3桁、4桁の測定には、アナログメーターは向いていません。
事前のデーターを多く用意するため、撮影条件や照明条件を振って、許容範囲内の状態を可能な限り撮影したり、画像処理でデーターを水増しましょう。
プログラム自体は、MNISTと同等のクラス分類です。データーが十分あれば、トレーニングとテストに分けたり、過剰適合の検証をしたり、パラメーターの調整をしたり、色々できます。
ソースコード
データー準備
画像ファイルを下記に保管してます。
https://bono0.com/
import numpy as np
import matplotlib.pyplot as plt
import cv2
i=np.ndarray([32,32,3])
data=np.ndarray([10,32,32,3])
data[:]=0
i=plt.imread("ana00.png")
plt.imshow(i)
plt.show()
i = cv2.resize(i, (32,32))
data[0,:,:,:]=i
plt.imshow(i)
plt.show()
i=plt.imread("ana01.png")
i = cv2.resize(i, (32,32))
data[1,:,:,:]=i
i=plt.imread("ana02.png")
i = cv2.resize(i, (32,32))
data[2,:,:,:]=i
i=plt.imread("ana03.png")
i = cv2.resize(i, (32,32))
data[3,:,:,:]=i
i=plt.imread("ana04.png")
i = cv2.resize(i, (32,32))
data[4,:,:,:]=i
i=plt.imread("ana05.png")
i = cv2.resize(i, (32,32))
data[5,:,:,:]=i
i=plt.imread("ana06.png")
i = cv2.resize(i, (32,32))
data[6,:,:,:]=i
i=plt.imread("ana07.png")
i = cv2.resize(i, (32,32))
data[7,:,:,:]=i
i=plt.imread("ana08.png")
i = cv2.resize(i, (32,32))
data[8,:,:,:]=i
i=plt.imread("ana09.png")
i = cv2.resize(i, (32,32))
data[9,:,:,:]=i
学習と予測
import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split
x = data.reshape((10,-1))
y=np.array([0,1,2,3,4,5,6,7,8,9])
X_train=x
X_test=x
y_train=y
y_test=y
classifier = svm.SVC(gamma=0.001)
classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
print("Classification report for classifier %s:\n%s\n"
% (classifier, metrics.classification_report(y_test, predicted)))
人工知能は、画像を見てクラス分類しているだけです。アナログメーターの概念を認識したり針や目盛を理解しているわけではありません。過剰な要求仕様を求めなければ、アナログメーターの読取りは、例題のMNISTで出来ますね。