はじめに
こんにちは、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()
白黒反転した画像👇
いよいよ予測!
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}')AIが自分の書いた数字を正しく認識しているか確認してみましょう✨
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 件のコメント:
コメントを投稿