Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

画像を読み込み手書き数字認識 (python 機械学習)

13日目 python 機械学習

本日の課題と目標

1.画像の読み込み
2.手書き数字のデータセット
3.数字認識の機械学習


今回はこちらのサイトを参考にさせていただきました



まずは test4.pngの画像を準備しコピペで動作確認します


エラー: cannot import name ‘cross_validation’ from ‘sklearn’が出た
cross_validationをmodel_selectionに変更しました


エラー: Expected 2D array, got 1D array instead が出た
data_test = Img の後ろに「.reshape(1, -1)」を追加しました



わからない関数


.convert(“L”)
グレイスケールに変換(白黒写真のようにする)

image.ANTIALIAS
リサイズで使う(ピクセルのギザギザが目立たなくなる)


np.asarray
元のNumpy配列と同期され続けるコピーを作る

float
int型、float型、double型

np.floor
小数点以下を切り捨てて整数にする

.flatten
配列を1次元に変換する
(下のサイトを見てみたら、sum(x,[])を使ったほうがわかりやすかったです)



ここまでの意味

image = Image.open("test4.png").convert('L')
image = image.resize((8, 8), Image.ANTIALIAS)
img = np.asarray(image, dtype=float)
img = np.floor(16 - 16 * (img / 256))
img = img.flatten()

読み込んだ画像を8×8マスの16段階の白黒に変換して、一次元配列にする。



datasets.load_digits()
scikit-learn に付属している数字の手書き文字データ

fit()で学習、predict()で予測
※このサイトはscikit-learnとアルゴリズムについての説明がすごくわかりやすかったです!



二次元配列で「0」「1」「2」を作り、数字認識してみました

from sklearn import datasets, model_selection, svm, metrics
import numpy as np
from PIL import Image

x_0 = [
    [ 0, 0, 0, 0, 0, 0, 0, 0],
    [ 0, 0,15,15,15,15, 0, 0],
    [ 0, 0,15, 0, 0,15, 0, 0],
    [ 0, 0,15, 0, 0,15, 0, 0],
    [ 0, 0,15, 0, 0,15, 0, 0],
    [ 0, 0,15, 0, 0,15, 0, 0],
    [ 0, 0,15,15,15,15, 0, 0],
    [ 0, 0, 0, 0, 0, 0, 0, 0]
]
x_0 = sum(x_0,[])

x_1 = [
    [ 0, 0, 0, 0, 0, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0, 0, 0, 0, 0, 0]
]
x_1 = sum(x_1,[])

x_2 = [
    [ 0, 0,15,15,15,15, 0, 0],
    [ 0,15, 0, 0, 0, 0,15, 0],
    [ 0, 0, 0, 0, 0,15, 0, 0],
    [ 0, 0, 0, 0,15, 0, 0, 0],
    [ 0, 0, 0,15, 0, 0, 0, 0],
    [ 0, 0,15, 0, 0, 0, 0, 0],
    [ 0,15,15,15,15,15,15, 0],
    [ 0, 0, 0, 0, 0, 0, 0, 0]
]
x_2 = sum(x_2,[])

img = []
img.append(x_0)
img.append(x_1)
img.append(x_2)


digits = datasets.load_digits()

data_train = digits.data
label_train = digits.target
data_test = img
label_test = [0,1,2]

clf = svm.SVC(gamma=0.001)
clf.fit(data_train, label_train)

predict = clf.predict(data_test)
print("テストラベル=",label_test)
print("解析結果=",predict)
ac_score = metrics.accuracy_score(label_test, predict)
print("正解率=", ac_score*100, "%")

うまく結果がでました
f:id:Start_python:20191110205637j:plain



文責:Reyl


保存ファイル:
lesson16.py
lesson17.py