一、常用图像分割指标详解

在理解和计算图像分割评估指标之前,需要先了解与之相关的混淆矩阵(Confusion Matrix)的四个指标:真正例(True Positive, TP)、假正例(False Positive, FP)、假负例(False Negative, FN)和真负例(True Negative, TN)。

  • TP(真正例):模型正确预测为前景的像素数。
  • FP(假正例):模型错误地将背景预测为前景的像素数。
  • FN(假负例):模型错误地将前景预测为背景的像素数。
  • TN(真负例):模型正确预测为背景的像素数。

具体的混淆矩阵如下:

预测/实际前景背景
前景TPFP
背景FNTN

这个矩阵展示了模型在前景和背景像素上的预测情况。通过这个矩阵,我们可以进一步计算其他评估指标,如交并比 (IoU)、Dice系数,准确率和F1分数等。


1、交并比 (IoU)

核心原理
衡量预测分割区域与真实标签之间的空间重叠度(两个集合相似度的统计量)的评估指标。

数学公式:
I o U = T P T P + F P + F N IoU = \frac{TP}{TP + FP + FN} IoU=TP+FP+FNTP​

或者
I o U = ∣ A ∩ B ∣ ∣ A ∪ B ∣ IoU = \frac{|A \cap B|}{|A \cup B|} IoU=∣A∪B∣∣A∩B∣​
其中:

  • ( A ) 是预测的分割区域。
  • ( B ) 是真实的分割区域。
  • ( ∣ A ∩ B ∣ ) (|A \cap B| ) (∣A∩B∣) 表示预测和真实分割区域的交集(重叠区域)。
  • ( ∣ A ∪ B ∣ ) ( |A \cup B| ) (∣A∪B∣) 表示预测和真实分割区域的并集。

IoU 特性:

  • 取值范围[0,1],值越大性能越好
  • 对类别不平衡敏感,对边界误差敏感
  • 直观反映分割边界的相似程度

2、Dice系数

核心原理
Dice系数同样通过集合相似度度量分割效果,与IoU类似,但公式略有不同。

数学公式:
D i c e = 2 × T P 2 × T P + F P + F N Dice = \frac{2 \times TP}{2 \times TP + FP + FN} Dice=2×TP+FP+FN2×TP​

Dice系数与IoU之间存在以下关系:
D i c e = 2 × I o U 1 + I o U Dice = \frac{2 \times IoU}{1 + IoU} Dice=1+IoU2×IoU​

Dice系数特性:

  • 取值范围[0,1]
  • 对FN的惩罚力度小于IoU
  • Dice系数更强调重叠区域,对小物体的分割更敏感,适用于小目标检测

注

  • 对类别不平衡敏感,当背景区域远大于目标区域时效果可能虚高
  • 常用于二分类任务,多分类时可计算每个类别的Dice后取平均

3、像素准确率(PA)

核心原理

整体像素级别的分类准确率

数学公式:
P A = T P + T N T P + T N + F P + F N PA = \frac{TP + TN}{TP + TN + FP + FN} PA=TP+TN+FP+FNTP+TN​

局限性:

  • 当背景像素占主导时易虚高
  • 不适用于类别严重不均衡场景

(虽然准确率可以判断总的正确率,但是在样本不平衡的情况下,并不能作为很好的指标来衡量结果。)


4、平均交并比(mIoU)

核心原理
多类别场景下的平均IoU指标

计算流程:

  1. 计算每个类别的IoU
  2. 求各类别IoU的算术平均

数学公式:
m I o U = 1 K ∑ k = 1 K I o U k mIoU = \frac{1}{K}\sum_{k=1}^{K} IoU_k mIoU=K1​k=1∑K​IoUk​


5、豪斯多夫距离(HD)

核心原理
豪斯多夫距离用于衡量两个点集之间的相似性(衡量预测边界与真实边界之间的最大空间距离,对分割边缘敏感)

数学定义:

设集合 ( A ) 和集合 ( B ) 是两个点集,豪斯多夫距离 ( HD(A, B) ) 定义为:

H D ( A , B ) = max ⁡ { h ( A , B ) , h ( B , A ) } HD(A, B) = \max \{ h(A, B), h(B, A) \} HD(A,B)=max{h(A,B),h(B,A)}

其中:

h ( A , B ) = max ⁡ a ∈ A min ⁡ b ∈ B d ( a , b ) h(A, B) = \max_{a \in A} \min_{b \in B} d(a, b) h(A,B)=a∈Amax​b∈Bmin​d(a,b)

h ( B , A ) = max ⁡ b ∈ B min ⁡ a ∈ A d ( a , b ) h(B, A) = \max_{b \in B} \min_{a \in A} d(a, b) h(B,A)=b∈Bmax​a∈Amin​d(a,b)

改进:
H D 95 = 95 % 分位数距离 HD_{95} = 95\% \text{分位数距离} HD95​=95%分位数距离

  • 对异常值敏感,HD95通过取95%分位数提升鲁棒性

