[PyTorch深度学习]--常用的图像分割评估指标
目录
一、常用图像分割指标详解
在理解和计算图像分割评估指标之前,需要先了解与之相关的混淆矩阵(Confusion Matrix)的四个指标:真正例(True Positive, TP)、假正例(False Positive, FP)、假负例(False Negative, FN)和真负例(True Negative, TN)。
- TP(真正例):模型正确预测为前景的像素数。
- FP(假正例):模型错误地将背景预测为前景的像素数。
- FN(假负例):模型错误地将前景预测为背景的像素数。
- TN(真负例):模型正确预测为背景的像素数。
具体的混淆矩阵如下:
| 预测/实际 | 前景 | 背景 |
|---|---|---|
| 前景 | TP | FP |
| 背景 | FN | TN |
这个矩阵展示了模型在前景和背景像素上的预测情况。通过这个矩阵,我们可以进一步计算其他评估指标,如交并比 (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指标
计算流程:
- 计算每个类别的IoU
- 求各类别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=K1k=1∑KIoUk
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∈Amaxb∈Bmind(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∈Bmaxa∈Amind(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,但是曲线本身是不会变的(所以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) | 语义分割 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)