Keras 3 API 文档 / 指标 / 图像分割指标

图像分割指标

[来源]

IoU

keras.metrics.IoU(
    num_classes,
    target_class_ids,
    name=None,
    dtype=None,
    ignore_class=None,
    sparse_y_true=True,
    sparse_y_pred=True,
    axis=-1,
)

计算特定目标类的交并比指标。

公式

iou = true_positives / (true_positives + false_positives + false_negatives)

交并比是语义图像分割中常用的评估指标。

为了计算 IoU,预测结果会被累积到混淆矩阵中,并根据 sample_weight 加权,然后根据混淆矩阵计算指标。

如果 sample_weightNone,则权重默认为 1。使用 sample_weight 为 0 来屏蔽值。

注意,此类首先计算所有单个类的 IoU,然后返回由 target_class_ids 指定的类的 IoU 平均值。如果 target_class_ids 只有一个 ID 值,则返回该特定类的 IoU。

参数

  • num_classes:预测任务可能具有的标签数量。
  • target_class_ids:返回指标的目标类 ID 的元组或列表。要计算特定类的 IoU,应提供单个 ID 值的列表(或元组)。
  • name:指标实例的可选字符串名称。
  • dtype:指标结果的可选数据类型。
  • ignore_class:可选整数。在指标计算期间要忽略的类的 ID。例如,在分割问题中,分割图中存在“空洞”类(通常为 -1 或 255)时,这很有用。默认情况下(ignore_class=None),会考虑所有类。
  • sparse_y_true:标签是使用整数还是密集浮点向量进行编码。如果为 False,则使用 argmax 函数确定每个样本最可能的关联标签。
  • sparse_y_pred:预测是使用整数还是密集浮点向量进行编码。如果为 False,则使用 argmax 函数确定每个样本最可能的关联标签。
  • axis:可选参数,-1 是包含 logits 的维度。默认为 -1

示例

>>> # cm = [[1, 1],
>>> #        [1, 1]]
>>> # sum_row = [2, 2], sum_col = [2, 2], true_positives = [1, 1]
>>> # iou = true_positives / (sum_row + sum_col - true_positives))
>>> # iou = [0.33, 0.33]
>>> m = keras.metrics.IoU(num_classes=2, target_class_ids=[0])
>>> m.update_state([0, 0, 1, 1], [0, 1, 0, 1])
>>> m.result()
0.33333334
>>> m.reset_state()
>>> m.update_state([0, 0, 1, 1], [0, 1, 0, 1],
...                sample_weight=[0.3, 0.3, 0.3, 0.1])
>>> # cm = [[0.3, 0.3],
>>> #        [0.3, 0.1]]
>>> # sum_row = [0.6, 0.4], sum_col = [0.6, 0.4],
>>> # true_positives = [0.3, 0.1]
>>> # iou = [0.33, 0.14]
>>> m.result()
0.33333334

compile() API 一起使用

model.compile(
    optimizer='sgd',
    loss='mse',
    metrics=[keras.metrics.IoU(num_classes=2, target_class_ids=[0])])

[来源]

BinaryIoU

keras.metrics.BinaryIoU(
    target_class_ids=(0, 1), threshold=0.5, name=None, dtype=None
)

计算类 0 和/或 1 的交并比指标。

公式

iou = true_positives / (true_positives + false_positives + false_negatives)

交并比是语义图像分割中常用的评估指标。

为了计算 IoU,预测结果会被累积到混淆矩阵中,并根据 sample_weight 加权,然后根据混淆矩阵计算指标。

如果 sample_weightNone,则权重默认为 1。使用 sample_weight 为 0 来屏蔽值。

此类可用于计算二分类任务的 IoU,其中预测结果以 logits 的形式提供。首先将 threshold 应用于预测值,使得低于 threshold 的值转换为类 0,高于 threshold 的值转换为类 1。

然后计算类 0 和 1 的 IoU,返回由 target_class_ids 指定的类的 IoU 平均值。

注意:当 threshold=0 时,此指标与 IoU 的行为相同。

