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_weight
为 None
,则权重默认为 1。使用 sample_weight
为 0 来屏蔽值。
注意,此类首先计算所有单个类的 IoU,然后返回由 target_class_ids
指定的类的 IoU 平均值。如果 target_class_ids
只有一个 ID 值,则返回该特定类的 IoU。
参数
ignore_class=None
),会考虑所有类。False
,则使用 argmax
函数确定每个样本最可能的关联标签。False
,则使用 argmax
函数确定每个样本最可能的关联标签。-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_weight
为 None
,则权重默认为 1。使用 sample_weight
为 0 来屏蔽值。
此类可用于计算二分类任务的 IoU,其中预测结果以 logits 的形式提供。首先将 threshold
应用于预测值,使得低于 threshold
的值转换为类 0,高于 threshold
的值转换为类 1。
然后计算类 0 和 1 的 IoU,返回由 target_class_ids
指定的类的 IoU 平均值。
注意:当 threshold=0
时,此指标与 IoU
的行为相同。
参数
[0]
、[1]
或 [0, 1]
。使用 [0]
(或 [1]
),返回类 0(或类 1)的 IoU 指标。使用 [0, 1]
,返回这两个类的 IoU 平均值。threshold
)或预测类 1(如果 logit 高于 threshold
)。示例
示例
>>> 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_weight
为 None
,则权重默认为 1。使用 sample_weight
为 0 来屏蔽值。
此类可用于计算多分类任务的 IoU,其中标签是独热编码的(最后一个轴应为每个类分配一个维度)。请注意,预测结果也应具有相同的形状。为了计算 IoU,首先通过对类轴取 argmax 将标签和预测结果转换回整数格式。然后应用与基本 IoU
类相同的计算步骤。
注意,如果标签和预测结果中只有一个通道,则此类与 IoU
类相同。在这种情况下,请使用 IoU
代替。
此外,请确保 num_classes
等于数据中的类数,以避免在计算混淆矩阵时出现“标签超出范围”错误。
参数
ignore_class=None
),会考虑所有类。False
,则使用 argmax
函数确定每个样本最可能的关联标签。-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_weight
为 None
,则权重默认为 1。使用 sample_weight
为 0 来屏蔽值。
此类可用于计算多分类任务的平均 IoU,其中标签是独热编码的(最后一个轴应为每个类分配一个维度)。请注意,预测结果也应具有相同的形状。为了计算平均 IoU,首先通过对类轴取 argmax 将标签和预测结果转换回整数格式。然后应用与基本 MeanIoU
类相同的计算步骤。
注意,如果标签和预测结果中只有一个通道,则此类与 MeanIoU
类相同。在这种情况下,请使用 MeanIoU
代替。
此外,请确保 num_classes
等于数据中的类数,以避免在计算混淆矩阵时出现“标签超出范围”错误。
参数
ignore_class=None
),会考虑所有类。False
,则将使用 argmax
函数确定每个样本最可能的关联标签。-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_weight
为 None
,则权重默认为 1。使用 sample_weight
为 0 来屏蔽值。
注意,此类首先计算所有单个类的 IoU,然后返回这些值的平均值。
参数
ignore_class=None
),会考虑所有类。False
,则使用 argmax
函数确定每个样本最可能的关联标签。False
,则使用 argmax
函数确定每个样本最可能的关联标签。-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)])