
いよいよ今回が最終回です!
あなたの書いた手書き文字をAIに判別させます!

いよいよですね!
よろしくお願いします!
学習済みのモデルを保存しよう

まずは、前回学習したモデルをデータファイルに保存しましょう。
前回のファイル「ml2」を開き、前回のコードの続きに下のコードを書いて実行してください。
実行するときは、前回のコードを実行してから、今回のコードを実行してください。
# 学習済みのモデルを保存する
import pickle
with open("ml.pkl", "wb") as fp:
pickle.dump(classifier, fp)

コードを実行すると、「ml2」があったフォルダの中に「ml.pkl」ファイルが保存されます。


コードの説明をお願いします!

はい!
学習済みのモデルを保存する際は、「pickle」モジュールを読み込んで使用します。
あとは、例の通り記述することで学習済みのモデルを保存することができます。
- 学習済みのモデルを保存するときは、「pickle」モジュールを読み込んで使用する
手書きの数字を用意する

それでは、判別に使う手書きの数字を用意します。
ペイントツールで手書きの数字を書いて「number.png」と名前をつけて保存しましょう。
注意点は3つです。
①24bitのpng形式で保存してください。
②背景は白で、数字は黒の太いペンで書いてください。
③画像は、ml.pklがある場所に保存してください。

私は、「5」という数字を用意しました!


OKです。
それでは、この数字を判別させてみましょう!
手書きの数字を判別させよう

それでは、いよいよ手書きの数字を判別させます。
以下のコードを書いて、実行してください。
ファイル名は「predict」、ファイルの場所は、ml.pklとnumber.pngがあるフォルダに保存してくださいね。
まずは、数字を判別させる前に、必要なライブラリをダウンロードします。
以下のコードを実行してください。
!pip install opencv-python==4.4.0.46


このようになりました!

OKです!
それでは、数字を判別するプログラムを構築しましょう!
以下のコードを書いてみてください。
import cv2
import pickle
def predict(filename):
#学習済みのモデルを読み込む
with open("ml.pkl", "rb") as fp:
classifier = pickle.load(fp)
# 用意した手書きの数字の画像を読み込む
number = cv2.imread(filename)
# 手書きの数字の画像データを学習済みモデルに合わせる
number = cv2.cvtColor(number, cv2.COLOR_BGR2GRAY)
number = cv2.resize(number, (8, 8))
number = 15 - number // 16
number = number.reshape((-1, 64))
# データを予測
res = classifier.predict(number)
return res[0]
# 画像ファイルを指定して予測
x = predict("number.png")
print(str(x))

実行する前にコードを解説しますね。
まず、「cv2」モジュールと「pickle」モジュールを読み込みます。

「cv2」モジュールとはなんですか?

「cv2」モジュールとは、最初にインストールした「OpenCV」ライブラリに入っているモジュールです。
「OpenCV」ライブラリは画像処理や動画処理に用いられます。

そうなんですね。

次に、「関数」を定義します。

「関数」を定義するとはどういうことですか?

「関数」を定義するとは、複数の処理をまとめて1つの単位として扱うということです。
普通複数の処理を行うには、毎回複数の処理を書かないといけないのですが、関数としてまとめ、関数を呼び出すことで簡単に複数の処理を一発で行うことができます。

関数を使うことで、プログラムも手短に書けるようになるんですね。

その通りです!
では関数の中身を見てみましょう。
まず、「with open(“ml.pkl”, “rb”) as fp:」からの2行は、学習済みのモデルを読み込むためのコードです。
保存したモデルの名前は、「ml.pkl」だったので、コードの中にも記述がありますね。

ここで、「pickle」モジュールを使うわけですね!

その通りです!
そして、「number = cv2.imread(filename)」は、先ほど用意した手書きの数字のファイルを読み込むためのコードです。
その後は、読み込んだ画像データを学習済みモデルと同じデータに合わせるためのコードです。

色や画像サイズなどを学習済みモデルに合わせるわけですね。

その通りです。
ちなみに、「number = 15 – number // 16」は、画像を白黒反転させています。
そして、二次元配列を一次元配列に変換して、「res = classifier.predict(number)」で自分が書いた手書き数字を予測します。

ここで予測するわけですね。

その後、関数を呼び出すと同時に画像ファイルを呼び出し実行します。
その結果をprintで出力します。
では、プログラムを実行してみてください!


「5」という結果が出てきました!
これはちゃんと判別できたということですね!

よくできました!
ちゃんと判別できましたね!
- 「OpenCV」ライブラリは画像処理や動画処理に用いられる
- 「関数」を定義するとは、複数の処理をまとめて1つの単位として扱うということ
まとめ

今回までの全6回でAIを作る方法を学びました。

思っていたよりも簡単にAIを作ることができるんですね!

ぜひ今度は、他の数字でやってみたり、細いペンで書いた数字を判別させたりしてみたりしてください。
色んなことがわかると思いますよ!

分かりました!
ありがとうございました!