目次[非表示]
はじめに
こんにちは、SHOUです!以前の記事では、Google Colab×Keras を使って手書き数字(MNISTデータセット)の分類モデルを作りました。
今回はその続編として、自分で用意した1枚の手書き数字画像をAIに判定させてみます!
「自分の書いた数字がちゃんと認識されるのか?」ワクワクしますね😊
準備するもの
- Google Colabアカウント
- Google Driveアカウント
- Drive内に置いた手書き数字の画像ファイル(PNGやJPG)
Google DriveをColabにマウント
まず、Google Drive を Colab に接続します👇すると、認証リンクが出るので、指示に従って認証してください。
- from google.colab import drive
- drive.mount('/content/drive')
マウントが完了すると、Drive のファイルが /content/drive/MyDrive/ 以下に見えるようになります。
Google Colabのセットアップ
まず、Google Colabを開き、ランタイムでGPUを選んでおきましょう。 設定:[ランタイム] → [ランタイムのタイプを変更] → [ハードウェア アクセラレータ: GPU]
必要なライブラリをインポート
- import tensorflow as tf
- from tensorflow import keras
- import numpy as np
- from PIL import Image
- import matplotlib.pyplot as plt
学習済みモデルの用意
以前作ったモデル(MNIST用)をColabで再度学習して使用します。または、事前に保存したモデルをロード👇
- # モデルの構築と学習
- model = keras.models.Sequential([
- keras.layers.Input(shape=(28, 28)),
- keras.layers.Flatten(),
- keras.layers.Dense(128, activation='relu'),
- keras.layers.Dropout(0.2),
- keras.layers.Dense(10, activation='softmax')
- ])
- model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
- # MNISTデータで学習
- (x_train, y_train), _ = keras.datasets.mnist.load_data()
- x_train = x_train / 255.0
- model.fit(x_train, y_train, epochs=5)
- # モデル保存
- model.save('mnist_model.keras')
- model = keras.models.load_model('mnist_model.keras')
画像ファイルの読み込み
ここでは、Drive内の画像ファイルを指定します。
- # Drive内の画像パス
- image_path = '/content/drive/MyDrive/Colab/handwritten_digit.png'
- # 画像を開く
- img = Image.open(image_path).convert('L')
- # 表示して確認
- plt.imshow(img, cmap='gray')
- plt.axis('off')
- plt.show()
今回判定させる画像👇
画像の前処理
MNISTは28×28ピクセルのグレースケール画像なので、リサイズ&正規化を行います。 また、MINSTは、黒地に白い数字なので、白黒反転させます。
- # 画像ファイル名を指定
- img = Image.open('/content/drive/MyDrive/Colab/handwritten_digit.png').convert('L')
- # リサイズ&正規化
- img = img.resize((28, 28))
- img_array = np.array(img) / 255.0
- # モデル入力用に形を整える
- img_array = img_array.reshape(1, 28, 28)
- # 追加:白黒反転
- img_array = 1.0 - img_array
MNISTの画像確認
MNISTの画像が黒地に白い数字になっているか確認してみます。
- import matplotlib.pyplot as plt
- from tensorflow.keras.datasets import mnist
- # データの読み込み
- (x_train, y_train), (_, _) = mnist.load_data()
- # 最初の画像とラベル
- image = x_train[0]
- label = y_train[0]
- # 画像を表示
- plt.imshow(image, cmap='gray')
- plt.title(f'Label: {label}')
- plt.axis('off')
- plt.show()
MNISTの画像👇
判定させる画像を表示
MNISTに合わせて白黒反転させた画像を確認します。
- import matplotlib.pyplot as plt
- # グレースケール画像として表示
- plt.imshow(img_array[0], cmap='gray')
- plt.title('Preprocessed Image')
- plt.axis('off')
- plt.show()
白黒反転した画像👇
いよいよ予測!
AIが自分の書いた数字を正しく認識しているか確認してみましょう✨
- prediction = model.predict(img_array)
- predicted_class = np.argmax(prediction)
- print(f'AIの判定結果: {predicted_class}')
- print("---")
- print(f'AIの自信度')
- for i, prob in enumerate(prediction[0]):
- print(f'{i}: {prob:.4f}')
- 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
- AIの判定結果: 4
- ---
- AIの自信度
- 0: 0.0022
- 1: 0.0000
- 2: 0.0001
- 3: 0.0000
- 4: 0.9866
- 5: 0.0000
- 6: 0.0000
- 7: 0.0044
- 8: 0.0000
- 9: 0.0066
この画像は '4' で、AIも '4' と認識しました。
また、98%で'4'と認識しているようです。
白黒反転させなかった場合の判定結果
白黒反転させなかった世界線での判定結果
- 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
- AIの判定結果: 3
- ---
- AIの自信度
- 0: 0.0000
- 1: 0.0000
- 2: 0.0000
- 3: 0.9984
- 4: 0.0000
- 5: 0.0016
- 6: 0.0000
- 7: 0.0000
- 8: 0.0000
- 9: 0.0000
元の画像は同じ'4' ですが、AIは '3' と誤認識してしまいました。
また、自信満々99%で'3'と認識しているようです。
0 件のコメント:
コメントを投稿