評價指標

假定一定有k+1類(包括k個目標類和1個背景類),p_{ij}表示本屬于i類卻預測為j類的像素點總數(shù),具體地,
p_{ii}表示true postives,p_{ij}表示false negatives,p_{ji}表示false positives
參考的原文章的p_{ij}p_{ji}弄反了
True Positive(TP):預測為正例,實際為正例
False Positive(FP):預測為正例,實際為負例
True Negative(TN):預測為負例,實際為負例
False Negative(FN):預測為負例,實際為正例
從這我們可以看出,TP和TN都是預測對了,F(xiàn)P和FN都是預測錯了。
注:后面一個字母代表預測類別,前面一個代表是否預測對

1.像素準確率 Pixel Accuracy (PA)

最簡單的評價指標,計算正確分類像素的數(shù)量與總數(shù)之間的比值
PA=\frac{\sum_{i=0}^{k} p_{i i}}{\sum_{i=0}^{k} \sum_{j=0}^{k} p_{i j}}

2.評價像素準確率 Mean Pixel Accuracy (MPA)

計算每一類分類正確的像素點數(shù)和該類的所有像素點數(shù)的比例然后求平均
MPA=\frac{1}{k+1} \sum_{i=0}^{k} \frac{p_{i i}}{\sum_{j=0}^{k} p_{i j}}

3.平均交并比 Mean Intersection over Union (MIoU)

計算每一類的IoU然后求平均。一類的IoU計算方式如下,例如i=1,p_{11}表示true positives,即本屬于1類且預測也為1類,p_{1j}表示本屬于1類卻預測為其他類的像素點數(shù)(注意,這里包含了p_{11}),p_{j1}表示本屬于其他類卻預測為1類的像素點數(shù)(注意,這里也包含了p_{11}),在分母處p_{11}計算了兩次所以要減去一個p_{11}
MIoU=\frac{1}{k+1} \sum_{i=0}^{k} \frac{p_{i i}}{\sum_{j=0}^{k} p_{i j}+\sum_{j=0}^{k} p_{j i}-p_{i i}}

4.頻率加權交并比Frequency Weighted Intersection over Union (FWIoU)

根據(jù)每一類出現(xiàn)的頻率對各個類的IoU進行加權求和
FWIoU=\frac{1}{\sum_{i=0}^{k} \sum_{j=0}^{k} p_{i j}} \sum_{i=0}^{k} \frac{p_{i i} \sum_{j=0}^{k} p_{i j}}{\sum_{j=0}^{k} p_{i j}+\sum_{j=0}^{k} p_{j i}-p_{i i}}

混淆矩陣

二分類

維基百科混淆矩陣

混淆矩陣從定義來看,橫著的是真實類別,豎著的是預測類別
但是sklearn的混淆矩陣不是這樣,橫著的是預測類別,豎著的是真實類別
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html

>>> from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])
tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel()

下面的程序實現(xiàn)的混淆矩陣也是橫著的是預測類別,豎著的是真實類別

程序實現(xiàn)

# !/usr/bin/python3
# -*-coding:utf-8-*-
# Author: blair liu
# CreatDate: 2021/4/22 20:59
# Description: 

import numpy as np


