Python 代码中 NE 和 JNE 的含义解析

本文将详细解释以下 Python 代码片段中 NEJNE 分别代表的含义:

def eval_net(net, dataset, slicetotal, batch_size=12, gpu=True):
    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()
    ia = 0
    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) # 这里考虑把 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

                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_

NE 代表的含义是每个类别中没有预测正确的像素数量。在代码中,NE[ak] 会被累加,当一个类别中所有的 TPFPFN 都为 0 时,表示该类别没有预测正确的像素,NE[ak] 会增加 1。

JNE 代表的含义是每个类别中没有预测正确的像素数量,但是不包括所有 TPFPFN 都为 0 的情况。在代码中,JNE[ak] 会被累加,当一个类别中所有的 TPFPFN 都为 0 时,JNE[ak] 不会增加,但是当 TPFPFN 中至少有一个不为 0 时,JNE[ak] 会增加 1。

总结

  • NE 统计所有类别中没有预测正确的像素数量,包括所有 TPFPFN 都为 0 的情况。
  • JNE 统计所有类别中没有预测正确的像素数量,但不包括所有 TPFPFN 都为 0 的情况。

应用场景

NEJNE 通常用于评估图像分割模型的性能,特别是当数据集包含一些类别在某些图像中没有出现的情况时。通过计算 NEJNE,我们可以更准确地评估模型对不同类别预测效果的差异。

注意

  • TP 代表真阳性,表示模型正确预测为正样本的像素数量。
  • FP 代表假阳性,表示模型错误预测为正样本的像素数量。
  • FN 代表假阴性,表示模型错误预测为负样本的像素数量。

希望本文的解析能帮助您理解 NEJNE 的含义,并应用于您的图像分割模型评估工作中。


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

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