物件偵測

對於指定的圖片或影片串流,物件偵測模型可以識別可能存在的已知物件組,並提供物件在圖片中的位置資訊。

例如,這個範例應用程式的螢幕截圖顯示了如何辨識出兩個物件,以及如何標註其位置

Screenshot of Android example

開始使用

如要瞭解如何在行動應用程式中使用物件偵測,請瀏覽範例應用程式與指南

如果您使用的平台不是 Android 或 iOS,或者您已熟悉 TensorFlow Lite API,則可以下載我們的入門物件偵測模型和隨附標籤。

下載含中繼資料的入門模型

如要進一步瞭解中繼資料和相關欄位 (例如:labels.txt),請參閱從模型讀取中繼資料

如果您想針對自己的工作訓練自訂偵測模型,請參閱模型自訂

針對下列用途,您應使用不同類型的模型

  • 預測圖片最可能代表哪個單一標籤 (請參閱圖片分類)
  • 預測圖片的組成,例如主體與背景 (請參閱區隔)

範例應用程式與指南

如果您是 TensorFlow Lite 新手,並且使用 Android 或 iOS,建議您瀏覽下列範例應用程式,這能幫助您開始使用。

Android

您可以運用 TensorFlow Lite Task Library 的現成 API,只需幾行程式碼即可整合物件偵測模型。您也可以使用 TensorFlow Lite Interpreter Java API 建構自己的自訂推論管線。

以下 Android 範例分別示範了使用 Task library 和 interpreter API 這兩種方法的實作方式。

查看 Android 範例

iOS

您可以使用 TensorFlow Lite Interpreter Swift API 整合模型。請參閱以下 iOS 範例。

查看 iOS 範例

模型說明

本節說明從 TensorFlow Object Detection API 轉換為 TensorFlow Lite 的 Single-Shot Detector 模型的簽名。

物件偵測模型經過訓練,可偵測多個類別物件的存在和位置。例如,模型可能會使用包含各種水果的圖片進行訓練,並搭配指定水果類別的「標籤」(例如:蘋果、香蕉或草莓),以及指定每個物件在圖片中顯示位置的資料。

後續將圖片提供給模型時,模型會輸出偵測到的物件清單、包含每個物件的邊界框位置,以及指出偵測正確信賴度的分數。

輸入簽名

模型會將圖片作為輸入。

假設預期的圖片為 300x300 像素,每個像素有三個通道 (紅、藍、綠)。這應以 270,000 位元組值的扁平緩衝區 (300x300x3) 饋送至模型。如果模型已量化,則每個值都應是單一位元組,代表介於 0 到 255 之間的值。

您可以查看我們的範例應用程式程式碼,瞭解如何在 Android 上執行此預先處理。

輸出簽名

模型會輸出四個陣列,對應至索引 0-4。陣列 0、1 和 2 說明 N 個偵測到的物件,每個陣列中的一個元素對應至每個物件。

索引 名稱 說明
0 位置 介於 0 到 1 之間的 [N][4] 個浮點值多維陣列,內部陣列代表邊界框,格式為 [上、左、下、右]
1 類別 N 個整數 (輸出為浮點值) 陣列,每個整數都指出標籤檔案中類別標籤的索引
2 分數 介於 0 到 1 之間的 N 個浮點值陣列,代表偵測到類別的機率
3 偵測次數 N 的整數值

例如,假設模型已訓練為偵測蘋果、香蕉和草莓。當提供圖片時,模型會輸出一組偵測結果數量 (在此範例中為 5)。

類別 分數 位置
蘋果 0.92 [18, 21, 57, 63]
香蕉 0.88 [100, 30, 180, 150]
草莓 0.87 [7, 82, 89, 163]
香蕉 0.23 [42, 66, 57, 83]
蘋果 0.11 [6, 42, 31, 58]

信賴度分數

如要解讀這些結果,我們可以查看每個偵測到物件的分數和位置。分數是介於 0 到 1 之間的數字,表示物件確實偵測到的信賴度。數字越接近 1,表示模型越有信心。

根據您的應用程式,您可以決定一個截止門檻,低於此門檻您將捨棄偵測結果。對於目前的範例,合理的截止值是 0.5 分 (表示偵測有效的機率為 50%)。在這種情況下,陣列中的最後兩個物件會被忽略,因為這些信賴度分數低於 0.5

