使用unet和dice损失函数的医学图像分割

时间:2019-05-11 04:56:00

标签: python-3.x deep-learning image-segmentation medical mri

我正在为医学图像分割进行MRI扫描,因为它是非常不平衡的数据集,我为每个图像使用了unet +余弦骰子损失+类别权重,但是我没有得到令人满意的结果。有时它可以正常工作,但有时由于在同一数据集上未检测到细分而发生。

def class_weight_gen(y_true):
  y = np.argmax(y_true,axis=-1).reshape([-1])
  w = compute_class_weight('balanced',np.unique(y),y)
  w_real = np.zeros(4)
  index = np.unique(y)
  for i in index:
      w_real[i]=w[i]
  return w_real

def dice_loss(y_true,y_pred): 
  axis = tuple(range(1,len(y_pred.shape)-1)) 
  numerator = 2. * K.sum(K.abs(y_pred * y_true), axis)
  denominator = K.sum(K.abs(y_pred) + K.abs(y_true), axis)
  dsc = K.mean(numerator*class_weight_gen(y_true)/denominator)
  cos_dsc_loss = np.power(K.cos(((np.pi)/2)*dsc),1.7)
  return cos_dsc_loss

def dice_score(y_true,y_pred):
  numerator = 2.* K.sum(K.abs(y_pred * y_true))
  denominator =K.sum(K.abs(y_pred) + K.abs(y_true))
  dsc = K.mean(numerator/denominator)
  return dsc

sgd = optimizers.SGD(lr=0.05,momentum=0.9,nesterov=False)
model.compile(optimizer=sgd,loss=dice_loss,metrics=[dice_score])
lr_reduce = callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3) 

U-net model used 我认为我的代码是正确的,但是分段未正确进行,这可能是什么原因。

0 个答案:

没有答案