手書き数字をAIに判定させてみよう【Keras×Colab】

2025年5月10日土曜日

Google Colab Keras TensorFlow 画像分類 機械学習

X f B! P L

はじめに

こんにちは、SHOUです!
以前の記事では、Google Colab×Keras を使って手書き数字(MNISTデータセット)の分類モデルを作りました。
今回はその続編として、自分で用意した1枚の手書き数字画像をAIに判定させてみます!
「自分の書いた数字がちゃんと認識されるのか?」ワクワクしますね😊

準備するもの

  • Google Colabアカウント
  • Google Driveアカウント
  • Drive内に置いた手書き数字の画像ファイル(PNGやJPG)
今回は28×28ピクセルのグレースケール画像が理想ですが、大きい画像でも Colab 上でリサイズできるので大丈夫です👌

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'と認識しているようです。

まとめ

今回は、Google ColabとKerasを使って、手書き数字画像をAIに分類させる方法を試してみました。独自に作成した数字「4」の画像を判定させたところ、結果も「4」と認識されました。 学習したモデルに合わせて白黒反転させることで、正しく認識させることができました。ぜひ皆さんも自分のデータで試してみてください!

このブログを検索

自己紹介

はじめまして、機械学習を独学中のSHOU TAKEと申します。本ブログでは、Python・Keras・Google Colabを活用した画像分類やニューラルネットワークの実験記事を中心に発信しています。初学者の方にも分かりやすく、学んだことをそのまま実験形式でまとめるスタイルです。これまで取り組んだテーマには、学習率やOptimizerの比較、Batch Sizeの検証、事前学習の活用などがあります。ご質問やご感想は、お問い合わせフォームからお気軽にどうぞ。

お問い合わせフォーム

名前

メール *

メッセージ *

プライバシーポリシー

QooQ