python×機械学習で、手書き文字の認識を実装してみました。
使用データ
やりたいこと
scikit-learn付属のデータセットの”手書き文字”の表示やデータセットの確認を行う
実装内容
from sklearn.datasets import load_digits
from sklearn import svm
from sklearn import metrics
import matplotlib.pyplot as plt
digits = load_digits()
# digitsデータセットはdir()で調べることができます。
print(dir(digits))
print(digits.data) # digitデータセットのdataの値を出力
print(digits.data.shape) # digitデータセットのdataの構造を出力 1797×64の2次元配列 (1797, 64)
print(digits.target.shape)
# 1行に64列の数字で1文字になる。
print(len((digits.data[0]))) # 64 (64ピクセルというのは、は8×8ピクセルの16階調のグレイスケール画像)
print((digits.data[0]))
print(digits.data[0].shape) # 1次元 (64,)
import numpy as np
# numpyのreshape()を使って8×8に戻す
img = np.reshape(digits.data[0], (8,8))
# cmapにより色を指定可能です。
# cmap=plt.cm.gray_rにより白黒で表現し、interpolationをnearestにすることで、最近傍補間という補完を行なっています。
# 最近傍補間とは、画像を拡大・縮小・回転した際に利用する補間法の1つです。
plt.imshow(img, cmap=plt.cm.gray_r, interpolation='nearest')
# plt.imshow(digits.images[0], cmap=plt.cm.gray_r, interpolation='nearest')
# 上記のcmap=の部分及び、interpolation=を消した下記でも動作します。比べてみてください。
# plt.imshow(image)
plt.axis('off')
plt.show()
num = len(digits.data)
print("num=" + str(num))
# zip()にて複数リストの値を同時に取得しています。
images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:10]):
plt.subplot(2, 5, index + 1)
plt.axis('off')
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.title('Training: %i' % label)
plt.show()
得られた結果
結果からわかること
- 想定していたような数字の画像が得られた
まとめ
なんとなく実装ができた。
今後やりたいこと
- 数字ではなく、ひらがな、アルファベット、漢字などのいろんな種類の手書き文字の認識