Я пытаюсь сегментировать объекты с помощью настраиваемой функции потерь, как определено ниже:
def chamfer_loss_value(y_true, y_pred):
# flatten the batch
y_true_f = K.batch_flatten(y_true)
y_pred_f = K.batch_flatten(y_pred)
# ==========
# get chamfer distance sum
// error here
y_pred_mask_f = K.cast(K.greater_equal(y_pred_f,0.5), dtype='float32')
finalChamferDistanceSum = K.sum(y_pred_mask_f * y_true_f, axis=1, keepdims=True)
return K.mean(finalChamferDistanceSum)
def chamfer_loss(y_true, y_pred):
return chamfer_loss_value(y_true, y_pred)
y_pred_f
это результат моей U-net. y_true_f
является результатом преобразования евклидова расстояния на маске наземной метки истинности x
, как показано ниже:
distTrans = ndimage.distance_transform_edt(1 - x)
Чтобы вычислить расстояние фаски, вы умножаете предсказанное изображение (в идеале, маску с 1 и 0) на преобразование наземного истинного расстояния и просто суммируете по всем пикселям. Для этого мне нужно было получить маску y_pred_mask_f
, задав порог y_pred_f
, затем умножить на y_true_f
и просуммировать по всем пикселям.
y_pred_f
предоставляет непрерывный диапазон значений в [0,1], и я получаю ошибку None type not supported
при оценке y_true_mask_f
. Я знаю, что функция потерь должна быть дифференцируемой, а greater_equal
и cast
- нет. Но есть ли способ обойти это в Керасе? Возможно, использовать какой-нибудь обходной путь в Tensorflow?