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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值