参数

  • target_class_ids:返回指标的目标类 ID 的元组或列表。选项为 [0][1][0, 1]。使用 [0](或 [1]),返回类 0(或类 1)的 IoU 指标。使用 [0, 1],返回这两个类的 IoU 平均值。
  • threshold:应用于预测 logits 的阈值,以将其转换为预测类 0(如果 logit 低于 threshold)或预测类 1(如果 logit 高于 threshold)。
  • name:指标实例的可选字符串名称。
  • dtype:指标结果的可选数据类型。

示例

示例

>>> m = keras.metrics.BinaryIoU(target_class_ids=[0, 1], threshold=0.3)
>>> m.update_state([0, 1, 0, 1], [0.1, 0.2, 0.4, 0.7])
>>> m.result()
0.33333334
>>> m.reset_state()
>>> m.update_state([0, 1, 0, 1], [0.1, 0.2, 0.4, 0.7],
...                sample_weight=[0.2, 0.3, 0.4, 0.1])
>>> # cm = [[0.2, 0.4],
>>> #        [0.3, 0.1]]
>>> # sum_row = [0.6, 0.4], sum_col = [0.5, 0.5],
>>> # true_positives = [0.2, 0.1]
>>> # iou = [0.222, 0.125]
>>> m.result()
0.17361112

compile() API 一起使用

model.compile(
    optimizer='sgd',
    loss='mse',
    metrics=[keras.metrics.BinaryIoU(
        target_class_ids=[0],
        threshold=0.5
    )]
)

[来源]

OneHotIoU

keras.metrics.OneHotIoU(
    num_classes,
    target_class_ids,
    name=None,
    dtype=None,
    ignore_class=None,
    sparse_y_pred=False,
    axis=-1,
)

计算独热编码标签的交并比指标。

公式

iou = true_positives / (true_positives + false_positives + false_negatives)

交并比是语义图像分割中常用的评估指标。

为了计算 IoU,预测结果会被累积到混淆矩阵中,并根据 sample_weight 加权,然后根据混淆矩阵计算指标。

如果 sample_weightNone,则权重默认为 1。使用 sample_weight 为 0 来屏蔽值。

此类可用于计算多分类任务的 IoU,其中标签是独热编码的(最后一个轴应为每个类分配一个维度)。请注意,预测结果也应具有相同的形状。为了计算 IoU,首先通过对类轴取 argmax 将标签和预测结果转换回整数格式。然后应用与基本 IoU 类相同的计算步骤。

注意,如果标签和预测结果中只有一个通道,则此类与 IoU 类相同。在这种情况下,请使用 IoU 代替。

此外,请确保 num_classes 等于数据中的类数,以避免在计算混淆矩阵时出现“标签超出范围”错误。

参数

  • num_classes:预测任务可能具有的标签数量。
  • target_class_ids:返回指标的目标类 ID 的元组或列表。要计算特定类的 IoU,应提供单个 ID 值的列表(或元组)。
  • name:指标实例的可选字符串名称。
  • dtype:指标结果的可选数据类型。
  • ignore_class:可选整数。在指标计算期间要忽略的类的 ID。例如,在分割问题中,分割图中存在“空洞”类(通常为 -1 或 255)时,这很有用。默认情况下(ignore_class=None),会考虑所有类。
  • sparse_y_pred:预测是使用整数还是密集浮点向量进行编码。如果为 False,则使用 argmax 函数确定每个样本最可能的关联标签。
  • axis:可选参数,包含 logits 的维度。默认为 -1

示例

示例

