事前準備
手順1:4つのライブラリをインストール
・scikit-learn:機械学習のライブラリ
・scipy:scikit-learnが計算するためにつかう科学計算のライブラリ
・numpy:画像データを数値リストに変換するためにつかう数値計算のライブラリ
・matplotlib:数値リストを画像として出力する
py -m pip install numpy
py -m pip install scipy
py -m pip install scikit-learn
py -m pip install matplotlib
学習用のデータを読み込む
学習用データを確認しよう
今回は教師あり学習に含まれるため、
学習をさせるには、手書きの数字と答えのペアデータが大量に必要ですが、sklearnにはすでに学習用のデータがあるため、これを使います。
では、どのような学習データが入っているのか、見てみましょう。
import sklearn.datasets
digits = sklearn.datasets.load_digits()
print("データの個数=",len(digits.images))
print("画像データ="+"\n",digits.images[0])
print("何の数字か=",digits.target[0])
#datasets.load_digits() は、Scikit-learnライブラリで提供されている関数で、手書き数字(digits)のデータセットをロードするために使用します。
実行結果
#0から9までの手書きの数字が8×8ピクセルの画像として提供されておr、0が一番明るい色になります。
matplotlibを用いて、数値データを画像化しよう
import sklearn.datasets
import matplotlib.pyplot as plt
digits = sklearn.datasets.load_digits()
plt.imshow(digits.images[0], cmap="Greys")
#数値データをグレーの濃淡画像にする。
plt.show()
#作ったがぞうを表示する。
数値予想プログラムを作ってみよう
プログラムの内容は以下になります。
imageToData関数は数字の画像を数値リストに変換し、それを受け取ったpredictDigits関数がどの数字化を予測します。
import sklearn.datasets
import sklearn.svm
from PIL import Image # Imageモジュールをインポート
import numpy
# 手書き数字のデータセットを読み込む
digits = sklearn.datasets.load_digits()
# 画像ファイルを数値リストに変換する。
def imageToData(filename):
grayImage = Image.open(filename).convert("L") # 画像をグレースケールに変換
grayImage = grayImage.resize((8, 8), Image.LANCZOS) # LANCZOSを使用
numImage = numpy.asarray(grayImage, dtype=float)
numImage = 16 - numpy.floor(17 * numImage / 256)
numImage = numImage.flatten()
return numImage
# 数字を予測する
def predictDigits(data):
clf = sklearn.svm.SVC(gamma=0.001)
clf.fit(digits.data, digits.target)
n = clf.predict([data])
print("予測=", n)
data = imageToData("2.png") # ここで画像を指定
predictDigits(data) # 予測を実行
例: 画像を読み込んで数字を予測する
今回は無料アプリのMediBang Paintを使用し、下図のようなpng画像を自分で書き、実際に予測できるか見てみます。
結果は、、、
きちんと予測できてますね!
今回は以上です!ありがとうございました!