ฉันกำลังพยายามแบ่งส่วนวัตถุโดยใช้ฟังก์ชันการสูญเสียแบบกำหนดเองตามที่กำหนดไว้ด้านล่าง:
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)
ในการคำนวณระยะทาง Chamfer คุณจะต้องคูณภาพที่คาดการณ์ไว้ (ตามหลักแล้วคือมาสก์ที่มี 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
ไม่ใช่ แต่มีวิธีหลีกเลี่ยงสิ่งนี้ใน Keras หรือไม่? อาจใช้วิธีแก้ไขปัญหาบางอย่างใน Tensorflow ใช่ไหม