使用 TensorFlow Lite 在 Android 上進行印地語字符識別
介紹
如果你曾經想構建一個用于文本識別的圖像分類器,我假設你可能已經從 TensorFlow 的官方示例中實現了經典的手寫數字識別應用程序 。
該程序通常被稱為計算機視覺的“Hello World”,它是 ML 初學者構建分類器應用程序的一個很好的起點。構建一個識別任何字符的自定義分類器不是很好嗎?在這篇文章中,我們將構建一個印地語字符識別應用程序,但你可以隨意選擇你自己選擇的數據集。
我們將構建一個能夠識別印地語字符的機器學習模型,而且也可以從頭開始。我們不僅會構建機器學習模型,還會將其部署在 Android 移動應用程序上。因此,本文將作為端到端教程,涵蓋構建和部署 ML 應用程序所需的幾乎所有內容。
端到端流
數據準備
我們需要大量數據來訓練應該產生良好結果的機器學習模型。你一定聽說過 MNIST 數據集,對吧?讓我們回憶一下。
MNIST 數字數據庫
MNIST 代表“Modified National Institute of Standards and Technology”,是一個流行的手寫數字識別數據庫,包含超過 60,000 張數字 0-9 的圖像,F在,了解 MNIST 數據庫的外觀和格式很重要,因為我們將合成一個“類似于 MNIST”的印地語字符數據集。
MNIST 數據集中的每個數字都是一個 28 x 28 的二進制圖像,顏色為白色,背景為黑色。
MNIST 數字示例
好的,現在我們有了想法,讓我們?yōu)橛〉卣Z字符合成我們的數據集。我已經將數據集保存在我的 GitHub 存儲庫中。
該數據集包含所有印地語元音、輔音和數字。
這些圖像必須轉換為 NumPy 數組 (.npz),以供模型訓練使用。下面的腳本將幫助你進行轉換。
導入依賴
import tensorflow as tf
from tensorflow import keras
from PIL import Image
import os
import numpy as np
import matplotlib.pyplot as plt
import random
!pip install -q kaggle
!pip install -q kaggle-cli
print(tf.__version__)
import os
os.environ['KAGGLE_USERNAME'] = ""
os.environ['KAGGLE_KEY'] = ""
!kaggle datasets download -d nstiwari/hindi-character-recognition --unzip
將 JPG 圖像轉換為 NPZ(NumPy 數組)格式
# Converts all the images inside HindiCharacterRecognition/raw_images/10 into NPZ format.
path_to_files = "/content/HindiCharacterRecognition/raw_images/10/"
vectorized_images = []
for _, file in enumerate(os.listdir(path_to_files)):
image = Image.open(path_to_files + file)
image_array = np.array(image)
vectorized_images.append(image_array)
np.savez("./10.npz", DataX=vectorized_images)
加載訓練圖像 NumPy 數組
訓練圖像被矢量化為 NumPy 數組。換句話說,訓練圖像的像素在值 [0, 255] 之間被矢量化到單個“.npz”文件中。
path = "./HindiCharacterRecognition/vectorized_images/numeral_images.npz"
with np.load(path) as data:
#load DataX as train_data
train_images = data['DataX']
加載訓練標簽 NumPy 數組
同樣,各個訓練圖像的標簽也被矢量化并捆綁到單個“.npz”文件中。與圖像數組不同,標簽數組包含從 0 到 n-1 的離散值,其中 n = 類的數量。
path = "./HindiCharacterRecognition/vectorized_labels/numeral_labels.npz"
with np.load(path) as data:
#load DataX as train_data
train_labels = data['DataX']
NO_OF_CLASSES = 5 # Change the no. of classes according to your custom dataset
在此示例中,我正在為 5 個類( - ?、?、?、? 和 ?)訓練模型。該數據集涵蓋了所有元音、輔音和數字,因此你可以隨意選擇任何類別。
標準化輸入圖像
在這里,我們通過將每個像素除以 255 來歸一化輸入圖像,因此每個像素的值都在 [0, 1] 之間。
值為 0 的像素是黑色的,而值為 1 的像素是白色的。介于 0 和 1 之間的任何值都是灰色的,其強度取決于離得最近的一端。
色標
# Normalize the input image so that each pixel value is between 0 to 1.
train_images = train_images / 255.0
print('Pixels are normalized.')
檢查圖像和標簽數組的形狀
· 圖像陣列的形狀應為 (X, 28, 28),其中 X = 圖像的數量。
· 標簽數組的形狀應為 (X, )。
注意:圖像的數量和標簽的數量應該相等。
train_images.shape
train_labels.shape
可視化訓練數據
# Show the first 50 images in the training dataset.
j = 0
plt.figure(figsize = (10, 10))
for i in range(550, 600): # Try playing with difference ranges in interval of 50. Example: range(250, 300)
j = j + 1
plt.subplot(10, 5, j)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap = plt.cm.gray)
plt.xlabel(train_labels[i])
plt.show()
數據集預覽
我們的數據集現在看起來很完美,可以接受訓練了。
模型訓練
讓我們從模型訓練開始。
在下面的單元格中,我們定義了模型的層并設置了超參數,例如優(yōu)化器、損失函數、指標、類和epoch的數量來量化模型性能。
# Define the model architecture.
model = keras.Sequential([
keras.layers.InputLayer(input_shape=(28, 28)),
keras.layers.Reshape(target_shape = (28, 28, 1)),
keras.layers.Conv2D(filters=32, kernel_size = (3, 3), activation = tf.nn.relu),
keras.layers.Conv2D(filters=64, kernel_size = (3, 3), activation = tf.nn.relu),
keras.layers.MaxPooling2D(pool_size = (2, 2)),
keras.layers.Dropout(0.25),
keras.layers.Flatten(),
keras.layers.Dense(NO_OF_CLASSES)
])
# Define how to train the model
model.compile(optimizer = 'adam',
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
metrics = ['accuracy'])
# Train the digit classification model
model.fit(train_images, train_labels, epochs = 50)
model.summary()
我花了大約 30-45 分鐘來訓練 5 個類的模型,每個類有大約 200 張圖像。訓練模型的時間將根據你為用例選擇的每個類和圖像的數量而有所不同。在模型訓練時,去喝杯咖啡。
量化(Quantization)
我們已經完成了這個博客的一半。TensorFlow 模型已準備就緒。但是,要在移動應用程序上使用此模型,我們需要對其進行量化并將其轉換為 TF Lite 格式,這是原始 TF 模型的更輕量級版本。
量化允許在模型的準確性和大小之間進行有價值的權衡。隨著精度的輕微下降,模型大小可以大大減小,從而使其部署更容易。
將 TF 模型轉換為 TF Lite 格式
# Convert Keras model to TF Lite format.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_float_model = converter.convert()
with open('model.tflite', 'wb') as f:
f.write(tflite_float_model)
# Show model size in KBs.
float_model_size = len(tflite_float_model) / 1024
print('Float model size = %dKBs.' % float_model_size)
# Re-convert the model to TF Lite using quantization.
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quantized_model = converter.convert()
# Show model size in KBs.
quantized_model_size = len(tflite_quantized_model) / 1024
print('Quantized model size = %dKBs,' % quantized_model_size)
print('which is about %d%% of the float model size.' % (quantized_model_size * 100 / float_model_size))
# Save the quantized model to file to the Downloads directory
f = open('mnist.tflite', "wb")
f.write(tflite_quantized_model)
f.close()
# Download the digit classification model
from google.colab import files
files.download('mnist.tflite')
print('`mnist.tflite` has been downloaded')
我們現在已經準備好將 TF Lite 模型部署到 Android 應用程序上。
部署模型
已經開發(fā)了一個用于字符識別的 Android 應用程序。在第 1 步中,你可能已經克隆了存儲庫。在那里,你應該找到Android_App目錄。
復制 Hindi-Character-Recognition-on-Android-using-TensorFlow-Lite/Android_App/app/src/main/assets 目錄中的 mnist.tflite 模型文件。
接下來,在 Android Studio 中打開項目并讓它自己構建一段時間。構建項目后,打開DigitClassifier.kt文件并編輯第 333 行,將其替換為模型中輸出類的數量。
同樣,在DigitClassifier.kt文件中,通過根據你的自定義數據集設置標簽名稱來編輯 第 118 行到第 132 行。
最后,再次構建項目并將其安裝在你的 Android 手機上,并享受你自己定制的印地語字符識別應用程序。
最終應用
結論
快速總結一下:
· 我們從數據準備開始,合成一個類似于 MNIST 的數據集,用于印地語字符識別,由元音、輔音和數字組成;向量化圖像和標簽以輸入神經網絡。
· 接下來,我們通過添加 Keras 層來構建模型,配置超參數并開始模型訓練。
· 在訓練完 TF 模型后,我們將其量化并轉換為 TF Lite 格式,以使其準備好部署。
· 最后,我們構建了一個 Android 應用程序,并在其上部署了我們的分類器模型。
原文標題 : 使用 TensorFlow Lite 在 Android 上進行印地語字符識別
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
10月31日立即下載>> 【限時免費下載】TE暖通空調系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯網產業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結構工程師 廣東省/深圳市