评估标准

  1. 语义分割的评价指标

TP(True Positive)
TN(Ture Negtive)
FP(False Positive)
FN(False Negtive)

精确率:
召回率:
准确率:相对于总体
F1-measure: 精确率和召回率的调和平均数

语义分割的评价指标

  1. 执行时间
  2. 内存占用
  3. 准确度
    1)Pixel Accuracy (PA)
    分类正确的像素点数和所有的像素点数的比例
    $$PA = \frac {\sum_{i=0}^k p_{ii}} {\sum_{i=0}^k \sum_{j=0}^k p_{ij}}$$
    2) Mean Pixel Accuracy (MPA)
    计算每一类分类正确的像素点数和该类的所有像素点数的比例然后求平均
    $$MPA = \frac {1}{k} \sum_{i=0}^k \frac {p_{ii}} {\sum_{j=0}^k p_{ij}}$$
    3) Mean Intersection over Union (MIOU)
    计算每一类的IOU然后平均。一类的IOU计算方式如下,例如 i=1 , $p_{11}$ 表示 true positives, 即本属于 1 类且预测也为 1 类,$\sum_{j=0}^k p_{1j}$表示本属于 1 类却预测为其他类的像素点数(注意,这里包含了 $p_{11}$ ), $\sum_{j=0}^k p_{j1}$ 表示本属于其他类却预测为 1 类的像素点数(注意,这里也包含了 $p_{11}$ ),在分母处 $p_{11}$ 计算了两次所以要减去一个 $p_{11}$
    $$MIOU = \frac {1}{k+1} \sum_{i=0}^k \frac {p_{11}}{\sum_{j=0}^k p_{ij} + \sum_{j=0}^k - p_{ii}}$$
    4) Frequency Weighted Intersection over Union (FWIOU)
    可以理解为根据每一类出现的频率对各个类的 IOU 进行加权求和
    $$FWIOU=\frac {1}{\sum_{i=0}^k \sum_{j=0}^k p_{ij}} \sum_{i=0}^k \frac {p_{ii}\sum_{j=0}^k p_{ij}}{\sum_{j=0}^k p_{ij} + \sum_{j=0}^k p_{ji} - p_{ii}}$$
class Evaluator(object):
    def __init__(self, num_class):
        self.num_class = num_class
        self.confusion_matrix = np.zeros((self.num_class,)*2)

    def Pixel_Accuracy(self):
        Acc = np.diag(self.confusion_matrix).sum() / self.confusion_matrix.sum()
        return Acc

    def Pixel_Accuracy_Class(self):
        Acc = np.diag(self.confusion_matrix) / self.confusion_matrix.sum(axis=1)
        Acc = np.nanmean(Acc)
        return Acc

    def Mean_Intersection_over_Union(self):
        MIoU = np.diag(self.confusion_matrix) / (
                np.sum(self.confusion_matrix, axis=1) + np.sum(self.confusion_matrix, axis=0) -
                np.diag(self.confusion_matrix))
        MIoU = np.nanmean(MIoU)
        return MIoU

    def Frequency_Weighted_Intersection_over_Union(self):
        freq = np.sum(self.confusion_matrix, axis=1) / np.sum(self.confusion_matrix)
        iu = np.diag(self.confusion_matrix) / (
                np.sum(self.confusion_matrix, axis=1) + np.sum(self.confusion_matrix, axis=0) -
                np.diag(self.confusion_matrix))

        FWIoU = (freq[freq > 0] * iu[freq > 0]).sum()
        return FWIoU

    def _generate_matrix(self, gt_image, pre_image):
        mask = (gt_image >= 0) & (gt_image < self.num_class)
        label = self.num_class * gt_image[mask].astype('int') + pre_image[mask]
        count = np.bincount(label, minlength=self.num_class**2)
        confusion_matrix = count.reshape(self.num_class, self.num_class)
        return confusion_matrix

    def add_batch(self, gt_image, pre_image):
        assert gt_image.shape == pre_image.shape
        self.confusion_matrix += self._generate_matrix(gt_image, pre_image)

    def reset(self):
        self.confusion_matrix = np.zeros((self.num_class,) * 2)

请多多指教。

文章标题:评估标准

本文作者:顺强

发布时间:2019-01-20, 23:59:00

原始链接:http://shunqiang.ml/cnn-eval/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