语义分割精度评定

语义分割常见评价指标可以用以下代码:

# -*- coding: utf-8 -*-

import os

import cv2

import numpy as np

 

class IOUMetric:

    """

    Class to calculate mean-iou using fast_hist method

    """

    def __init__(self, num_classes):

        self.num_classes = num_classes

        self.hist = np.zeros((num_classes, num_classes))

 

    def _fast_hist(self, label_pred, label_true):

        # 找出标签中需要计算的类别,去掉了背景

        mask = (label_true >= 0) & (label_true < self.num_classes)

        # # np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)

        hist = np.bincount(

            self.num_classes * label_true[mask].astype(int) +

            label_pred[mask], minlength=self.num_classes ** 2).reshape(self.num_classes, self.num_classes)

        return hist

 

    def evaluate(self, predictions, gts):

        for lp, lt in zip(predictions, gts):

            assert len(lp.flatten()) == len(lt.flatten())

            self.hist += self._fast_hist(lp.flatten(), lt.flatten()

        iou = np.diag(self.hist) / (self.hist.sum(axis=1) + self.hist.sum(axis=0) - np.diag(self.hist))

        miou = np.nanmean(iou) 

        acc = np.diag(self.hist).sum() / self.hist.sum()

        acc_cls = np.nanmean(np.diag(self.hist) / self.hist.sum(axis=1))

        freq = self.hist.sum(axis=1) / self.hist.sum()

        fwavacc = (freq[freq > 0] * iou[freq > 0]).sum()

        return acc, acc_cls, iou, miou, fwavacc


 

if __name__ == '__main__':

    label_path = 'D:/3_Test/all_result/label/'

    predict_path = 'D:/3_Test/all_result/fcn/'

    pres = os.listdir(predict_path)

    labels = []

    predicts = []

    for im in pres:

        if im[-4:] == '.png':

            label_name = im.split('.')[0] + '.png'

            lab_path = os.path.join(label_path, label_name)

            pre_path = os.path.join(predict_path, im)

            label = cv2.imread(lab_path,0)

            pre = cv2.imread(pre_path,0)

            labels.append(label)

            predicts.append(pre)

    el = IOUMetric(2)      #类别个数

    acc, acc_cls, iou, miou, fwavacc = el.evaluate(predicts, labels)

    print('acc: ',acc)

    print('acc_cls: ',acc_cls)

    print('iou: ',iou)

    print('miou: ',miou)

    print('fwavacc: ',fwavacc)

 

其他指标:

import os

import cv2

import numpy as np

from sklearn.metrics import confusion_matrix

 

label_path = 'D:/3_Test/all_result/label/'

predict_path = 'D:/3_Test/all_result/fcm/'

pres = os.listdir(predict_path)

init = np.zeros((2,2))

for im in pres:

    lb_path = os.path.join(label_path, im)

    pre_path = os.path.join(predict_path, im)

    lb = cv2.imread(lb_path,0)

    pre = cv2.imread(pre_path,0)

    lb = lb.flatten()

    pre = pre.flatten()

    confuse = confusion_matrix(lb, pre)

    init += confuse

 

#我这里是2分类,这是针对目标类别算的

precision = init[1][1]/(init[0][1] + init[1][1]) 

recall = init[1][1]/(init[1][0] + init[1][1])

accuracy = (init[0][0] + init[1][1])/init.sum()

f1_score = 2*precision*recall/(precision + recall)

print('class_accuracy: ', precision)

print('class_recall: ', recall)

print('accuracy: ', accuracy)

print('f1_score: ', f1_score)

 

在sklearn.metrics里还有一个 classification_report也不错,感兴趣的也可以去看看

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如雾如电

随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值