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,)*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)
给预测图上色
def cam_mask(mask,palette,n):
seg_img = np.zeros((np.shape(mask)[0], np.shape(mask)[1], 3))
for c in range(n):
seg_img[:, :, 0] += ((mask[:, :] == c) * (palette[c][0])).astype('uint8')
seg_img[:, :, 1] += ((mask[:, :] == c) * (palette[c][1])).astype('uint8')
seg_img[:, :, 2] += ((mask[:, :] == c) * (palette[c][2])).astype('uint8')
colorized_mask = Image.fromarray(np.uint8(seg_img))
return colorized_mask
部分上色的颜色分类
palette = [(0, 0, 0), (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128), (0, 128, 128),
(128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0), (64, 0, 128), (192, 0, 128),
(64, 128, 128), (192, 128, 128), (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128),
(128, 64, 12)]
对于输入HxW二维预测结果,我们先生成一个HxWx3的全零矩阵seg_img。
然后从0到类别数(21)开始循环,如果预测结果中有与类别数c相同的值,那么这个位置的值为1,否在为0。这样会生成一个掩码,这个掩码的对应为1的位置就是预测结果中属于第c个类别的位置。然后,我们将染色板的三个值分别加到之前的seg_img的三个通道上,这样就形成了HxWxC的RGB三个通道的彩色图像。