import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.datasets import mnist
import cv2
from google.colab import files
# --- ステップ1:MNISTデータセットでモデルを学習 ---
print("ステップ1: MNISTデータセットでモデルを学習しています...")
# MNISTデータセットの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# データを0-1の範囲に正規化
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# CNNモデルのために次元を増やす
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
# モデルの構築
model = keras.Sequential([
keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
# モデルのコンパイルと学習
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
print("モデルの学習が完了しました。")
# --- ステップ2:手書き画像をアップロードして予測 ---
print("\nステップ2: 予測したい手書き画像をアップロードしてください。")
# Google Colabのアップロード機能
uploaded = files.upload()
# アップロードされたファイル名を取得
file_path = list(uploaded.keys())[0]
# 画像の前処理
print(f"アップロードされたファイル: {file_path}")
print("画像をモデルが認識できる形に変換しています...")
# 画像の読み込み(グレースケールで)
# cv2.IMREAD_GRAYSCALEは、画像を白黒で読み込むための設定
img = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
# 28x28ピクセルにリサイズ
img_resized = cv2.resize(img, (28, 28), interpolation=cv2.INTER_AREA)
# 色の反転(白い背景に黒い文字を想定)
# IbisPaintXで黒い背景に白い文字を描いた場合は、この行をコメントアウトしてください
img_inverted = cv2.bitwise_not(img_resized)
# 0-1の範囲に正規化し、モデルの入力形式に合わせる
img_preprocessed = img_inverted / 255.0
img_input = np.expand_dims(img_preprocessed, axis=(0, -1))
# --- ステップ3:予測結果の表示 ---
print("予測を開始します...")
# 予測を実行
predictions = model.predict(img_input)
predicted_digit = np.argmax(predictions[0])
# 予測結果を表示
print(f"\nこの手書き数字は... 「{predicted_digit}」です!")
# 元の画像と予測結果を一緒に表示
plt.imshow(img_resized, cmap='gray')
plt.title(f"Predicted: {predicted_digit}")
plt.show()