class Evaluator(object):
    def __init__(self, num_class):
        self.num_class = num_class
        self.confusion_matrix = np.zeros((self.num_class, self.num_class))  # n*n

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

    def Pixel_Accuracy_Class(self):
        """
        self.confusion_matrix.sum(axis=1)表示
        本來是第i類預測成其他類(包含第i類),也就是真實值中第i類的像素數(shù)量
        """
        Acc = np.diag(self.confusion_matrix) / self.confusion_matrix.sum(axis=1)
        Acc = np.nanmean(Acc)
        return Acc

    def Mean_Intersection_over_Union(self):
        """
        self.confusion_matrix.sum(axis=1)表示本來是第i類預測成其他類(包含第i類)
        self.confusion_matrix.sum(axis=0)表示本來是其他類(包含第i類)預測成第i類
        """
        # 每一類IoU
        IoU = 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(IoU)
        return MIoU

    def Frequency_Weighted_Intersection_over_Union(self):
        # 真實值中第i類的像素數(shù)量與總數(shù)量比值
        freq = np.sum(self.confusion_matrix, axis=1) / np.sum(self.confusion_matrix)
        # 每一類IoU
        iou = 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] * iou[freq > 0]).sum()
        return FWIoU

    def Confusion_Matrix(self):
        return self.confusion_matrix

    def _generate_matrix(self, gt_image, pre_image):
        mask = (gt_image >= 0) & (gt_image < self.num_class)
        # print(gt_image.shape, pre_image.shape, mask.shape, gt_image[mask].shape)
        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)

    # 下面的函數(shù)針對二分類
    """ 
            預   測
            0    1
    真  0   TN   FP
    實  1   FN   TP
    """
    def Recall(self):
        """
        召回率
        預測正確的正例與所有真實正例的比值 TP/(TP + FN)
        """
        assert self.num_class == 2
        return self.confusion_matrix[1][1] / (self.confusion_matrix[1][1] + self.confusion_matrix[1][0])

    def Precision(self):
        """
        準確率
        預測正確的正例與所有預測為正例的比值 TP/(TP + FP)
        """
        assert self.num_class == 2
        return self.confusion_matrix[1][1] / (self.confusion_matrix[1][1] + self.confusion_matrix[0][1])

    def F1(self):
        """
        F-score相當于precision和recall的調和平均,用意是要參考兩個指標。recall和precision任何一個數(shù)值減小,F(xiàn)-score都會減小,反之亦然
        """
        assert self.num_class == 2
        # return 2.0 * self.Recall() * self.Precision() / (self.Recall() + self.Precision())
        return 2.0 * self.confusion_matrix[1][1] / (
                    2.0 * self.confusion_matrix[1][1] + self.confusion_matrix[0][1] + self.confusion_matrix[1][0])


if __name__ == '__main__':
    gt = np.array([[0, 1],
                   [1, 0]])
    pred = np.array([[1, 1],
                     [1, 1]])
    evaluator = Evaluator(2)
    evaluator.add_batch(gt, pred)
    print(evaluator.Confusion_Matrix())
    # [[0. 2.]
    #  [0. 2.]]

參考:
https://zhuanlan.zhihu.com/p/61880018
https://en.wikipedia.org/wiki/Confusion_matrix
https://github.com/jfzhang95/pytorch-deeplab-xception/blob/master/utils/metrics.py
https://arxiv.org/abs/1704.06857
http://www.itdecent.cn/p/8d1dd2d37f87

簡書markdown公式:
https://zhuanlan.zhihu.com/p/110756681

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1、IOU 分割或者目標檢測預測prediction,可以分成4個部分:1、true negative(TN)把區(qū)...
    HelloSam閱讀 823評論 0 0
  • 1. 精確率P和召回率R 首先了解關于TP、FP、TN和FN的含義:TP:模型預測正確的正樣本,gt為正樣本;FP...
    crishawy閱讀 7,155評論 0 1
  • 機器學習常用評價指標 在機器學習任務中,如何對模型的好壞對模型的優(yōu)化/定量評價/改進具有重大的作用,通過不同的指標...
    DrownJoe閱讀 1,220評論 0 1
  • 機器學習中的評價指標 當一個機器學習模型建立好了之后,即模型訓練已經(jīng)完成,我們就可以利用這個模型進行分類識別。 正...
    致炫登場閱讀 859評論 0 0
  • 在深度學習領域,常用的評價指標:準確率 (Accuracy),混淆矩陣 (Confusion Matrix),精確...
    _zilch閱讀 7,276評論 0 3

友情鏈接更多精彩內容