Keras 3 API 文件 / KerasCV / 模型 / 任務 / RetinaNet 模型

RetinaNet 模型

[來源]

RetinaNet 類別

keras_cv.models.RetinaNet(
    backbone,
    num_classes,
    bounding_box_format,
    anchor_generator=None,
    label_encoder=None,
    prediction_decoder=None,
    feature_pyramid=None,
    classification_head=None,
    box_head=None,
    **kwargs
)

一個實現 RetinaNet 元架構的 Keras 模型。

實現用於目標檢測的 RetinaNet 架構。建構函數需要 num_classesbounding_box_format 和一個骨幹網路。還可以選擇提供自訂的標籤編碼器和預測解碼器。

範例

images = np.ones((1, 512, 512, 3))
labels = {
    "boxes": tf.cast([
        [
            [0, 0, 100, 100],
            [100, 100, 200, 200],
            [300, 300, 100, 100],
        ]
    ], dtype=tf.float32),
    "classes": tf.cast([[1, 1, 1]], dtype=tf.float32),
}
model = keras_cv.models.RetinaNet(
    num_classes=20,
    bounding_box_format="xywh",
    backbone=keras_cv.models.ResNet50Backbone.from_preset(
        "resnet50_imagenet"
    )
)

# Evaluate model without box decoding and NMS
model(images)

# Prediction with box decoding and NMS
model.predict(images)

# Train model
model.compile(
    classification_loss='focal',
    box_loss='smoothl1',
    optimizer=keras.optimizers.SGD(global_clipnorm=10.0),
    jit_compile=False,
)
model.fit(images, labels)

參數

  • num_classes:資料集中不包括背景類別的類別數量。類別應由 [0, num_classes) 範圍內的整數表示。
  • bounding_box_format:輸入資料集的邊界框格式。有關支援的邊界框格式的詳細資訊,請參閱keras.io 文件
  • backbonekeras.Model。如果使用預設的 feature_pyramid,則必須實現 pyramid_level_inputs 屬性,其中鍵為 "P3"、"P4" 和 "P5",值為層名稱。在許多情況下,一個明智的骨幹網路選擇是:keras_cv.models.ResNetBackbone.from_preset("resnet50_imagenet")
  • anchor_generator:(選用) keras_cv.layers.AnchorGenerator。如果提供,則錨點產生器將被傳遞給 label_encoderprediction_decoder。僅當 label_encoderprediction_decoder 都為 None 時才使用。預設為具有以下參數化的錨點產生器:strides=[2**i for i in range(3, 8)]scales=[2**x for x in [0, 1 / 3, 2 / 3]]sizes=[32.0, 64.0, 128.0, 256.0, 512.0]aspect_ratios=[0.5, 1.0, 2.0]
  • label_encoder:(選用) 一個 keras.Layer,其 call() 方法接受一個影像張量、一個邊界框張量和一個邊界框類別張量,並返回 RetinaNet 訓練目標。預設情況下,會建立並使用 KerasCV 標準 RetinaNetLabelEncoder。此物件的 call() 方法的結果將作為 y_true 參數傳遞給 loss 物件,用於 box_lossclassification_loss
  • prediction_decoder:(選用) 一個 keras.layers.Layer,負責將 RetinaNet 預測轉換為可用的邊界框張量。如果未提供,則會提供一個預設值。預設的 prediction_decoder 層是一個 keras_cv.layers.MultiClassNonMaxSuppression 層,它使用非極大值抑制進行邊界框修剪。
  • feature_pyramid:(選用)一個 keras.layers.Layer,當在 backbone 的金字塔級輸出上被呼叫時,會產生一個 4D 特徵圖列表(包含批次維度)。如果未提供,則會使用論文中的參考實現。
  • classification_head:(選用)執行邊界框分類的 keras.Layer。如果未提供,則會使用具有 3 個層的簡單 ConvNet。
  • box_head:(選用)執行邊界框回歸的 keras.Layer。如果未提供,則會使用具有 3 個層的簡單 ConvNet。

[來源]

from_preset 方法

RetinaNet.from_preset()

從預設配置和權重實例化 RetinaNet 模型。

