Posted on

TensorFlow目標檢測API – 功能介紹

YOLO並沒有含在TF2內建的Object Detection API

TensorFlow Object Detection API 提供了在COCO 2017 數據集上預訓練的檢測模型集合 。有多種類型的模型,包括 CenterNet,EfficientDet,SSD,Faster R-CNN 和 Mask R-CNN 等。

每個模型都有其特點:

  • CenterNet:是一種基於關鍵點檢測的目標檢測算法,它使用特定的關鍵點(例如物體的中心點)進行檢測,可以用於處理各種大小的物體,並且可以輸出更豐富的目標信息(如姿態,關鍵點等)。
  • EfficientDet:是一種基於 EfficientNet 和 BiFPN 的目標檢測算法,其優點在於精度高並且效率也相當高,模型大小和計算量都相對較小。
  • SSD (Single Shot MultiBox Detector):是一種用於實時目標檢測的算法,其特點是速度快,適用於需要實時響應的情況。
  • Faster R-CNN:是一種基於區域提議網絡(RPN)的目標檢測算法,其精度很高,但速度相對較慢。
  • Mask R-CNN:是一種擴展了 Faster R-CNN,能進行實例分割(Instance Segmentation)的算法,即除了檢測目標之外,還可以輸出目標的像素級別的掩碼。

