まずmatplotlibとsklearnを入れます。
$ sudo pip3 install matplotlib
$ sudo pip3 install sklearn
scikit-learnに付属しているHandwritten Digits Data Setを使います。
import matplotlib.pyplot as plt from sklearn import datasets digits = datasets.load_digits() d0 = digits.images[0] print(d0)
$ python3 app.py
[[ 0. 0. 5. 13. 9. 1. 0. 0.]
[ 0. 0. 13. 15. 10. 15. 5. 0.]
[ 0. 3. 15. 2. 0. 11. 8. 0.]
[ 0. 4. 12. 0. 0. 8. 8. 0.]
[ 0. 5. 8. 0. 0. 9. 8. 0.]
[ 0. 4. 11. 0. 1. 12. 7. 0.]
[ 0. 2. 14. 5. 10. 12. 0. 0.]
[ 0. 0. 6. 13. 10. 0. 0. 0.]]
### 画像の学習
from sklearn.model_selection import train_test_split # 学習用データとテスト用データに分割 from sklearn import datasets, svm, metrics # データセット、SupportVectorMachine, metrics from sklearn.metrics import accuracy_score digits = datasets.load_digits() x = digits.images # 画像 y = digits.target # 数字 x = x.reshape((-1, 64)) # 画像の二次元配列を一次元配列に変換 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2) # データ学習 clf = svm.LinearSVC() clf.fit(x_train, y_train) y_pred = clf.predict(x_test) # 学習データを元にテスト画像から数字を予測 print(accuracy_score(y_test, y_pred)) # 答えと予想の精度を確認
92%の精度
$ python3 app.py
/usr/local/lib64/python3.6/site-packages/sklearn/svm/_base.py:977: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
“the number of iterations.”, ConvergenceWarning)
0.9277777777777778
手順としては、
(1)画像をピクセルの二次元配列データにして、データセットとラベルをセットに保存
(2)上記データセットを集める
(3)ピクセルの二次元配列を一次元配列に変換し、学習用データとテスト用データに分割する
(4)SVMで学習用データを学習
(5)テストデータから正解を予測
(6)制度をチェックする
### 学習済みデータの保存/呼び出し
※from sklearn.externals import joblibだとバインドされないので注意
import joblib # 学習用データの保存 joblib.dump(clf, 'digits.pkl')
呼び出し
import joblib clf = joblib.load("digits.pkl")
$ python3 app.py
0.9777777777777777
なるほど、OpenCVで画像を二次元配列にするわけだな
フローはほぼ理解した