類別 分數 位置
蘋果 0.92 [18, 21, 57, 63]
香蕉 0.88 [100, 30, 180, 150]
草莓 0.87 [7, 82, 89, 163]
香蕉 0.23 [42, 66, 57, 83]
蘋果 0.11 [6, 42, 31, 58]

您使用的截止值應根據您是否更能接受假陽性 (錯誤識別的物件,或圖片中錯誤識別為物件的區域,但實際上不是物件) 或假陰性 (因為信賴度較低而錯過的真實物件) 而定。

例如,在下圖中,梨子 (並非模型訓練偵測的物件) 被誤判為「人」。這是假陽性的範例,可以透過選擇適當的截止值來忽略。在此情況下,0.6 (或 60%) 的截止值可以輕鬆排除假陽性。

Screenshot of Android example showing a false positive

位置

對於每個偵測到的物件,模型都會傳回一個包含四個數字的陣列,代表環繞其位置的邊界矩形。對於提供的入門模型,數字順序如下

[ 上, 左, 下, ]

「上」值表示矩形上邊緣與圖片頂端的距離,以像素為單位。「左」值表示左邊緣與輸入圖片左側的距離。其他值則以類似方式表示下邊緣和右邊緣。

效能基準

我們的入門模型的效能基準數字是使用此處說明的工具產生。

模型名稱 模型大小 裝置 GPU CPU
COCO SSD MobileNet v1 27 Mb Pixel 3 (Android 10) 22 毫秒 46 毫秒*
Pixel 4 (Android 10) 20 毫秒 29 毫秒*
iPhone XS (iOS 12.4.1) 7.6 毫秒 11 毫秒**

* 使用 4 個執行緒。

** 在 iPhone 上使用 2 個執行緒以獲得最佳效能結果。

模型自訂

預先訓練模型

行動裝置最佳化偵測模型具有各種延遲和精確度特性,可在偵測動物園中找到。每個模型都遵循以下章節中說明的輸入和輸出簽名。

大多數下載的 zip 檔都包含 model.tflite 檔案。如果沒有,可以使用這些指示產生 TensorFlow Lite flatbuffer。TF2 Object Detection Zoo 的 SSD 模型也可以使用此處的指示轉換為 TensorFlow Lite。請務必注意,偵測模型無法使用 TensorFlow Lite Converter 直接轉換,因為它們需要產生行動裝置友善來源模型的中繼步驟。上述連結的指令碼會執行此步驟。

TF1TF2 匯出指令碼都有參數,可啟用更多輸出物件或速度較慢但更精確的後處理。請搭配指令碼使用 --help 以查看完整支援引數清單。

目前,裝置端推論僅針對 SSD 模型進行最佳化。對於其他架構 (例如 CenterNet 和 EfficientDet) 的更佳支援仍在調查中。

如何選擇要自訂的模型?

每個模型都有自己的精確度 (以 mAP 值量化) 和延遲特性。您應選擇最適合您的用途和目標硬體的模型。例如,Edge TPU 模型非常適合在 Pixel 4 上 Google 的 Edge TPU 進行推論。

您可以使用我們的基準工具評估模型,並選擇最有效率的可用選項。

在自訂資料上微調模型

我們提供的預先訓練模型經過訓練,可偵測 90 個類別的物件。如需完整類別清單,請參閱模型中繼資料中的標籤檔案。

您可以使用稱為遷移學習的技術,重新訓練模型以辨識原始集合中沒有的類別。例如,您可以重新訓練模型以偵測多種蔬菜,即使原始訓練資料中只有一種蔬菜。若要執行此操作,您需要一組訓練圖片,用於訓練您希望訓練的每個新標籤。建議的方式是使用 TensorFlow Lite Model Maker 程式庫,這能簡化使用自訂資料集訓練 TensorFlow Lite 模型 (只需幾行程式碼) 的流程。它使用遷移學習來減少所需的訓練資料量和時間。您也可以從 Few-shot detection Colab 學習,瞭解如何使用少量範例微調預先訓練模型。

如要使用較大的資料集進行微調,請參閱以下指南,瞭解如何使用 TensorFlow Object Detection API 訓練自己的模型:TF1TF2。訓練完成後,可以使用此處的指示將模型轉換為 TFLite 友善格式:TF1TF2