機械学習用ライブラリsklearnやその他必要なライブラリをインポート
from sklearn import datasets, svm
import numpy as np
import PIL
from PIL import Image
手書き数字のサンプルデータををloadします
digits = datasets.load_digits()
Xは機械学習用画像データ、yがターゲット
X=digits.data
y=digits.target
データのtypeと形を確認します
type(X)
X.shape
X[0]
→ 一つの画像データが64個の数字からなるベクトルとして表現されています
type(y)
y.shape
y[0]
→ X[0]の画像データの表す数字が「0」であることを示しています。。
このようなデータのペア(学習用数字画像データと正解の数字)が1797個用意されています
画像データをみてみましょう。可視化に必要なライブラリをインポートします
import matplotlib.pyplot as plt
画像データの一つを可視化してみます.
64個の数字は数字は8×8のピクセルの「黒色の濃さ」を表しています.
そのため,データの形を(8, 8)に変換してから可視化します.
plt.imshow(X[234].reshape([8,8]),cmap=plt.cm.gray_r)
plt.show()
対応するターゲットを確認します
y[234]
画像データとターゲットを用いて学習します。ここでの学習方法にはsvmを用います。
clf=svm.SVC(C=1.0,kernel='linear')
clf.fit(X,y)
学習後にできた関数にXを代入して得られる「答え」をresultに代入します
result=clf.predict(X)
result
正解のターゲットyを確認します
y
success=sum(result==y)
print("正解率")
print(100.0*success/len(y))
8x8のピクセルの手書き数字画像を準備し、読み込みます
#im = np.array(Image.open('/content/9.png'))
im = np.array(Image.open('/content/4a.png'))
読み込んだ画像データのサイズを確認します
im.shape
im[0]
→ 読み込んだ画像データでは8x8の各ピクセルの情報が4つの数字で表されています
各ピクセルの4つの数字の先頭の数字のみを取り出します.
imm=im[:,:,0]
imm
学習用に用意された画像データに合わせて、読み込んだデータを変換します。
tmp=(imm-imm.min()) # 最小値を0、最大値を16の整数とするように変換します
tim=16-np.round(tmp/tmp.max()*16.0)
timf=np.stack([tim.flatten()]) # 学習用データと同様な1次元配列(ベクトル)にします
timf
手書き数字データを学習後にできた関数に代入してみます(正解が得られるでしょうか?)
clf.predict(timf)
手書き数字を可視化してみます
plt.imshow(timf.reshape([8,8]),cmap=plt.cm.gray_r)
plt.show()
学習用に使われたデータのサンプルを確認してみましょう
XX=X[y==4]
len(XX)
plt.imshow(XX[4].reshape([8,8]),cmap=plt.cm.gray_r)
plt.show()
XX[0].reshape([8,8])
images=[]
for i in range(0,12):
images.append(XX[i].reshape([8,8]))
plt.rcParams["figure.figsize"] = (8,6)
fig = plt.figure()
for i, im in enumerate(images):
fig.add_subplot(3,4,i+1).set_title(str(i))
plt.imshow(im,cmap=plt.cm.gray_r)