以下是计算图像分割模型真负样本 (TN) 数的 PyTorch 代码,并补充了在评估模型性能中如何使用 TN 的解释。

def eval_net(net, dataset, slicetotal, batch_size=12, gpu=True):
    '''Evaluation without the densecrf with the dice coefficient'''

    net.eval()
    start = time.time()
    dice_ = torch.zeros(14).cuda()
    jac_ = torch.zeros(14).cuda()
    NE = torch.zeros(14).cuda()
    JNE = torch.zeros(14).cuda()

    accuracy_ = torch.zeros(14).cuda()
    precision_ = torch.zeros(14).cuda()
    recall_ = torch.zeros(14).cuda()
    specificity_ = torch.zeros(14).cuda()

    print(1)
    with torch.no_grad():
        for i, b in enumerate(batch(dataset, batch_size)):

            imgs = np.array([k[0] for k in b]).astype(np.float32)
            true_masks = np.array([k[1] for k in b])

            imgs = torch.from_numpy(imgs)
            imgs = imgs.unsqueeze(1)
            true_masks = torch.from_numpy(true_masks)

            pre_masks_eval = torch.zeros(true_masks.shape[0],14,256,256)
            true_masks_eval = torch.zeros(true_masks.shape[0],14,256,256)
            batchshape = true_masks.shape[0]

            batch_dice = torch.zeros(14).cuda()
            if gpu:
                imgs = imgs.cuda()
                true_masks = true_masks.cuda()
                net.cuda()

            output_img = net(imgs)
            input = output_img.cuda()
            pre_masks = input.max(1)[1].float() #索引代表像素所属类别的数>字
            for ak in range(14):
                if ak == 0:
                    continue
                pre_masks_eval[:,ak] = (pre_masks==ak)
                true_masks_eval[:,ak] = (true_masks==ak)
                premasks = pre_masks_eval[:,ak].view(true_masks.shape[0],-1)
                truemasks = true_masks_eval[:,ak].view(true_masks.shape[0],-1)

                intersection = premasks * truemasks
                TP = intersection.sum(1)
                FP = premasks.sum(1) - TP
                FN = truemasks.sum(1) - TP
                TN = torch.zeros(14).cuda()
                TN[ak] = (batchshape - TP[ak] - FP[ak] - FN[ak]) - NE[ak]

                for bk in range(true_masks.shape[0]):
                    if TP[bk] == 0 and FP[bk] == 0 and FN[bk] == 0:
                        NE[ak] += 1
                        JNE[ak] += 1
                    else:
                        batch_dice[ak] = batch_dice[ak] + 2*TP[bk] / (2*TP[bk] + FP[bk] + FN[bk])
                        jac_[ak] = jac_[ak] + TP[bk] / (TP[bk] + FP[bk] + FN[bk])

            dice_ = dice_ + batch_dice

        for knum in range(14):
            dice_[knum] = dice_[knum] / (slicetotal - NE[knum])
            jac_[knum] = jac_[knum] / (slicetotal - JNE[knum])
    end = time.time()
    print('time used:',end - start)

    return dice_,jac_ 

for ak in range(14): 循环内部,通过以下公式计算 TN:

TN[ak] = (batchshape - TP[ak] - FP[ak] - FN[ak]) - NE[ak]

解释:

  • batchshape 代表每个批次样本的数量。
  • TP[ak], FP[ak], FN[ak] 分别代表当前类别 ak 的真阳性、假阳性和假阴性样本数。
  • NE[ak] 代表当前类别 ak 的所有样本都没有被预测为该类别的次数。

为什么要计算 TN?

  • TN 是评估分类器性能的重要指标之一,它反映了分类器将负样本正确分类为负样本的能力。
  • 在图像分割任务中,TN 代表模型将非目标区域正确分类为非目标区域的次数,这对于评估模型的整体准确率和泛化能力至关重要。

其他指标:

除了 TN,其他常用的图像分割模型评估指标还包括:

  • Dice 系数 (Dice Coefficient):衡量预测结果和真实标签之间的重叠程度。
  • Jaccard 指数 (Jaccard Index):衡量预测结果和真实标签之间的相似度。
  • 准确率 (Accuracy):衡量模型正确预测的样本数量占总样本数量的比例。
  • 精确率 (Precision):衡量模型预测为正样本的样本中,真正为正样本的比例。
  • 召回率 (Recall):衡量模型成功识别所有正样本的比例。
  • 特异度 (Specificity):衡量模型将负样本正确分类为负样本的比例。

通过综合考虑这些指标,可以全面评估图像分割模型的性能,并选择最适合实际应用场景的模型。

PyTorch代码:计算图像分割模型的真负样本 (TN) 数

原文地址: https://www.cveoy.top/t/topic/fRTH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录