说明:

  • d(a, b):表示点a 和点b之间的欧几里得距离或其他距离度量。
  • h(A, B) :表示集合A中每个点到集合B中最近点的最大距离。
  • h(B, A):表示集合B中每个点到集合A中最近点的最大距离。
  • HD(A, B):是这两个单向距离的最大值,用于衡量两个点集之间的最大分离程度。

应用价值:

  • 评估边界分割的精细程度

6、灵敏度与特异度

核心原理
灵敏度(召回率)衡量实际正样本中被正确预测为正样本的比例,值越大说明漏检越少。
特异度衡量实际负样本中被正确预测为负样本的比例,值越大说明误检越少。

灵敏度:
S e n s i t i v i t y = T P T P + F N Sensitivity = \frac{TP}{TP + FN} Sensitivity=TP+FNTP​

特异度:
S p e c i f i c i t y = T N T N + F P Specificity = \frac{TN}{TN + FP} Specificity=TN+FPTN​

临床意义:

  • 灵敏度:适用于关注捕捉所有正样本的场景,例如癌症筛查中减少漏诊。
  • 特异度:适用于关注正确识别负样本的场景,例如确保正常病例不被误诊。

7、F1-Score

核心原理
精确率与召回率的调和平均

数学公式:
F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall​

扩展形式:
F β = ( 1 + β 2 ) P r e c i s i o n × R e c a l l β 2 × P r e c i s i o n + R e c a l l F_\beta = (1+\beta^2) \frac{Precision \times Recall}{\beta^2 \times Precision + Recall} Fβ​=(1+β2)β2×Precision+RecallPrecision×Recall​

应用特点:

  • β=1时为标准F1值
  • β>1时强调召回率
  • β<1时强调精确率


8、真正率(TPR)与假正率(FPR)

真正率(TPR)
真正率(True Positive Rate,TPR)也称为召回率,表示实际正样本中被正确预测为正样本的比例。反映模型对真实正例的捕捉能力(避免漏检),又称灵敏度或召回率。

数学公式:
T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP​

假正率(FPR)
假正率(False Positive Rate,FPR)表示实际负样本中被错误预测为正样本的比例。反映模型对真实负例的误判程度(减少误检),与特异度(Specificity)​互补。

数学公式:
F P R = F P F P + T N FPR = \frac{FP}{FP + TN} FPR=FP+TNFP​

其中:

  • TPR与灵敏度等价,FPR = 1 - 特异度
  • 两者共同构成ROC曲线的坐标轴

示例:

在一个样本中,正样本占90%,负样本仅占10%。这种不平衡会导致模型的高准确率缺乏实际意义,因为它可能只是简单地将大多数样本预测为正样本。

然而,TPR和FPR的计算方式则有所不同。TPR只关注正样本的识别情况,衡量90%正样本中有多少被正确识别,与负样本无关;而FPR只关注负样本的误判情况,衡量10%负样本中有多少被错误识别为正样本,与正样本无关。因此,TPR和FPR能更精准地评估模型性能,避免因样本不平衡带来的误导。


9、接收者操作特征曲线(ROC)与曲线下面积(AUC)

ROC曲线
​ROC曲线(Receiver Operating Characteristic Curve)​通过遍历所有分类阈值,绘制TPR-FPR的关系曲线来展示模型在不同阈值下的性能。

ROC曲线特性

预测概率排序
遍历阈值
计算TPR/FPR
绘制曲线

改变阈值只是改变了预测的正负样本数,即TPR和FPR,但是曲线本身是不会变的(所以ROC曲线可以无视样本不平衡)。TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。

AUC值
AUC(Area Under the Curve)ROC曲线与坐标轴围成的面积,对所有可能的分类阈值的效果进行综合衡量,用于量化模型的整体性能。AUC值越高,模型的性能越好。

数学公式:

  • AUC值的计算通常通过梯形法则对ROC曲线下的面积进行积分。

AUC特性:

  • AUC值范围为 [0,1]。
  • AUC=0.5 表示模型无区分能力(随机猜测)。
  • AUC=1 表示模型完美区分正负样本。

二、基于 PyTorch 实现上述评估指标的示例代码

import torch
import torch.nn.functional as F
import numpy as np
from scipy.spatial.distance import directed_hausdorff
from sklearn.metrics import roc_auc_score, roc_curve

# 随机生成一个简单的二分类分割任务
def generate_random_data(height, width):
    # 随机生成预测结果(概率图)
    pred = torch.rand(4, 2, height, width)  # (batch_size, num_classes, height, width)
    pred = F.softmax(pred, dim=1)  # 归一化为概率
    pred_labels = torch.argmax(pred, dim=1).float()  # 转换为二值标签图

    # 随机生成真实标签
    target = torch.randint(0, 2, (4, height, width)).float()  # (batch_size, height, width)

    return pred, pred_labels, target

# 计算混淆矩阵的四个指标
def get_confusion_matrix(pred_labels, target):
    TP = ((pred_labels == 1) & (target == 1)).sum().item()
    FP = ((pred_labels == 1) & (target == 0)).sum().item()
    FN = ((pred_labels == 0) & (target == 1)).sum().item()
    TN = ((pred_labels == 0) & (target == 0)).sum().item()
    return TP, FP, FN, TN