>>> y_true = np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0], [1, 0, 0]])
>>> y_pred = np.array([[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 = keras.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()
0.071

compile() API 一起使用

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

[来源]

OneHotMeanIoU

keras.metrics.OneHotMeanIoU(
    num_classes, name=None, dtype=None, ignore_class=None, sparse_y_pred=False, axis=-1
)

计算独热编码标签的平均交并比指标。

公式

iou = true_positives / (true_positives + false_positives + false_negatives)

交并比是语义图像分割中常用的评估指标。

为了计算 IoU,预测结果会被累积到混淆矩阵中,并根据 sample_weight 加权,然后根据混淆矩阵计算指标。

如果 sample_weightNone,则权重默认为 1。使用 sample_weight 为 0 来屏蔽值。

此类可用于计算多分类任务的平均 IoU,其中标签是独热编码的(最后一个轴应为每个类分配一个维度)。请注意,预测结果也应具有相同的形状。为了计算平均 IoU,首先通过对类轴取 argmax 将标签和预测结果转换回整数格式。然后应用与基本 MeanIoU 类相同的计算步骤。

注意,如果标签和预测结果中只有一个通道,则此类与 MeanIoU 类相同。在这种情况下,请使用 MeanIoU 代替。

此外,请确保 num_classes 等于数据中的类数,以避免在计算混淆矩阵时出现“标签超出范围”错误。

参数

  • num_classes:预测任务可能具有的标签数量。
  • name:指标实例的可选字符串名称。
  • dtype:指标结果的可选数据类型。
  • ignore_class:可选整数。在指标计算期间要忽略的类的 ID。例如,在分割问题中,分割图中存在“空洞”类(通常为 -1 或 255)时,这很有用。默认情况下(ignore_class=None),会考虑所有类。
  • sparse_y_pred:预测是使用自然数还是概率分布向量进行编码。如果为 False,则将使用 argmax 函数确定每个样本最可能的关联标签。
  • axis:可选参数,包含 logits 的维度。默认为 -1

示例

示例

>>> y_true = np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0], [1, 0, 0]])
>>> y_pred = np.array([[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 = keras.metrics.OneHotMeanIoU(num_classes=3)
>>> 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 + 0.1 / (0.7 + 0.1 - 0.1)) / 3
>>> m.result()
0.048

compile() API 一起使用

model.compile(
    optimizer='sgd',
    loss='mse',
    metrics=[keras.metrics.OneHotMeanIoU(num_classes=3)])

[来源]

MeanIoU

keras.metrics.MeanIoU(
    num_classes,
    name=None,
    dtype=None,
    ignore_class=None,
    sparse_y_true=True,
    sparse_y_pred=True,
    axis=-1,
)

计算平均交并比指标。

公式

iou = true_positives / (true_positives + false_positives + false_negatives)

交并比是语义图像分割中常用的评估指标。

为了计算 IoU,预测结果会被累积到混淆矩阵中,并根据 sample_weight 加权,然后根据混淆矩阵计算指标。

如果 sample_weightNone,则权重默认为 1。使用 sample_weight 为 0 来屏蔽值。

注意,此类首先计算所有单个类的 IoU,然后返回这些值的平均值。

参数

  • num_classes:预测任务可能具有的标签数量。必须提供此值,因为将分配维度为 [num_classes, num_classes] 的混淆矩阵。
  • name:指标实例的可选字符串名称。
  • dtype:指标结果的可选数据类型。
  • ignore_class:可选整数。在指标计算期间要忽略的类的 ID。例如,在分割问题中,分割图中存在“空洞”类(通常为 -1 或 255)时,这很有用。默认情况下(ignore_class=None),会考虑所有类。
  • sparse_y_true:标签是使用整数还是密集浮点向量进行编码。如果为 False,则使用 argmax 函数确定每个样本最可能的关联标签。
  • sparse_y_pred:预测是使用整数还是密集浮点向量进行编码。如果为 False,则使用 argmax 函数确定每个样本最可能的关联标签。
  • axis:可选参数,包含 logits 的维度。默认为 -1

示例

示例

>>> # cm = [[1, 1],
>>> #        [1, 1]]
>>> # sum_row = [2, 2], sum_col = [2, 2], true_positives = [1, 1]
>>> # iou = true_positives / (sum_row + sum_col - true_positives))
>>> # result = (1 / (2 + 2 - 1) + 1 / (2 + 2 - 1)) / 2 = 0.33
>>> m = keras.metrics.MeanIoU(num_classes=2)
>>> m.update_state([0, 0, 1, 1], [0, 1, 0, 1])
>>> m.result()
0.33333334
>>> m.reset_state()
>>> m.update_state([0, 0, 1, 1], [0, 1, 0, 1],
...                sample_weight=[0.3, 0.3, 0.3, 0.1])
>>> m.result().numpy()
0.23809525

compile() API 一起使用

model.compile(
    optimizer='sgd',
    loss='mse',
    metrics=[keras.metrics.MeanIoU(num_classes=2)])