Python代码实现:计算图像分割模型的TN值
Python代码实现:计算图像分割模型的TN值
在图像分割任务中,除了常用的TP、FP、FN指标外,TN(真负类率)也是一个重要的评估指标。本文将介绍如何在Python代码中计算TN值,并提供完整的代码示例。
代码实现
以下代码展示了如何在PyTorch框架下计算TN值,并结合Dice系数和Jaccard系数的计算,完整地评估图像分割模型的性能:
def 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()
TN = torch.zeros(14).cuda() # 添加TN计算
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[ak] = (batchshape * 256 * 256 - TP - FP - FN).sum() # 计算TN
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 = (batchshape * 256 * 256 - TP - FP - FN)计算TN值,其中batchshape * 256 * 256代表每个批次的像素总数。 - 其他指标计算: 代码中同时计算了Dice系数和Jaccard系数,用于更全面地评估模型性能。
- GPU加速: 代码支持GPU加速,可以显著提高计算效率。
总结
本文介绍了如何在Python代码中计算图像分割模型的TN值,并提供了完整的代码示例。该代码可方便地集成到您的项目中,用于评估模型性能。
原文地址: https://www.cveoy.top/t/topic/fRTM 著作权归作者所有。请勿转载和采集!