參數

  • preset:字串。必須是 "resnet18"、"resnet34"、"resnet50"、"resnet101"、"resnet152"、"resnet18_v2"、"resnet34_v2"、"resnet50_v2"、"resnet101_v2"、"resnet152_v2"、"mobilenet_v3_small"、"mobilenet_v3_large"、"csp_darknet_tiny"、"csp_darknet_s"、"csp_darknet_m"、"csp_darknet_l"、"csp_darknet_xl"、"efficientnetv1_b0"、"efficientnetv1_b1"、"efficientnetv1_b2"、"efficientnetv1_b3"、"efficientnetv1_b4"、"efficientnetv1_b5"、"efficientnetv1_b6"、"efficientnetv1_b7"、"efficientnetv2_s"、"efficientnetv2_m"、"efficientnetv2_l"、"efficientnetv2_b0"、"efficientnetv2_b1"、"efficientnetv2_b2"、"efficientnetv2_b3"、"densenet121"、"densenet169"、"densenet201"、"efficientnetlite_b0"、"efficientnetlite_b1"、"efficientnetlite_b2"、"efficientnetlite_b3"、"efficientnetlite_b4"、"yolo_v8_xs_backbone"、"yolo_v8_s_backbone"、"yolo_v8_m_backbone"、"yolo_v8_l_backbone"、"yolo_v8_xl_backbone"、"vitdet_base"、"vitdet_large"、"vitdet_huge"、"videoswin_tiny"、"videoswin_small"、"videoswin_base"、"resnet50_imagenet"、"resnet50_v2_imagenet"、"mobilenet_v3_large_imagenet"、"mobilenet_v3_small_imagenet"、"csp_darknet_tiny_imagenet"、"csp_darknet_l_imagenet"、"efficientnetv2_s_imagenet"、"efficientnetv2_b0_imagenet"、"efficientnetv2_b1_imagenet"、"efficientnetv2_b2_imagenet"、"densenet121_imagenet"、"densenet169_imagenet"、"densenet201_imagenet"、"yolo_v8_xs_backbone_coco"、"yolo_v8_s_backbone_coco"、"yolo_v8_m_backbone_coco"、"yolo_v8_l_backbone_coco"、"yolo_v8_xl_backbone_coco"、"vitdet_base_sa1b"、"vitdet_large_sa1b"、"vitdet_huge_sa1b"、"videoswin_tiny_kinetics400"、"videoswin_small_kinetics400"、"videoswin_base_kinetics400"、"videoswin_base_kinetics400_imagenet22k"、"videoswin_base_kinetics600_imagenet22k"、"videoswin_base_something_something_v2"、"retinanet_resnet50_pascalvoc" 其中之一。如果要尋找具有預先訓練權重的預設,請選擇 "resnet50_imagenet"、"resnet50_v2_imagenet"、"mobilenet_v3_large_imagenet"、"mobilenet_v3_small_imagenet"、"csp_darknet_tiny_imagenet"、"csp_darknet_l_imagenet"、"efficientnetv2_s_imagenet"、"efficientnetv2_b0_imagenet"、"efficientnetv2_b1_imagenet"、"efficientnetv2_b2_imagenet"、"densenet121_imagenet"、"densenet169_imagenet"、"densenet201_imagenet"、"yolo_v8_xs_backbone_coco"、"yolo_v8_s_backbone_coco"、"yolo_v8_m_backbone_coco"、"yolo_v8_l_backbone_coco"、"yolo_v8_xl_backbone_coco"、"vitdet_base_sa1b"、"vitdet_large_sa1b"、"vitdet_huge_sa1b"、"videoswin_tiny_kinetics400"、"videoswin_small_kinetics400"、"videoswin_base_kinetics400"、"videoswin_base_kinetics400_imagenet22k"、"videoswin_base_kinetics600_imagenet22k"、"videoswin_base_something_something_v2"、"retinanet_resnet50_pascalvoc" 其中之一。
  • load_weights:是否將預先訓練的權重載入模型。預設為 None,這取決於預設是否有可用的預先訓練權重。
  • input_shape :將傳遞給主幹初始化的輸入形狀,預設為 None。如果為 None,則會使用預設值。

範例

# Load architecture and weights from preset
model = keras_cv.models.RetinaNet.from_preset(
    "resnet50_imagenet",
)

# Load randomly initialized model from preset architecture with weights
model = keras_cv.models.RetinaNet.from_preset(
    "resnet50_imagenet",
    load_weights=False,
預設名稱 參數 說明
retinanet_resnet50_pascalvoc 35.60M 具有 ResNet50 v1 主幹的 RetinaNet。在 PascalVOC 2012 物件偵測任務上訓練,該任務包含 20 個類別。此模型在評估集上達到了 0.33 的最終 MaP。

[來源]

PredictionHead 類別

keras_cv.models.retinanet.PredictionHead(
    output_filters, bias_initializer, num_conv_layers=3, **kwargs
)

類別/框預測頭。

參數

  • output_filters:最後一層中的捲積濾波器數量。
  • bias_initializer:最後一層捲積層的偏差初始化器。

回傳

根據 output_filters 表示分類或框回歸頭的函數。