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