Open1
手書き数字の読み取り

GeminiさんによるとAIによる手書き文字の読み取りは可能とのことなので、教えてもらったことを書いておく。
使うライブラリはMNIST、モデルはCNN。
- MNIST:手書きの数字を認識担当 取り扱い範囲は0~9までの数字のみ
- CNN:GPUによる高速処理担当 リアルタイム処理が可能
依存関係
TensorFlow Lite
pythonやってた時になんか使ったなーといううっすらとした記憶が。
AndroidStudioのプロジェクトにTensorFlowを導入することで、CNNモデルをアプリに統合できるようです。
- ライブラリ追加
libs.versions.toml
[versions]
tensorflowLite = "2.15.0"
tensorflowLiteSupport = "0.4.3"
tensorflowLiteGpu = "2.15.0"
[libraries]
tensorflow-lite = { module = "org.tensorflow:tensorflow-lite", version.ref = "tensorflowLite" }
tensorflow-lite-support = { group = "org.tensorflow", name = "tensorflow-lite-support", version.ref = "tensorflowLiteSupport" }
tensorflow-lite-gpu = { group = "org.tensorflow", name = "tensorflow-lite-gpu", version.ref = "tensorflowLiteGpu" }
- Synk Now!!!
- 依存関係追加(Module:appの方)
build.gradle.kts
dependencies {
//Tensorflow
implementation(libs.tensorflow.lite)
implementation(libs.tensorflow.lite.support) // BitmapからTensor変換用
implementation(libs.tensorflow.lite.gpu) // GPUサポート
Sync Now!!!!
MNISTで学習済みモデルを準備
さらっと書きましたが、ここはPythonを使います🫥
手順は以下のようです。
- VSCodeでPythonを使いMNISTデータセットでCNNモデルを学習させる
- minist.tfliteというファイルができる
私にできるのだろうか。。。という不安でドキドキしながらVScode立ち上げました。
久々にpython触ったら、コパイロットさんが無料になったのでしょうか?
プロンプトにやりたこと入力したら、勝手にコード作ってくれました。
ありがとうございます❤️
コパイロット作成(学習部分の数値を少し修正しました)コード
import tensorflow as tf
from keras import layers, models
from tensorflow.keras.datasets import mnist
import numpy as np
# MNISTデータセットの読み込み
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# データの前処理
x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0
# ラベルデータのOne-hotエンコーディング
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
# CNNモデル構築
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
# モデルのコンパイル
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# モデルの学習
model.fit(x_train, y_train, epochs=10, batch_size=128, validation_data=(x_test, y_test))
# モデルの評価
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# TFLiteモデルの保存
with open("mnist.tflite", "wb") as f:
f.write(tflite_model)
print("おーるおっけー!ファイルできた°˖☆◝(⁰▿⁰)◜☆˖°")
そんなわけで、無事「nmist.tflite」ファイルが出来上がりました!!!°˖☆◝(⁰▿⁰)◜☆˖°
UI作成
先にUI作ります。
手書き画面を作るはこちら
手書きをBitmapに変換
.tfliteモデルをAndroidに追加
pythonで作成したmnist.tfliteファイルを置くためのassetsフォルダを作成。
- フォルダのビューをProjectに変更し、app>src>maiを右クリック
- 表示されたメニューからNew→Directoryを選択
- assetsと名前を付ける
-
mnist.tfliteをassetsフォルダに入れる
こうなっていればOK