Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在keras语义切分中获取单个类的iou?_Python_Keras_Metrics_Image Segmentation - Fatal编程技术网

Python 如何在keras语义切分中获取单个类的iou?

Python 如何在keras语义切分中获取单个类的iou?,python,keras,metrics,image-segmentation,Python,Keras,Metrics,Image Segmentation,我正在使用《图像分割指南》执行语义分割。我试图修改指南以适应我的数据集,方法是将8位img掩码值标记为1和2,就像牛津Pets数据集中那样。(在牛津PETS(keras.utils.Sequence)类中将减去0和1):) 问题是如何获取单个类的IoU度量(例如1) 我尝试了Stack Overflow建议的不同指标,但大多数指标都建议使用MeanIoU,我尝试了,但结果得到了nan损失。下面是使用autocontrast后的掩码示例。 PIL.ImageOps.autocontrast(加载i

我正在使用《图像分割指南》执行语义分割。我试图修改指南以适应我的数据集,方法是将8位img掩码值标记为1和2,就像牛津Pets数据集中那样。(在牛津PETS(keras.utils.Sequence)类中将减去0和1):)

问题是如何获取单个类的IoU度量(例如1)

我尝试了Stack Overflow建议的不同指标,但大多数指标都建议使用MeanIoU,我尝试了,但结果得到了nan损失。下面是使用autocontrast后的掩码示例。
PIL.ImageOps.autocontrast(加载img(val\u目标路径[i]))

该模型似乎训练得很好,但精确度随着时间的推移而下降


另外,有人可以帮助解释如何从
y\u true
y\u pred
计算度量分数吗?
我不太清楚在IoU度量计算中何时使用标签值。

我当时也有类似的问题。我使用了
jaccard\u distance\u loss
dice\u metric
。它们是以借据为基础的。我的任务是二进制分割,所以我想您可能需要修改代码,以防您想将其用于多标签分类问题

from keras import backend as K

def jaccard_distance_loss(y_true, y_pred, smooth=100):
    """
    Jaccard = (|X & Y|)/ (|X|+ |Y| - |X & Y|)
            = sum(|A*B|)/(sum(|A|)+sum(|B|)-sum(|A*B|))
    
    The jaccard distance loss is usefull for unbalanced datasets. This has been
    shifted so it converges on 0 and is smoothed to avoid exploding or disapearing
    gradient.
    
    Ref: https://en.wikipedia.org/wiki/Jaccard_index
    
    @url: https://gist.github.com/wassname/f1452b748efcbeb4cb9b1d059dce6f96
    @author: wassname
    """
    intersection = K.sum(K.sum(K.abs(y_true * y_pred), axis=-1))
    sum_ = K.sum(K.sum(K.abs(y_true) + K.abs(y_pred), axis=-1))
    jac = (intersection + smooth) / (sum_ - intersection + smooth)
    return (1 - jac) * smooth

def dice_metric(y_pred, y_true):
    intersection = K.sum(K.sum(K.abs(y_true * y_pred), axis=-1))
    union = K.sum(K.sum(K.abs(y_true) + K.abs(y_pred), axis=-1))
    # if y_pred.sum() == 0 and y_pred.sum() == 0:
    #     return 1.0

    return 2*intersection / union

# Example
size = 10

y_true = np.zeros(shape=(size,size))
y_true[3:6,3:6] = 1

y_pred = np.zeros(shape=(size,size))
y_pred[3:5,3:5] = 1

loss = jaccard_distance_loss(y_true,y_pred)

metric = dice_metric(y_pred,y_true)

print(f"loss: {loss}")
print(f"dice_metric: {metric}")


对于你的蒙版,你使用0和1进行二进制分割了吗?是的,1是我的前景,0是背景。顺便问一下,它有用吗?如果是的话,接受这个答案来帮助别人会很好。是的,它做到了!我认为我的数据集有问题,因为对数据集进行洗牌会导致jaccard_distance_loss返回的分数大不相同。此外,即使以1e-5的低学习率对骰子进行训练,骰子指标也没有改善。我明白了。确保在将数据集馈送到模型之前对其进行规范化。同样仅供参考,我的损失约为5,度量值约为0.4,但测试数据集上的预测相当不错。一般来说,在语义图像分割中很难获得高精度,因为模型预测的是图像(例如256×256像素),而不是实例(例如猫、狗)。祝你工作顺利!
loss: 4.587155963302747
dice_metric: 0.6153846153846154