一、基本概念
变化检测可以当成一个二分类问题,分成变化(P)的和没有变化(N)的像素点。差异图(CD)的Ground Truth中变化(T)和没有变化(F)
则通过变化检测得到的预测结果和GT的组合有四种:TP、FP、FN、TN
TP实际为正样本你预测为正样本,FN实际为正样本你预测为负样本,FP实际为负样本你预测为正样本,TN实际为负样本你预测为负样本。
常见的变化检测指标有:Precision、Recall、F1、IOU等
二、Precision、Recall、F1、IOU
Precision(精确率≠准确率)
精确率是针对预测结果而言,表示预测为正的样本(P)中有多少是GT的正样本(T)。易知预测为正的样本为TP+FP,GT的正样本为TP,所以Precision的表达式为
举个实际生活中的例子:精确率表示模型挑出来的西瓜中有多少比例是好瓜。
Recall(召回率)
召回率是对GT而言的,表示的是GT中的正例中有多少被正确预测了。易知正确预测有两种可能,一是TP、二是FN。所以Recall的表达式为
举个实际生活中的例子:召回率表示所有的好瓜中有多少比例是被模型挑出来的。
F1-score(综合评价指标)
综合评价指标是Precision和Recall的调和平均值。提出该指标的原因是Precision和Recall会出现矛盾的现象,导致无法判断模型好坏,故使用这两个指标的调和平均值来综合评价,其表达式为
IOU(交并比)
因为变化检测是拿预测出来的差异图(A)和真实的差异图(B)进行比较,所以提出IOU作为评价指标。其表达式为:
显而易见,IOU的值越高也说明A框与B框重合程度越高,代表模型预测越准确。反之,IOU越低模型性能越差。
指标介绍参考链接:https://blog.csdn.net/qq_37466121/article/details/87719044
三、相关代码
hist = np.zeros((2, 2)) # hist为混淆矩阵
def per_class_iu(hist):
iu = np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))
return np.nanmean(iu)
def get_F1_score(hist):
TN, FN, FP, TP = hist.flatten()
precision = TP / (TP + FP)
recall = TP / (TP + FN)
return 2 / (1 / precision + 1 / recall), precision, recall
def __fast_hist(self, label_gt, label_pred):
"""
Collect values for Confusion Matrix
For reference, please see: https://en.wikipedia.org/wiki/Confusion_matrix
:param label_gt: <np.array> ground-truth
:param label_pred: <np.array> prediction
:return: <np.ndarray> values for confusion matrix
"""
mask = (label_gt >= 0) & (label_gt < self.num_classes) # self.num_classes=2
hist = np.bincount(self.num_classes * label_gt[mask].astype(int) + label_pred[mask],
minlength=self.num_classes**2).reshape(self.num_classes, self.num_classes)
return hist
代码中的hist(混淆矩阵制作的核心思想为以下表格)表格中的数为求和