图像语义分割python_遥感图像语义分割常⽤精度指标及其
python实现(⽀持多类)
前⾔
在介绍个精度指标前我们先来明确以下⼏个概念,对应的⽰意图如下图所⽰:TP(True Positive):分类准确的正类,意思是预测结果为正类,实际上是正类。
FP(Fal Positive):被错分类为正类的负类,意思是实际为负类,但是却被预测为正类。
TN(True Negative):分类准确的负类,意思是预测结果为负类,实际上是负类。
形容母爱FN(Fal Negative):被错分类为负类的正类,意思是实际为正类,但是却被预测为负类。
精度指标
1 精确率
精确率(Precision)就是被准确分类为正类的样本数与所有被分类为正类的样本数之⽐,意味着预测结果是正类的样本⾥具体有多少个样本真的是正类,计算⽅法如下式所⽰:
2 召回率
召回率(Recall)就是被分为正类的样本数与测试数据集中的实际正类的样本数之⽐,意味着应该被分为正类的样本中会有多少是被正确分类出来,如下式所⽰:
3 F1分数
我们希望精确率和召回率同时⾮常⾼。但实际上这两个指标是⼀对⽭盾体,⽆法做到双⾼。如果想要找到⼆者之间的⼀个平衡点,我们就需要⼀个新的指标:F1分数(F1-Score)。F1分数同时考虑了查准
率和查全率,让⼆者同时达到最⾼,取⼀个平衡。
十年后的自己4 交并⽐
交并⽐(Interction-over-Union, IoU)是指实际类别样本和预测类别样本的交集和并集之⽐,即分类准确的正类样本数和分类准确的正类样本数与被错分类为负类的正类样本数以及被错分类为正类的负类之和的⽐值。
5 平均交并⽐
平均交并⽐(mean Interction-over-Union, mIoU)是对每⼀类交并⽐求和平均的结果。
6 频权交并⽐
频权交并⽐(Frequency Weighted Interction-over-Union, FWIoU)是根据每⼀类出现的频率设置权重,权重乘以每⼀类的IoU并进⾏求和。
python实现
晕车怎么治import numpy as np
import cv2
import os
"""混淆矩阵P\L P NP TP FPN FN TN"""
# 获取颜⾊字典
# labelFolder 标签⽂件夹,之所以遍历⽂件夹是因为⼀张标签可能不包含所有类别颜⾊
# classNum 类别总数(含背景)
def color_dict(labelFolder, classNum):
colorDict = []
# 获取⽂件夹内的⽂件名
ImageNameList = os.listdir(labelFolder)
for i in range(len(ImageNameList)):
ImagePath = labelFolder + "/" + ImageNameList[i]
img = cv2.imread(ImagePath).astype(np.uint32)
# 如果是灰度,转成RGB
if(len(img.shape) == 2):
img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB).astype(np.uint32) # 为了提取唯⼀值,将RGB转成⼀个数
img_new = img[:,:,0] * 1000000 + img[:,:,1] * 1000 + img[:,:,2]
unique = np.unique(img_new)
紧张用英语怎么说# 将第i个像素矩阵的唯⼀值添加到colorDict中
for j in range(unique.shape[0]):
colorDict.append(unique[j])
# 对⽬前i个像素矩阵⾥的唯⼀值再取唯⼀值
colorDict = sorted(t(colorDict))
# 若唯⼀值数⽬等于总类数(包括背景)ClassNum,停⽌遍历剩余的图像
if(len(colorDict) == classNum):
break
# 存储颜⾊的BGR字典,⽤于预测时的渲染结果
colorDict_BGR = []
for k in range(len(colorDict)):
# 对没有达到九位数字的结果进⾏左边补零(eg:5,201,111->005,201,111)
color = str(colorDict[k]).rjust(9, '0')
# 前3位B,中3位G,后3位R
color_BGR = [int(color[0 : 3]), int(color[3 : 6]), int(color[6 : 9])]
colorDict_BGR.append(color_BGR)
# 转为numpy格式
colorDict_BGR = np.array(colorDict_BGR)
# 存储颜⾊的GRAY字典,⽤于预处理时的onehot编码
colorDict_GRAY = shape((colorDict_BGR.shape[0], 1 ,colorDict_BGR.shape[1])).astype(np.uint8) colorDict_GRAY = cv2.cvtColor(colorDict_GRAY, cv2.COLOR_BGR2GRAY)
return colorDict_BGR, colorDict_GRAY
def ConfusionMatrix(numClass, imgPredict, Label):
# 返回混淆矩阵
mask = (Label >= 0) & (Label < numClass)
label = numClass * Label[mask] + imgPredict[mask]
诚信诗歌
count = np.bincount(label, minlength = numClass**2)
confusionMatrix = shape(numClass, numClass)
return confusionMatrix
def OverallAccuracy(confusionMatrix):
# 返回所有类的整体像素精度OA
# acc = (TP + TN) / (TP + TN + FP + TN)
OA = np.diag(confusionMatrix).sum() / confusionMatrix.sum()
return OA
def Precision(confusionMatrix):
# 返回所有类别的精确率precision
precision = np.diag(confusionMatrix) / confusionMatrix.sum(axis = 1)
return precision
def Recall(confusionMatrix):
# 返回所有类别的召回率recall
recall = np.diag(confusionMatrix) / confusionMatrix.sum(axis = 0)
return recall
def F1Score(confusionMatrix):
precision = np.diag(confusionMatrix) / confusionMatrix.sum(axis = 1)
recall = np.diag(confusionMatrix) / confusionMatrix.sum(axis = 0)
f1score = 2 * precision * recall / (precision + recall)
return f1score
def InterctionOverUnion(confusionMatrix):
# 返回交并⽐IoU
interction = np.diag(confusionMatrix)
union = np.sum(confusionMatrix, axis = 1) + np.sum(confusionMatrix, axis = 0) - np.diag(confusionMatrix) IoU = interction / union
return IoU
def MeanInterctionOverUnion(confusionMatrix):营养粥有哪几种
# 返回平均交并⽐mIoU
interction = np.diag(confusionMatrix)
union = np.sum(confusionMatrix, axis = 1) + np.sum(confusionMatrix, axis = 0) - np.diag(confusionMatrix) IoU = interction / union
mIoU = np.nanmean(IoU)小蜜蜂采花蜜
return mIoU
def Frequency_Weighted_Interction_over_Union(confusionMatrix):
# 返回频权交并⽐FWIoU
freq = np.sum(confusionMatrix, axis=1) / np.sum(confusionMatrix)
iu = np.diag(confusionMatrix) / (
np.sum(confusionMatrix, axis = 1) +
np.sum(confusionMatrix, axis = 0) -
np.diag(confusionMatrix))
FWIoU = (freq[freq > 0] * iu[freq > 0]).sum()
return FWIoU
>>>>>>>>>>>>># 标签图像⽂件夹
LabelPath = r"Data\test\label1"
# 预测图像⽂件夹
PredictPath = r"Data\test\predict1"
# 类别数⽬(包括背景)
classNum = 3
>>>>>>>>>>>>># 获取类别颜⾊字典
colorDict_BGR, colorDict_GRAY = color_dict(LabelPath, classNum)
# 获取⽂件夹内所有图像
labelList = os.listdir(LabelPath)
PredictList = os.listdir(PredictPath)
# 读取第⼀个图像,后⾯要⽤到它的shape
Label0 = cv2.imread(LabelPath + "//" + labelList[0], 0)
# 图像数⽬
label_num = len(labelList)
# 把所有图像放在⼀个数组⾥
label_all = np.zeros((label_num, ) + Label0.shape, np.uint8)
predict_all = np.zeros((label_num, ) + Label0.shape, np.uint8)
for i in range(label_num):
Label = cv2.imread(LabelPath + "//" + labelList[i])
Label = cv2.cvtColor(Label, cv2.COLOR_BGR2GRAY)
label_all[i] = Label
Predict = cv2.imread(PredictPath + "//" + PredictList[i])
Predict = cv2.cvtColor(Predict, cv2.COLOR_BGR2GRAY)
predict_all[i] = Predict
# 把颜⾊映射为0,1,
for i in range(colorDict_GRAY.shape[0]):
label_all[label_all == colorDict_GRAY[i][0]] = i
predict_all[predict_all == colorDict_GRAY[i][0]] = i
# 拉直成⼀维
label_all = label_all.flatten()
predict_all = predict_all.flatten()
# 计算混淆矩阵及各精度参数
confusionMatrix = ConfusionMatrix(classNum, predict_all, label_all) precision = Precision(confusionMatrix)
recall = Recall(confusionMatrix)
OA = OverallAccuracy(confusionMatrix)
IoU = InterctionOverUnion(confusionMatrix)
FWIOU = Frequency_Weighted_Interction_over_Union(confusionMatrix) mIOU = MeanInterctionOverUnion(confusionMatrix)
f1ccore = F1Score(confusionMatrix)
for i in range(colorDict_BGR.shape[0]):诱导公式三角函数
# 输出类别颜⾊,需要安装webcolors,直接pip install webcolors
try:
import webcolors