如何计算语义分割中的TN(真负例)?
如何计算语义分割中的TN(真负例)?
在语义分割任务中,我们通常使用像素级别的指标来评估模型的性能,例如Dice系数、Jaccard指数等。除了这些指标,了解每个类别的真阳性(TP)、假阳性(FP)、假阴性(FN)和真阴性(TN)的数量对于全面评估模型性能也很重要。
本文将重点介绍如何计算TN,并提供一个使用PyTorch框架的代码示例。
代码示例:
以下代码片段展示了如何在PyTorch中计算语义分割模型的TN:pythondef eval_net(net, dataset, slicetotal, batch_size=12, gpu=True): '''使用Dice系数进行评估,不使用densecrf'''
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 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_
代码解释:
- TN初始化: 我们首先创建一个名为
TN的张量,并使用torch.zeros(14).cuda()将其初始化为零。2. 计算TN: 在循环内部,我们使用以下公式计算TN:python TN[ak] = (batchshape - TP[ak] - FP[ak] - FN[ak]) - NE[ak]其中: -batchshape是每个batch的样本数量。 -TP[ak]、FP[ak]和FN[ak]分别表示类别ak的真阳性、假阳性和假阴性数量。 -NE[ak]表示类别ak中没有预测结果和真实标签的样本数量。
总结:
通过计算TN,我们可以更全面地了解模型在区分不同类别时的性能。 这对于评估模型在处理负样本时的性能非常重要,特别是在医学图像分割等应用中。
原文地址: https://www.cveoy.top/t/topic/fRTo 著作权归作者所有。请勿转载和采集!