图像语义分割及常用评价指标

常用指标

什么是混淆矩阵(Confusion Matrix)

混淆矩阵实际就是一个矩阵,该矩阵的元素是模型的分类结果,即模型正确分类、错误分类的样本的个数。
目前只看了基于二分类的混淆矩阵(以后看到其他多分类混淆矩阵后再来补充叭)。所谓的二分类,即分类器(或称之为网络\学习器)对两个类别进行分类处理,其中第一类为正例(Positive),第二类为反例(Negative)。若模型预测正确则记为真(True),预测错误则记为假(False)。那么混淆矩阵的组成元素便是这四个基本术语的组合:

TP (True Positive):真正例,即模型预测为正例,实际也为正例;
FP (False Positive):假正例,即模型预测为正例,实际为反例;
FN (False Negative):假反例,即模型预测为反例,实际为正例;
TN (True Negative):真反例,即模型预测为反例,实际也为反例。
将这四种指标放在同一表格中,便构成了混淆矩阵:

对分类模型的预测效果而言,当上述表格中TP与TN的数量越大时,分类结果是越准确的,相反,若想得到较高的分类精确性,应当使得FP与FN的个数越少。
实例:宠物店有10只动物,其中6只狗,4只猫(真实值)。现有一个模型将这10只动物进行分类,分类结果为:5只狗,5只猫(预测值),设狗为正例,猫为反例,可以得到分类结果的对应混淆矩阵:

按照我们上面所说,在该混淆矩阵中,TP与TN的样本个数较多,可以认为模型的分类结果比较准确,但实际中我们并不是仅采用这种方式来评价模型,这就是下面要说的几种评价指标

四种二级指标

由于构成混淆矩阵的元素是各种预测结果的样本个数,而实际问题中样本数往往很大,因此若仅凭计算样本个数,很难衡量模型的优劣,因此产生了如下4个指标,称之为二级指标(通过最底层指标加减乘除得到的):


通过上面的四个二级指标,可以将混淆矩阵中数量的结果转化为0-1之间的比率,便于进行标准化的衡量。

实例计算

以上面实例的混淆矩阵为例,我们来计算一下各评价指标:


非二分类问题拓展

以下面的混淆矩阵为例


这是一个三分类问题,在这种问题下,我么应该如何计算上述几种评价指标呢?容易求得的是:

准确率:A c c = (10 + 15 + 20)/ 66 = 68.2 %

那么其他三种指标应如何计算?实际上,多分类问题往往都可以转化为二分类问题,对上面的混淆矩阵,我们假设猫为正例,狗和猪为反例,那么就可以得到一个是猫与不是猫的二分类问题,进而也可得到一个新的混淆矩阵:

这样我们就可以继续计算评价指标:

当然上述的指标计算都是基于猫为正例这一假设的,用同样的方法也可以计算出猪和狗的几种评价指标。

一种三级指标

在上述四种二级指标的基础上,还有另外一种评价指标——F1-Score,它的计算公式为:

F1-Score=2PR/(P+R) 
其中,P代表Precision,R代表Recall。
F1-Score指标综合了Precision与Recall的产出的结果。F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差。

语义分割模型的五种评价指标
无论模型的分类对象是动物还是图片像素点,混淆矩阵的计算方式与评价指标的计算都是相同的:

PA对应着二级指标中的准确率。
CPA则对应了二级指标中的精确率。

评价指标代码实现

