画像を読み込み手書き数字認識 (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, "%")
うまく結果がでました
文責:Reyl
保存ファイル:
lesson16.py
lesson17.py