然而,YOLO (You Only Look Once) 並沒有在這個列表中。 YOLO 是一種非常流行的實時目標檢測系統,以其快速和精確而著名。 YOLO 的預訓練模型並不在 TensorFlow Hub 提供,但你可以在 YOLO 的官方網站或者 Github 倉庫找到相關的預訓練模型和代碼(https://github.com/yyccR/yolov5_in_tf2_keras)。

如果你有特定的需求,例如對速度,精度,或者是特定類型的任務(例如實例分割或者姿態估計)有特殊的需求,可根據這些需求來選擇合適的模型。目前YOLO在PyTorch的支持進度比較快,到筆者這篇文章時,TF2對YOLO的支持只到yolov5。

包含的物件檢測模型列表

在這邊Speed越低代表速度越快,因為目標網址的CORSS DOMAIN的問題,要下載會需要按右鍵儲存網址然後到新視窗貼上才可以下載

Model nameSpeed (ms)COCO mAPOutputs
CenterNet HourGlass104 512×5127041.9Boxes
CenterNet HourGlass104 Keypoints 512×5127640.0/61.4Boxes/Keypoints
CenterNet HourGlass104 1024×102419744.5Boxes
CenterNet HourGlass104 Keypoints 1024×102421142.8/64.5Boxes/Keypoints
CenterNet Resnet50 V1 FPN 512×5122731.2Boxes
CenterNet Resnet50 V1 FPN Keypoints 512×5123029.3/50.7Boxes/Keypoints
CenterNet Resnet101 V1 FPN 512×5123434.2Boxes
CenterNet Resnet50 V2 512×5122729.5Boxes
CenterNet Resnet50 V2 Keypoints 512×5123027.6/48.2Boxes/Keypoints
CenterNet MobileNetV2 FPN 512×512623.4Boxes
CenterNet MobileNetV2 FPN Keypoints 512×512641.7Keypoints
EfficientDet D0 512×5123933.6Boxes
EfficientDet D1 640×6405438.4Boxes
EfficientDet D2 768×7686741.8Boxes
EfficientDet D3 896×8969545.4Boxes
EfficientDet D4 1024×102413348.5Boxes
EfficientDet D5 1280×128022249.7Boxes
EfficientDet D6 1280×128026850.5Boxes
EfficientDet D7 1536×153632551.2Boxes
SSD MobileNet v2 320×3201920.2Boxes
SSD MobileNet V1 FPN 640×6404829.1Boxes
SSD MobileNet V2 FPNLite 320×3202222.2Boxes
SSD MobileNet V2 FPNLite 640×6403928.2Boxes
SSD ResNet50 V1 FPN 640×640 (RetinaNet50)4634.3Boxes
SSD ResNet50 V1 FPN 1024×1024 (RetinaNet50)8738.3Boxes
SSD ResNet101 V1 FPN 640×640 (RetinaNet101)5735.6Boxes
SSD ResNet101 V1 FPN 1024×1024 (RetinaNet101)10439.5Boxes
SSD ResNet152 V1 FPN 640×640 (RetinaNet152)8035.4Boxes
SSD ResNet152 V1 FPN 1024×1024 (RetinaNet152)11139.6Boxes
Faster R-CNN ResNet50 V1 640×6405329.3Boxes
Faster R-CNN ResNet50 V1 1024×10246531.0Boxes
Faster R-CNN ResNet50 V1 800×13336531.6Boxes
Faster R-CNN ResNet101 V1 640×6405531.8Boxes
Faster R-CNN ResNet101 V1 1024×10247237.1Boxes
Faster R-CNN ResNet101 V1 800×13337736.6Boxes
Faster R-CNN ResNet152 V1 640×6406432.4Boxes
Faster R-CNN ResNet152 V1 1024×10248537.6Boxes
Faster R-CNN ResNet152 V1 800×133310137.4Boxes
Faster R-CNN Inception ResNet V2 640×64020637.7Boxes
Faster R-CNN Inception ResNet V2 1024×102423638.7Boxes
Mask R-CNN Inception ResNet V2 1024×102430139.0/34.6Boxes/Masks
ExtremeNet (deprecated)Boxes
ExtremeNetBoxes

我所選擇的模型

以我的需求而言,我會需要偵測即時串流內的物件,因此需要高速的演算法,我選擇了SSD,官方API內也包含了多個不同的SSD變種和不同的基礎模型(例如 MobileNet 和 ResNet)。這些模型的主要區別在於其複雜性、精度和運行速度:

  1. MobileNet 是一種針對移動和嵌入式設備設計的輕量級深度卷積神經網絡。相比於 ResNet,MobileNet 通常具有更少的參數和計算量,從而在設備上運行速度更快,但可能在精度上稍遜一籌。 MobileNet 的版本 V1 和 V2 是其結構上的不同版本,V2 通常在性能上優於 V1。
  2. FPN (Feature Pyramid Network) 是一種目標檢測模型中常用的模塊,它能幫助模型更好地處理不同尺度的物體。使用了 FPN 的模型通常在處理小物體上有更好的表現。 FPNlite 是 FPN 的一個更輕量級的版本。
  3. ResNet (Residual Network) 是一種深度卷積神經網絡,相比於 MobileNet,ResNet 的模型更深,參數和計算量更大,但在精度上通常更好。 ResNet 的版本(例如 ResNet50, ResNet101, ResNet152)指的是網絡的深度,數字越大,模型越深,通常精度越高,但計算量也越大。
  4. RetinaNet 是一種目標檢測模型,它是基於 FPN 和 ResNet 的一種網絡,其特點是使用了一種新的損失函數(Focal Loss)來解決類別不平衡的問題,對於包含大量背景和少量物體的圖像有很好的性能。

最後我決定使用SSD MobileNet V2 FPNLite 640x640

使用預訓練的物件偵測模型

SSD MobileNet V2 FPNLite 640x640在這邊下載: http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8.tar.gz

解壓縮後可以看到以下檔案

  1. pipeline.config: 此文件包含了模型訓練過程中所有的配置參數,包括使用的模型類型(例如 Faster R-CNN,SSD 等),輸入圖像的大小,學習率,批量大小等。當您選擇一個預訓練模型進行微調(fine-tuning)時,這個 pipeline.config 文件通常會包含在下載的模型文件夾中。
  2. checkpoint: 此文件(或者一組文件)保存了模型的權重。在訓練過程中,TensorFlow 會定期保存模型的權重到 checkpoint 文件中,以便在訓練中斷後可以恢復訓練,或者在訓練結束後使用訓練好的模型進行預測。
  3. saved_model裡面是saved_model.pb 文件,這個文件包含了模型的結構和參數。

下面的方法可以用saved_model.pb產生checkpoint

import tensorflow as tf
from tensorflow.python.framework import graph_io
from tensorflow.python.tools import freeze_graph
from tensorflow.tools.graph_transforms import TransformGraph

# 載入模型
loaded = tf.saved_model.load(PATH_TO_SAVED_MODEL)

# 將模型的權重保存為 checkpoint
ckpt = tf.train.Checkpoint(model=loaded)
ckpt.save(PATH_TO_CKPT)