图像分割中训练与推理的骰子分数

问题描述

我正在使用 U-Net 模型和 Dice_loss 作为我的训练损失函数进行图像分割(多类)。使用平滑项分别为每个类计算骰子分数,然后取所有类的平均骰子分数来计算损失。下面是我如何计算张量流中的骰子损失。

def dice_loss(y_true,y_pred,smooth=1e-7):

  # y_true : shape=(BATCH_SIZE,HIEGHT,WIDTH,CHANNELS)
  # y_pred : shape=(BATCH_SIZE,CHANNELS)    
  
  nom = tf.reduce_sum(y_true*y_pred,axis=(1,2))
  denom = tf.reduce_sum(y_true,2)) + tf.reduce_sum(y_pred,2))

  dice_score = (2 * nom + smooth) / (denom + smooth)

  mean_dice_score = tf.reduce_mean(dice_score,axis=-1)

  return 1 - mean_dice_score

最后取该批次所有图像的平均值作为损失。

现在,在推理过程中,我以类似的方式计算骰子分数,但每个类别的骰子分数是单独报告的,而不是所有类别的平均值。下面是如何在 tensorflow 中计算单个类的骰子分数

def compute_dice_score(y_true,num_classes,class_idx,smooth=1e-7):

    # y_true : shape=(BATCH_SIZE,CHANNELS)
    # y_pred : shape=(BATCH_SIZE,CHANNELS)    

    y_pred = tf.one_hot(tf.argmax(y_pred,axis=3),num_classes)
    
    y_pred = y_pred[...,class_idx]
    y_true = y_true[...,class_idx]
    
    nom = tf.reduce_sum(y_true*y_pred,2))
    denom = tf.reduce_sum(y_true,2))

    dice_score = (2 * nom + smooth) / (denom + smooth)

    return dice_score

最后计算批次中所有图像的平均骰子分数。

在训练时,我采用单个图像的平均骰子分数,然后对批次进行平均,因为这对我的数据集更有效,而不是一起计算整个批次的所有骰子分数。

我的问题是在推理过程中

  1. 我是否应该分别计算每个图像的骰子分数,然后 对整个批次取平均值或计算整个批次的骰子分数 一起?哪个是正确的方法
  2. 在推理过程中,骰子分数计算中的平滑项是否应该存在?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)