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.tfliteassetsフォルダに入れる

こうなっていればOK

Bitmap化された手書き画像をモデルに渡す

モデルの出力(0~9)