物件偵測工作指南

貓咪和狗狗以正確標示的邊界框標示出來

您可以使用 MediaPipe 物件偵測器工作,偵測圖片或影片中多個物件類別的存在情形和位置。舉例來說,物體偵測器可找出圖片中的狗。這項工作會使用機器學習 (ML) 模型處理圖片資料,接受靜態資料或連續影片串流做為輸入內容,並輸出偵測結果清單。每個偵測結果都代表圖片或影片中出現的物件。

試試看吧!

開始使用

請按照下列任一實作指南的說明,開始使用這個工作:

這些平台專屬指南會逐步引導您完成這項工作的基本實作方式,包括建議的模型,以及含有建議設定選項的程式碼範例。

任務詳細資料

本節將說明此工作的功能、輸入內容和輸出內容。

功能

  • 輸入圖像處理:處理作業包括圖像旋轉、大小調整、標準化和色彩空間轉換。
  • 標籤對應語言代碼:設定顯示名稱所使用的語言
  • 分數門檻:根據預測分數篩選結果。
  • 前幾名偵測功能:篩選數字偵測結果。
  • 標籤許可清單和拒絕清單:指定偵測到的類別。
工作輸入內容 任務輸出
Object Detector API 接受下列任一資料類型的輸入內容:
  • 靜態圖片
  • 已解碼的影片影格
  • 直播視訊畫面
Object Detector API 會針對偵測到的物件輸出以下結果:
  • 物件類別
  • 機率分數
  • 定界框座標

設定選項

此工作提供下列設定選項:

選項名稱 說明 值範圍 預設值
running_mode 設定工作執行模式。共有三種模式:

IMAGE:單一圖片輸入模式。

VIDEO:影片解碼影格模式。

LIVE_STREAM:輸入資料 (例如來自攝影機的資料) 的直播模式。在這個模式中,必須呼叫 resultListener,才能設定事件監聽器,以非同步方式接收結果。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names 設定標籤語言,用於工作模型中繼資料中提供的顯示名稱 (如有)。預設值為英文的 en。您可以使用 TensorFlow Lite Metadata Writer API,在自訂模型的中繼資料中新增本地化標籤。 語言代碼 en
max_results 設定要傳回的最高分數偵測結果選用數量上限。 任何正數 -1 (傳回所有結果)
score_threshold 設定預測分數門檻,覆寫模型中繼資料中提供的門檻 (如果有)。低於這個值的結果會遭到拒絕。 任何浮點 未設定
category_allowlist 設定允許的選項類別名稱清單。如果不為空白,則偵測結果的類別名稱若不在這個集合中,就會篩除。系統會忽略重複或不明的類別名稱。這個選項與 category_denylist 互斥,如果同時使用這兩個選項,系統會傳回錯誤。 任何字串 未設定
category_denylist 設定選用的不允許類別名稱清單。如果不為空白,系統會篩除偵測結果中類別名稱屬於這個集合的結果。系統會忽略重複或不明的類別名稱。這個選項與 category_allowlist 互斥,如果同時使用這兩個選項,會導致錯誤。 任何字串 未設定

模型

Object Detector API 需要下載物件偵測模型,並儲存在專案目錄中。如果您還沒有模型,請先採用預設的建議模型。本節介紹的其他模型會在延遲時間和準確度之間取得平衡。

EfficientDet-Lite0 模型使用 EfficientNet-Lite0 骨幹,具有 320x320 輸入大小和 BiFPN 特徵網路。這個模型是使用 COCO 資料集訓練的,這是大規模物件偵測資料集,內含 150 萬個物件例項和 80 個物件標籤。請參閱完整清單,瞭解支援的標籤。EfficientDet-Lite0 可用於 int8、float16 或 float32。我們建議您使用這個模型,因為它可在延遲時間和準確度之間取得平衡。它既準確又輕巧,適合多種用途。

模型名稱 輸入形狀 量化類型 版本
EfficientDet-Lite0 (int8) 320 x 320 int8 最新
EfficientDet-Lite0 (float 16) 320 x 320 float 16 最新
EfficientDet-Lite0 (float 32) 320 x 320 None (float32) 最新

