tensorflowをいじって数週間、kerasというtensowflowのAPIを使って手書き文字が判別できるそうな。 画像ファイルを読み込ませて判別するコードを下記記事を参考に作ってみました。
https://pondad.net/web/2016/12/11/scikit-learn-mnist.html
今回はマイニング用PCでやりました。
ラズパイでは厳しいと最初から判断してやめてしまいました。完全にチキン野郎です。きっと手書きデータが重いんじゃないかなって思ったんですけど…
→→なんとかラズパイでも動かせました!!ちなみにWindows10では簡単に開発環境は整います。
インストールその他は下記本を参照にしました。
おおまかな流れはAnacondaをインストールし、そこからtensowflowその他ライブラリをインストールしていく形です。
Pythonはjupyter Notebookというwebエディターで使っていきます。15分~20分で完了しました。やっぱり汎用のOSはいいですね…。
画像は↑これなのですが、webエディターなのでファイルの場所はフルパスを入れたほうがよさそうです。
↓作ったコードはこちら。
from sklearn import datasets, cross_validation, svm, metrics
from tensorflow.python.keras.layers import Dropout
import numpy as np
from PIL import Image
digits = datasets.load_digits()
label_test = [7]
image = Image.open("test7.png").convert('L')
#フルパスの必要あり。convert('L')でデータの白黒を反転させている。
image = image.resize((8, 8), Image.ANTIALIAS)
#8×8の行列にしています。
img = np.asarray(image, dtype=float)
img = np.floor(16 - 16 * (img / 256))
#画像データの整数化??
img = img.flatten()
data_train = digits.data
label_train = digits.target
data_test = img
#データをx、yの軸にしてます
clf = svm.SVC(C=1.0, cache_size=200, class_weight=None, coef0=1.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
#SVCのパラメータです。読み込んだデータを判断する仕方が変わってきます。
#なぜかkernel='linear'にしたらよく当たるようになりました。
clf2 =data_test.reshape(1,-1)
#これ重要。data_test.のままではエラーがでます。
clf.fit(data_train, label_train)
#/機械学習しています。
predict = clf.predict(clf2)
#画像データと比較。判断
print(data_test)
print(clf2)
print(clf)
#データの確認用で出力させています。
print("テストラベル=",label_test)
print("解析結果=",predict)
ac_score = metrics.accuracy_score(label_test, predict)
print("正解率=", ac_score*100, "%")
#判断した数字を出力。そしてlabel_test = [7]とあっているか確認しています。
詳しくは勉強中ですが、珍しく解説をいれました笑
参考にしたブログのコードをそのまま使うと下記のようなエラーが出ます。
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
どうも画像データを読み込んだ行列が単独だったらreshape(1, -1) をしてほしいとのことなのでclf2 =data_test.reshape(1,-1)としてます。printで行列を確認すると
reshape前
[0. 0. 1. 2. 3. 2. 1. 0. 0. 0. 7. 8. 7. 9. 9. 0. 0. 0. 0. 0. 0. 7. 3. 0.
0. 0. 0. 0. 3. 9. 0. 0. 0. 0. 0. 0. 9. 2. 0. 0. 0. 0. 0. 6. 6. 0. 0. 0.
0. 0. 0. 3. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
reshape後
[[0. 0. 1. 2. 3. 2. 1. 0. 0. 0. 7. 8. 7. 9. 9. 0. 0. 0. 0. 0. 0. 7. 3. 0.
0. 0. 0. 0. 3. 9. 0. 0. 0. 0. 0. 0. 9. 2. 0. 0. 0. 0. 0. 6. 6. 0. 0. 0.
0. 0. 0. 3. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
どうもカッコがふたつないといけないのかな??
調べるとsklearnのバージョンが新しいとこうなってしまうらしいです。
これでなんとかエラーは突破できました。結果として
テストラベル= [7]
解析結果= [7]
正解率= 100.0 %
こうでればOKです。ほかにも4を試したりしましたが正解してます。
まあ精度はどうであれ、AIを実感することができました。
tensorflowでは最初から学習データを使うことができます。OpenCVみたいに死ぬほどデータを
用意しなくていいみたいですね。
最近Qiitaみたいにこのブログがなってきましたが、いろんなことやっていきますよ!!