Saya mencoba segmentasi objek menggunakan fungsi kerugian khusus seperti yang didefinisikan di bawah ini:
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
adalah hasil U-net saya. y_true_f
merupakan hasil transformasi jarak euclidean pada ground truth label mask x
seperti gambar dibawah ini:
distTrans = ndimage.distance_transform_edt(1 - x)
Untuk menghitung jarak Chamfer, Anda mengalikan gambar yang diprediksi (idealnya, masker dengan 1 dan 0) dengan transformasi jarak kebenaran dasar, dan cukup menjumlahkan semua piksel. Untuk melakukan ini, saya perlu mendapatkan topeng y_pred_mask_f
dengan melakukan ambang batas y_pred_f
, lalu mengalikannya dengan y_true_f
, dan menjumlahkan semua piksel.
y_pred_f
memberikan rentang nilai berkelanjutan di [0,1], dan saya mendapatkan kesalahan None type not supported
pada evaluasi y_true_mask_f
. Saya tahu fungsi kerugian harus dapat dibedakan, dan greater_equal
dan cast
tidak. Tapi, apakah ada cara untuk menghindari hal ini di Keras? Mungkin menggunakan beberapa solusi di Tensorflow?