【deeplearning tips】dice loss解决分割正负样本不均衡

文章介绍了DiceLoss在分割任务中的应用,特别是对于正样本占比小的情况如边缘分割和小目标分割的优化。它提供了DiceCoefficient的计算代码,并结合BinaryCrossentropy损失函数,用于边缘加前景的分割任务。通过TensorFlow和Keras实现了一种改进的方法,强化了边缘区域的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dice loss可以理解为检测任务重的IOU,用于分割任务中可以有效缓解正样本占比小的case。比如边缘的分割、小目标的分割。

前景分割:

#https://stackoverflow.com/questions/72195156/correct-implementation-of-dice-loss-in-tensorflow-keras
def dice_coef(y_true, y_pred, smooth=100):        
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    dice = (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
    return dice


def dice_coef_loss(y_true, y_pred):
    return 1-dice_coef(y_true, y_pred)

边缘+前景分割:

edge_kernel = np.array([1,1,1,1,-8,1,1,1,1], dtype=np.float32).reshape([3,3,1,1])
edge_kernel_const = tf.constant(edge_kernel)


def edge_dice_coef_loss(y_true, y_pred):
    y_true_edge = tf.nn.conv2d(y_true, edge_kernel_const, strides=1, padding='SAME')
    y_true_edge = 1. - tf.cast(tf.equal(y_true_edge, 0), dtype=tf.float32)#gt只有0、1
    
    y_pred_edge = tf.nn.conv2d(y_pred, edge_kernel_const, strides=1, padding='SAME')
    y_pred_edge = tf.pow(y_pred_edge, 2)#拉大边缘和非边缘区的值
    y_pred_edge = y_pred_edge/(y_pred_edge + 0.01) # 6/(6+0.01)=0.99, 0.01/(0.01+0.01)=0.5, 0.001/(0.001+0.01)=0.0    
    
    dice_loss = 1-dice_coef(y_true_edge, y_pred_edge)
    
    
    bce = tf.keras.losses.BinaryCrossentropy()
    bce_loss = bce(y_true, y_pred)
    return dice_loss + bce_loss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值