# 1. 交并比 (IoU)
def iou_score(TP, FP, FN):
    return TP / (TP + FP + FN) if (TP + FP + FN) > 0 else 0

# 2. Dice 系数
def dice_score(TP, FP, FN):
    return (2 * TP) / (2 * TP + FP + FN) if (2 * TP + FP + FN) > 0 else 0

# 3. 像素准确率 (PA)
def pixel_accuracy(TP, TN, FP, FN):
    return (TP + TN) / (TP + TN + FP + FN) if (TP + TN + FP + FN) > 0 else 0

# 4. 平均交并比 (mIoU)
def mean_iou(TP, FP, FN, TN):
    iou_foreground = TP / (TP + FP + FN) if (TP + FP + FN) > 0 else 0
    iou_background = TN / (TN + FN + FP) if (TN + FN + FP) > 0 else 0
    return (iou_foreground + iou_background) / 2

# 5. 豪斯多夫距离 (HD)
def hausdorff_distance(pred_labels, target):
    pred_points = np.argwhere(pred_labels.numpy() == 1)
    target_points = np.argwhere(target.numpy() == 1)
    
    if len(pred_points) == 0 or len(target_points) == 0:
        return float('inf')  # 处理空点集情况
    
    hd1 = directed_hausdorff(pred_points, target_points)[0]
    hd2 = directed_hausdorff(target_points, pred_points)[0]
    return max(hd1, hd2)


# 6. 灵敏度 (Sensitivity) 和 特异度 (Specificity)
def sensitivity_specificity(TP, TN, FP, FN):
    sensitivity = TP / (TP + FN) if (TP + FN) > 0 else 0
    specificity = TN / (TN + FP) if (TN + FP) > 0 else 0
    return sensitivity, specificity

# 7. F1-Score
def f1_score(TP, FP, FN):
    precision = TP / (TP + FP) if (TP + FP) > 0 else 0
    recall = TP / (TP + FN) if (TP + FN) > 0 else 0
    f1 = (2 * precision * recall) / (precision + recall) if (precision + recall) > 0 else 0
    return f1

# 8. 真正率 (TPR) 和 假正率 (FPR)
def tpr_fpr(TP, TN, FP, FN):
    tpr = TP / (TP + FN) if (TP + FN) > 0 else 0
    fpr = FP / (FP + TN) if (FP + TN) > 0 else 0
    return tpr, fpr

# 9. AUC
def compute_auc(pred, target):
    pred_prob = pred[:, 1, :, :].flatten().numpy()  # 取前景的概率值
    target = target.flatten().numpy()
    auc = roc_auc_score(target, pred_prob)
    return auc

# 主函数
if __name__ == "__main__":
    # 随机生成数据
    height, width = 256, 256
    pred, pred_labels, target = generate_random_data(height, width)

    # 计算混淆矩阵
    TP, FP, FN, TN = get_confusion_matrix(pred_labels, target)

    # 计算评估指标
    iou = iou_score(TP, FP, FN)
    dice = dice_score(TP, FP, FN)
    pa = pixel_accuracy(TP, TN, FP, FN)
    miou = mean_iou(TP, FP, FN, TN)
    hd = hausdorff_distance(pred_labels, target)
    sensitivity, specificity = sensitivity_specificity(TP, TN, FP, FN)
    f1 = f1_score(TP, FP, FN)
    tpr, fpr = tpr_fpr(TP, TN, FP, FN)
    auc = compute_auc(pred, target)

    # 打印结果
    print(f"Confusion Matrix: TP={TP}, FP={FP}, FN={FN}, TN={TN}")
    print(f"IoU: {iou:.4f}")
    print(f"Dice Score: {dice:.4f}")
    print(f"Pixel Accuracy: {pa:.4f}")
    print(f"Mean IoU: {miou:.4f}")
    print(f"Hausdorff Distance: {hd:.4f}")
    print(f"Sensitivity: {sensitivity:.4f}, Specificity: {specificity:.4f}")
    print(f"F1-Score: {f1:.4f}")
    print(f"TPR: {tpr:.4f}, FPR: {fpr:.4f}")
    print(f"AUC: {auc:.4f}")
    

输出示例:

Confusion Matrix: TP=65974, FP=65375, FN=65306, TN=65489
IoU: 0.3355
Dice Score: 0.5024
Pixel Accuracy: 0.5015
Mean IoU: 0.3347
Hausdorff Distance: 1.7321
Sensitivity: 0.5025, Specificity: 0.5004
F1-Score: 0.5024
TPR: 0.5025, FPR: 0.4996
AUC: 0.5020

三、部分指标对比总结

指标优势领域敏感因素计算复杂度适用场景
IoU通用分割边界误差O(n)一般性评估
Dice医学影像小目标漏检O(n)病灶分割
HD边界精度最大偏差O(n log n)精细结构分割
mIoU多类别分割类别均衡度O(Kn)语义分割

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