图像分割—小目标识别-loss function选择-u-net-keras

最近在做小目标图像分割任务(医疗方向),往往一幅图像中只有一个或者两个目标,而且目标的像素比例比较小,选择合适的loss function往往可以解决这个问题。以下是我的实验比较。

场景:
1.U-Net网络
2. keras

binary_crossentropy

二分类交叉商损失会导致模型学习不到很好的效果,因为背景所占的比例太大,而目标太小,是严重的不平衡数据。

Focal loss

在这里插入图片描述
可以改善目标不均衡的现象,对此情况比 binary_crossentropy 要好很多。
代码:https://github.com/mkocabas/focal-loss-keras

from keras import backend as K
'''
Compatible with tensorflow backend
'''
def focal_loss(gamma=2., alpha=.25):
	def focal_loss_fixed(y_true, y_pred):
		pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
        	pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
        	return -K.sum(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1))-K.sum((1-alpha) * K.pow( pt_0, gamma) * K.log(1. - pt_0))
	return focal_loss_fixed

使用方法:

model_prn.compile(optimizer=optimizer, loss=[focal_loss(alpha=.25, gamma=2)])

目前结论:
经过测试,发现使用focal loss很容易就会过拟合??且效果一般。。。I don’t know why
此方法代码有待改进,因为此处使用的网络为U-net,输入和输出都是一张图!直接使用会导致loss的值非常的大!

dice loss

dice loss 的提出是在V-net中,其中的一段原因描述是:

在诸如我们在这项工作中处理的医疗量中,感兴趣的解剖结构仅占据扫描的非常小的区域并不罕见。这经常导致学习过程陷入损失函数的局部最小值,从而产生其预测强烈偏向背景的网络。结果,前景区域经常丢失或仅部分检测到。以前的几种方法采用基于样本重新加权的损失函数,其中前景区域在学习期间比背景区域更重要。

由此可见。dice loss的提出就是解决前景比例太小的问题!
DSC的是两个轮廓区域的相似程度,用A、B表示两个轮廓区域所包含的点集,定义为:
在这里插入图片描述
代码:

def dice_coef(y_true, y_pred, smooth=1):
    intersection = K.sum(y_true * y_pred, axis=[1,2,3])
    union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
    return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)
def dice_coef_loss(y_true, y_pred):
	1 - dice_coef(y_true, y_pred, smooth=1)

BCE + dice

BCE : Binary Cross Entropy
代码:

import keras.backend as K
from keras.losses import binary_crossentropy
def dice_coef(y_true, y_pred, smooth=1):
    intersection = K.sum(y_true * y_pred, axis=[1,2,3]) ##y_true与y_pred都是矩阵!(Unet)
    union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
    return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)
def dice_p_bce(in_gt, in_pred):
    return 1e-3*binary_crossentropy(in_gt, in_pred) - dice_coef(in_gt, in_pred)

参考:https://www.kaggle.com/kmader/baseline-u-net-model-part-1
思考:Dice + Focal loss ???


如果有好的方式方法可以在此讨论:
小目标的图像语义分割,有什么解决类别不平衡的方法吗?

猜你喜欢

转载自blog.csdn.net/m0_37477175/article/details/83004746