為圖片分類器建立自訂模型

1. 事前準備

在先前的程式碼研究室中,您建立了適用於 Android 和 iOS 的應用程式,並使用基本圖片標籤模型來辨識數百個圖片類別。它能辨識出一幅很普通的花圖片,也就是可看到花瓣、花朵、植物和天空的相片。

如要更新應用程式以辨識特定花朵、雛菊或玫瑰等特定花朵,您需要一個自訂模型,針對您想辨識的各類花朵,從大量樣本中訓練出。

必要條件

  • 此學習路徑中的前一個程式碼研究室。

建構與學習目標

  • 如何使用 TensorFlow Lite Model Maker 訓練圖片分類器自訂模型。

軟硬體需求

  • 所有操作都能在瀏覽器中使用 Google Colab 完成,因此不需要使用特定硬體。

2. 開始使用

所有適用的程式碼都已準備好進行,您可以在這裡透過 Google Colab 執行。如果無法存取 Google Colab,可以複製存放區,並使用 ImageClassificationMobile->colab 目錄中名為 CustomImageClassifierModel.ipynb 的筆記本。

如果您有許多特定花卉範例,可以用 TensorFlow Lite Model Maker 訓練模型,輕鬆辨識這些花朵。

最簡單的方法是建立包含圖片的 .zip 或 .tgz 檔案,並排入目錄。舉例來說,如果您使用雛菊、蒲公英、玫瑰、向日葵和鬱金香的圖片,可將它們整理成如下所示的目錄:

4ee12554e75b103f.png

只要建立並代管於伺服器上,您就可以用它來訓練模型。您將在本研究室後續步驟中,使用系統為您準備的解決方案。

本研究室假設您是使用 Google Colab 訓練模型。你可以前往 colab.research.google.com 下載 Colab。如果您使用其他環境,可能需要安裝許多依附元件,而不是 TensorFlow。

3. 安裝及匯入依附元件

  1. 安裝 TensorFlow Lite Model Maker。如要這麼做,請使用 pip 安裝。&>/dev/null at the end just suppresses the output.模型製作工具輸出的內容很多,但都沒有立即相關。使用者已隱藏自己的工作,因此你可以專心處理手邊的工作。
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. 接下來,您必須匯入所需的程式庫,並確保使用的是 TensorFlow 2.x:
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

現在環境已就緒,可以開始建立模型了!

4. 下載及準備資料

如果您的圖片已依資料夾分類,且這些資料夾已經過壓縮,則只要您下載並解壓縮 ZIP 檔案,系統就會自動為圖片加上所在資料夾的標籤。系統會將這個目錄視為 data_path 來參照。

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

接著,這個資料路徑可載入類神經網路模型,以 TensorFlow Lite Model Maker 的 ImageClassifierDataLoader 類別進行訓練。只要將檔案對準資料夾,就可以順利存取。

使用機器學習技術訓練模型時,有一個重要因素是「不」將「所有」資料用於訓練。使用先前未看過的資料來測試模型。很容易使用從 ImageClassifierDataLoader 傳回的資料集分割方法。傳入 0.9 後,您可以得到 90% 的訓練資料做為訓練資料,10% 則是測試資料:

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

資料準備就緒後,您可以使用該資料建立模型。

5. 建立圖片分類器模型

模型製作工具會抽象化設計類神經網路的許多細節,讓您不必擔心網路設計,以及卷積、稠密、relu、扁平、損失函式和最佳化工具。如為預設模型,您只要使用一行程式碼和提供的資料來訓練類神經網路,即可建立模型:

model = image_classifier.create(train_data)

執行這項作業時,您會看到類似以下的輸出內容:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

第一部分是顯示模型架構Model Maker 在背後的作業稱為 Transfer Learning,這項技術以現有的預先訓練模型做為起點,只是模型學到如何建構圖像,並應用這些概念理解 5 朵花。您可以在第一行看到:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

關鍵是「Hub」一詞,代表這個模型來自 TensorFlow Hub。根據預設,TensorFlow Lite Model Maker 會使用「MobileNet」模型這個模型支援辨識 1000 種圖片此處的邏輯是學習「特徵」來區分 1000 個類別,可重複使用相同的「功能」可對應至我們的 5 種花卉類別,因此不必從頭開始學習。

模型經歷了 5 個訓練週期,也就是「訓練週期」完整的訓練週期,類神經網路會嘗試將圖片與標籤進行比對。在經過 5 個訓練週期前,結果大約 1 分鐘,訓練資料的準確度是 93.85%。由於總共有 5 個類別,隨機猜測將是 20% 準確,所以就是這樣!(報告也會報告「損失」數字,但您暫時會忽略此數值)。

我們先前已將資料分割成訓練和測試資料,對先前未看過的資料進行評估,藉此評估網路在先前未見過的資料上成效。使用 model.evaluate 測試資料,可讓您更加瞭解在實際環境中的表現:

loss, accuracy = model.evaluate(test_data)

輸出的內容應如下所示:

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

請特別留意這裡的準確性。為 88.01%,因此在現實世界中使用預設模型時,準確度應該會再提升。這對於在大約一分鐘內訓練的預設模型而言並沒有幫助。當然,您可以盡量微調模型來改善模型,這一切看似科學!

6. 匯出模型

現在模型已訓練完成,下一步是將模型匯出成行動應用程式可使用的 .tflite 格式。模型製作工具提供可供使用的簡易匯出方法,只需指定輸出的目錄即可。

程式碼如下:

model.export(export_dir='/mm_flowers')

如果您在 Google Colab 中執行此工具,點選畫面左側的資料夾圖示即可查看模型:

cc5b9988775633b4.png

這裡會列出目前目錄的清單。使用指定的按鈕向上移動目錄:

51e6ac47c992142a.png

在您指定要匯出至 mm_flowers 目錄的程式碼中。開啟該檔案後,您就會看到名為「model.tflite」的檔案。這是訓練好的模型。

57bad87f294fd189.png

選取檔案後,畫面右側會顯示 3 個圓點。按一下這些圖示取得內容選單,您可以從這裡下載模型。

aee14ad10c4a8a1a.png

稍待片刻,模型會下載到「下載」資料夾。

7. 恭喜

您現在就可以將它整合至行動應用程式了!您將在下一個研究室中執行這項操作。