"""
计算分割的性能
refer to https://github.com/jfzhang95/pytorch-deeplab-xception/blob/master/utils/metrics.py
https://blog.csdn.net/weixin_41936775/article/details/108717925
"""
import os
import cv2
import numpy as np
__all__ = ['SegmentationMetric']
from PIL import Image
"""
confusionMetric  # 注意:此处横着代表预测值,竖着代表真实值,与之前介绍的相反
P\L     P    N
P      TP    FP
N      FN    TN
"""
class SegmentationMetric(object):def __init__(self, numClass):self.numClass = numClassself.confusionMatrix = np.zeros((self.numClass,)*2)def pixelAccuracy(self):# return all class overall pixel accuracy#  PA = acc = (TP + TN) / (TP + TN + FP + TN)acc = np.diag(self.confusionMatrix).sum() /  self.confusionMatrix.sum()return accdef classPixelAccuracy(self):# return each category pixel accuracy(A more accurate way to call it precision)# acc = (TP) / TP + FPclassAcc = np.diag(self.confusionMatrix) / self.confusionMatrix.sum(axis=1)return classAcc # 返回的是一个列表值,如:[0.90, 0.80, 0.96],表示类别1 2 3各类别的预测准确率def meanPixelAccuracy(self):classAcc = self.classPixelAccuracy()meanAcc = np.nanmean(classAcc) # np.nanmean 求平均值,nan表示遇到Nan类型,其值取为0return meanAcc # 返回单个值,如:np.nanmean([0.90, 0.80, 0.96, nan, nan]) = (0.90 + 0.80 + 0.96) / 3 =  0.89def IntersectionOverUnion(self):# Intersection = TP Union = TP + FP + FN# IoU = TP / (TP + FP + FN)intersection = np.diag(self.confusionMatrix) # 取对角元素的值,返回列表union = np.sum(self.confusionMatrix, axis=1) + np.sum(self.confusionMatrix, axis=0) - np.diag(self.confusionMatrix) # axis = 1表示混淆矩阵行的值,返回列表; axis = 0表示取混淆矩阵列的值,返回列表IoU = intersection / union  # 返回列表,其值为各个类别的IoUreturn IoUdef meanIntersectionOverUnion(self):# Intersection = TP Union = TP + FP + FN# IoU = TP / (TP + FP + FN)intersection = np.diag(self.confusionMatrix) # 取对角元素的值,返回列表union = np.sum(self.confusionMatrix, axis=1) + np.sum(self.confusionMatrix, axis=0) - np.diag(self.confusionMatrix) # axis = 1表示混淆矩阵行的值,返回列表; axis = 0表示取混淆矩阵列的值,返回列表IoU = intersection / union  # 返回列表,其值为各个类别的IoUmIoU = np.nanmean(IoU) # 求各类别IoU的平均return mIoUdef genConfusionMatrix(self, imgPredict, imgLabel): # 同FCN中score.py的fast_hist()函数# mask = (imgLabel >= 0) & (imgLabel < self.numClass)# hist = np.bincount(#     self.numClass * imgLabel[mask].astype(int) +#     imgPredict[mask], minlength=self.numClass ** 2).reshape(self.numClass, self.numClass)# return histmask = (imgLabel >= 0) & (imgLabel < self.numClass)label = self.numClass * imgLabel[mask] + imgPredict[mask]count = np.bincount(label, minlength=self.numClass**2)confusionMatrix = count.reshape(self.numClass, self.numClass)return confusionMatrixdef Frequency_Weighted_Intersection_over_Union(self):# FWIOU =     [(TP+FN)/(TP+FP+TN+FN)] *[TP / (TP + FP + FN)]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 FWIoUdef addBatch(self, imgPredict, imgLabel):assert imgPredict.shape == imgLabel.shapeself.confusionMatrix += self.genConfusionMatrix(imgPredict, imgLabel)def reset(self):self.confusionMatrix = np.zeros((self.numClass, self.numClass))if __name__ == '__main__':label_path='/home/qq/Myproject/segmentation/unet/data/test/truth/'predict_path='/home/qq/Myproject/segmentation/unet/data/test/pred/'pa_l = []cpa_l = []mpa_l = []IoU_l = []mIoU_l = []files = os.listdir(label_path)for filename in files:imgLabel = Image.open(label_path +filename)# imgPredict = Image.open(predict_path +filename.replace('.png','_res.png'))imgPredict = Image.open(predict_path +filename)imgPredict = np.array(imgPredict) # 可直接换成预测图片imgLabel = np.array(imgLabel,dtype='uint8') # 可直接换成标注图片# imgLabel = cv2.imread(label_path +filename)# 将数据转为单通道的图片imgLabel = cv2.cvtColor(imgLabel, cv2.COLOR_BGR2GRAY)imgPredict[imgPredict > 0] = 1imgLabel[imgLabel >0] = 1metric = SegmentationMetric(2) # 2表示有1个分类,有几个分类就填几print(imgPredict.shape , imgLabel.shape)metric.addBatch(imgPredict, imgLabel)PA = metric.pixelAccuracy()CPA = metric.classPixelAccuracy()MPA = metric.meanPixelAccuracy()IoU = metric.IntersectionOverUnion()MIoU = metric.meanIntersectionOverUnion()FWIoU = metric.Frequency_Weighted_Intersection_over_Union()print('像素准确率PA:            %.2f%%'  %(PA*100))print('类别像素准确率CPA:        %.2f%%'  %(CPA*100))print('类别平均像素准确率MPA:     %.2f%%'  %(MPA*100))# print('交并比IoU:               %.2f%%'  %(meanIoU[0,0]*100))print('交并比IoU:               %.2f%%'  %(IoU*100))print('平均交并比MIoU:           %.2f%%'  %(MIoU*100))print('权频交并比FWIoU:          %.2f%%'  %(FWIoU*100))

