忍者ブログ

設備のマニアどっとこむ

IoT開発、設備・DIYのブログ!

kerasで手書き数字の認識をした話

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みたいにこのブログがなってきましたが、いろんなことやっていきますよ!!







拍手[0回]

PR

コメント

翻訳(Translate)

プロフィール

HN:
佐々木 雅史
性別:
男性
自己紹介:
2021年 ラズパイ、M5stackを用いたIoT開発を専門で受注するアルティメンテを設立。代表を務める。
・2020年ラズパイコンテスト優良賞受賞
・設備系資格多数(電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトなど)

AD

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31