【问题标题】:Threshold the output of image segmentation of a keras model对 keras 模型的图像分割输出进行阈值处理
【发布时间】:2023-04-01 05:30:01
【问题描述】:

我在 Keras 中实现了一个 U-Net,用于解决我正在处理的图像分割问题。我发现早期时期的输出提供了非常好的结果,尽管概率很低。随着训练的继续和 IoU 分数的增加,我的输出中得到的像素越来越少,但它们的概率更高。

为了更简洁,我的输出遗漏了某些特征,但它确实识别出的特征的概率更高。

我很想知道是否可以通过使用 sigmoid 激活函数在输出层之后强制像素值为 1 来纠正此问题。有没有一种简单的方法可以做到这一点?我使用 binary_crossentropy 作为损失函数,所以我希望我可以做类似的事情:

def binary_crossentropy_thresh(y_true,y_pred):
    y_pred[y_pred>=0.2] = 1

    return binary_crossentropy(y_true,y_pred)

但这不适用于张量。任何建议将不胜感激。

抱歉,如果我没有充分解释我的问题。

【问题讨论】:

    标签: keras image-segmentation loss unity3d-unet


    【解决方案1】:

    不,您不能将函数转换为常量。它是不可区分的(关于权重),你将无法训练。

    您可以在“自定义指标”中执行此操作,而不是在模型或损失中。


    确保您的 IoU 损失是按“图像方式”而非“批量方式”计算的。损失越普遍,它就越不会注意到微小的事情。如果这些图像的面积小于其他图像,则批量损失可能会忽略整个图像。

    Lovasz 损失是一个对我很有效的损失函数的好建议。


    您也可以尝试样本权重(最适合使用单通道掩码):

    total_pixels = y_train.sum(axis=(1,2,3))
    mean_pixels = total_pixels.mean(axis=0)
    sample_weights = mean_pixels / total_pixels
    

    【讨论】:

    • 我现在实际上正在使用 Binary_Crossentropy 作为我的损失函数,因为这似乎是 UNet++ 和 MultiResUnet 论文中使用的。我会检查 Lovasz 的损失。感谢您的回复。
    • 你也可以试试sample_weights。像some_constant / this_image_mask_total_pixels 这样的权重。
    • 类似:total_pixels = y_train.sum(axis=(1,2,3))mean_pixels = total_pixels.mean(axis=0)sample_weights = mean_pixels / total_pixels
    猜你喜欢
    • 2015-10-19
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 2017-08-11
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多