图像分割性能评价指标相关推荐

  1. 人脸识别 性能评价指标

    人脸识别常用的性能评价指标 一.什么是F1-score F1分数(F1-score)是分类问题的一个衡量指标.一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法.它是精确率和召回率 ...

  2. 分类模型的性能评价指标(Classification Model Performance Evaluation Metric)

    二分类模型的预测结果分为四种情况(正类为1,反类为0): TP(True Positive):预测为正类,且预测正确(真实为1,预测也为1) FP(False Positive):预测为正类,但预测错 ...

  3. 分类和目标检测的性能评价指标【转载】

    文章目录 1. mAP (mean Avearage Precision) 2. FLOPs (浮点运算数) 3. 模型参数大小 对于深度学习的网络模型,希望其 速度快, 内存小, 精度高.因此需要量 ...

  4. 深度学习常用性能评价指标

    深度学习常用性能评价指标 前言 基于准确度的指标 基于排名的指标 基于图数据的指标 前言 深度学习性能指标是用于评价深度学习模型性能的依据,是设计模型的重要依据. 基于准确度的指标 对于模型而言仅统计 ...

  5. 神经网络性能评价指标

    神经网络性能评价指标 对于一个好不容易训练出来的模型,我们需要用数学工具直观的了解它的性能好坏. 先来了解混淆矩阵 一.混淆矩阵 首先,所有的样本(数据)中,可以被分为正样本和负样本. 其次,我们在对 ...

  6. 图像质量评价数据库与图像质量算法性能评价指标

    视频质量专家组(Video Quality Experts Group, VQEG)发起的评价算法性能校准项目的主要思想是通过组织主观实验获取图像的主观质量,以主客观质量的一致性来判断客观评价算法的性 ...

  7. 线性回归模型的性能评价指标

    本节讨论下线性回归模型的性能评价指标 对于机器学习的两个基本问题分类和回归的评价方式有所不同,分类问题一般通过分类准确率.召回率.F1值.ROC/AUC等手段进行模型的评估.对于回归问题,该如何评价? ...

  8. 磁盘性能评价指标—IOPS和吞吐量

    一.磁盘 I/O 的概念 I/O 的概念,从字义来理解就是输入输出.操作系统从上层到底层,各个层次之间均存在 I/O.比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 ...

  9. 软件项目与汽车——汽车性能评价指标

    文章目录 汽车性能评价指标 1. 动力性 2. 燃油经济性 3. 制动性 4. 操控稳定性 5. 平顺性 6. 通过性 为了成长一名知识渊博的程序员,开始学会培养自己的兴趣和拓展自己的知识面.今天星链 ...

最新文章

  1. htc在ubuntu上找不到devieces,提示权限不够的解决方法
  2. Docker中的Java内存消耗优化以及我们如何使用Spring Boot
  3. 2018年4月26日笔记
  4. CoFun 1612 单词分组(容斥)
  5. SAP FI/CO 知识 浓缩版
  6. 【JUC并发编程07】Callable接口
  7. Serverless 对研发效能的变革和创新
  8. linux安装anaconda3提前so,Linux安装anaconda3
  9. Asp.net中执行.EXE程序的方法
  10. 工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...
  11. linux分辨率和用户有关吗,Linux系统在高分屏非正常分辨率显示
  12. 管道符和作业控制 shell变量 环境变量配置文件
  13. 到今天上了一个月班了,功能基本实现了.
  14. 005 Java反射面试题
  15. VB/VBA的浮点数结构
  16. Python学习,55道django面试题,来试试吧
  17. Neo4j Desktop图数据库导出
  18. SSH远程操作——一台电脑的的NAS之旅
  19. 全文搜索引擎----ElasticSearch和Solr
  20. 优秀课程案例|如何用scratch画扇形统计图

热门文章

  1. 山东大学软件工程应用与实践——Pig代码综述
  2. 睡觉,吃饭,打豆豆,任务一
  3. 全站仪:悬高测量、悬高放样不懂?
  4. 进阶大数据架构师学习路线
  5. 敌兵布阵(树状数组)
  6. 用计算机画图评课稿,《解决问题的策略——画图》教学反思范文(通用5篇)...
  7. matlab矩阵处理实验二,实验二 MATLAB矩阵分析和处理
  8. SOME/IP 入门知识整理
  9. 开源的OA办公系统——勾股OA2.0发布,新增审批模块、工作上报等功能模块
  10. 关于 Current redo log丢失恢复情况的实验!