當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.keras.metrics.OneHotIoU用法及代碼示例


計算one-hot 編碼標簽的Intersection-Over-Union 度量。

繼承自:IoUMetricLayerModule

用法

tf.keras.metrics.OneHotIoU(
    num_classes:int,
    target_class_ids:Union[List[int], Tuple[int, ...]],
    name=None,
    dtype=None
)

參數

  • num_classes 預測任務可能具有的標簽數量。將分配形狀為(num_classes, num_classes) 的混淆矩陣來累積預測,從中計算度量。
  • target_class_ids 返回指標的目標類 ID 的元組或列表。要計算特定類的 IoU,應提供單個 id 值的列表(或元組)。
  • name (可選)指標實例的字符串名稱。
  • dtype (可選)度量結果的數據類型。

一般定義和計算:

Intersection-Over-Union 是語義圖像分割的常用評估指標。

對於單個類,IoU 指標定義如下:

iou = true_positives / (true_positives + false_positives + false_negatives)

為了計算 IoU,預測被累積在一個混淆矩陣中,由 sample_weight 加權,然後從中計算度量。

如果 sample_weightNone ,則權重默認為 1。使用 0 的 sample_weight 來屏蔽值。

此類可用於計算 multi-class 分類任務的 IoU,其中標簽為 one-hot 編碼(最後一個軸每個類應該有一個維度)。請注意,預測也應該具有相同的形狀。為了計算 IoU,首先通過類軸上的 argmax 將標簽和預測轉換回整數格式。然後應用與基礎IoU 類相同的計算步驟。

請注意,如果標簽和預測中隻有一個通道,則此類與類 IoU 相同。在這種情況下,請改用IoU

此外,請確保 num_classes 等於數據中的類數,以避免在計算混淆矩陣時出現“標簽越界”錯誤。

單機使用:

y_true = tf.constant([[0, 0, 1], [1, 0, 0], [0, 1, 0], [1, 0, 0]])
y_pred = tf.constant([[0.2, 0.3, 0.5], [0.1, 0.2, 0.7], [0.5, 0.3, 0.1],
                      [0.1, 0.4, 0.5]])
sample_weight = [0.1, 0.2, 0.3, 0.4]
m = metrics.OneHotIoU(num_classes=3, target_class_ids=[0, 2])
m.update_state(y_true=y_true, y_pred=y_pred, sample_weight=sample_weight)
# cm = [[0, 0, 0.2+0.4],
#       [0.3, 0, 0],
#       [0, 0, 0.1]]
# sum_row = [0.3, 0, 0.7], sum_col = [0.6, 0.3, 0.1]
# true_positives = [0, 0, 0.1]
# single_iou = true_positives / (sum_row + sum_col - true_positives))
# mean_iou = (0 / (0.3 + 0.6 - 0) + 0.1 / (0.7 + 0.1 - 0.1)) / 2
m.result().numpy()
0.071

compile() API 的用法:

model.compile(
  optimizer='sgd',
  loss='mse',
  metrics=[tf.keras.metrics.OneHotIoU(num_classes=3, target_class_id=[1])])

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.metrics.OneHotIoU。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。