ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

手書き文字の認識を実装してみた。

 

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×642次元配列 (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
# numpyreshape()を使って8×8に戻す
img = np.reshape(digits.data[0], (8,8))

# cmapにより色を指定可能です。
# cmap=plt.cm.gray_rにより白黒で表現し、interpolationnearestにすることで、最近傍補間という補完を行なっています。
# 最近傍補間とは、画像を拡大・縮小・回転した際に利用する補間法の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()

得られた結果

結果からわかること

  • 想定していたような数字の画像が得られた

まとめ

なんとなく実装ができた。

今後やりたいこと

  • 数字ではなく、ひらがな、アルファベット、漢字などのいろんな種類の手書き文字の認識

参考サイト

AI Academy | 1. scikit-learnで手書き数字文字認識 part1