EfficientDet-Lite2 模型

EfficientDet-Lite2 模型採用 EfficientNet-Lite2 骨幹,具有 448x448 輸入大小和 BiFPN 特徵網路。這個模型是使用 COCO 資料集訓練的,這是大規模物件偵測資料集,內含 150 萬個物件例項和 80 個物件標籤。請參閱支援的標籤完整清單。EfficientDet-Lite2 可做為 int8、float16 或 float32 模型使用。這個模型通常比 EfficientDet-Lite0 更準確,但速度較慢且記憶體用量較高。這個模型適合用於準確度比速度和大小更重要的用途。

模型名稱 輸入形狀 量化類型 版本
EfficientDet-Lite2 (int8) 448 x 448 int8 最新
EfficientDet-Lite2 (浮點 16) 448 x 448 float 16 最新
EfficientDet-Lite2 (浮點 32) 448 x 448 None (float32) 最新

SSD MobileNetV2 模型

SSD MobileNetV2 模型會使用 MobileNetV2 主幹,其輸入大小為 256x256,並使用 SSD 特徵網路。這個模型是使用 COCO 資料集訓練的,這是大規模物件偵測資料集,內含 150 萬個物件例項和 80 個物件標籤。請參閱支援的標籤完整清單。SSD MobileNetV2 可做為 int8 和 float 32 模型使用。這個模型比 EfficientDet-Lite0 更快、更輕,但準確度通常較低。這個模型適合需要快速、輕量化模型的用途,但會犧牲部分準確度。

模型名稱 輸入形狀 量化類型 版本
SSDMobileNet-V2 (int8) 256 x 256 int8 最新
SSDMobileNet-V2 (浮點 32) 256 x 256 None (float32) 最新

模型需求和中繼資料

如果您決定建構要與此工作搭配使用的模型,請參閱本節說明的自訂模型相關規定。自訂模型必須採用 TensorFlow Lite 格式,且必須包含描述模型運作參數的metadata

設計需求

輸入 圖案 說明
輸入圖像 形狀為 [1, height, width, 3]的 Float32 張量 經過標準化的輸入圖片。
輸出 圖案 說明
detection_boxes 形狀為 [1, num_boxes, 4] 的 Float32 張量 每個偵測到的物件框位置。
detection_classes 形狀為 [1, num_boxes] 的 Float32 張量 每個偵測到的物件類別名稱的索引。
detection_scores 形狀為 [1, num_boxes] 的 float32 張量 每個偵測到的物件預測分數。
num_boxes 大小為 1 的 Float32 張量 偵測到的方塊數量。

中繼資料規定

參數 說明 說明
input_norm_mean 輸入張量規格化時使用的平均值。 經過標準化的輸入圖片。
input_norm_std 輸入張量正規化中使用的欄位規範。 每個偵測到的物件框位置。
label_file_paths 類別張量標籤檔案的路徑。如果模型沒有任何標籤檔案,請傳遞空白清單。 每個偵測到的物件類別名稱的索引。
score_calibration_md 分類張量中的分數校正作業資訊。如果模型未使用分數校正,則不需要這個參數。
每個偵測到的物件預測分數。
num_boxes 大小為 1 的 Float32 張量 偵測到的方塊數量。

工作基準

以下是上述預先訓練模型的工作基準。延遲時間結果是 Pixel 6 使用 CPU / GPU 的平均延遲時間。

模型名稱 CPU 延遲時間 GPU 延遲時間
EfficientDet-Lite0 float32 模型 61.30 毫秒 27.83 毫秒
EfficientDet-Lite0 float16 模型 53.97 毫秒 27.97 毫秒
EfficientDet-Lite0 int8 模型 29.31 毫秒 -
EfficientDet-Lite2 float32 模型 197.98 毫秒 41.15 毫秒
EfficientDet-Lite2 float16 模型 198.77 毫秒 47.31 毫秒
EfficientDet-Lite2 int8 模型 70.91 毫秒 -
SSD MobileNetV2 float32 模型 36.30 毫秒 24.01 毫秒
SSD MobileNetV2 float16 模型 37.35 毫秒 28.16 毫秒