微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

语义分割中骰子损失中输出掩码和原始掩码之间的维度不匹配

如何解决语义分割中骰子损失中输出掩码和原始掩码之间的维度不匹配

我正在做多类语义分割(4 个类 + 背景)。我的掩码维度是 (256,256,3),输出掩码维度是 (256,5)。我选了 5,因为这是班级数。

骰子损失函数

inputs = inputs.view(-1)
targets = targets.view(-1)
        
intersection = (inputs * targets).sum() ---> error                       
dice = (2.*intersection + smooth)/(inputs.sum() + targets.sum() + smooth)  
        
return 1 - dice

我该怎么做才能使两个维度相同?掩码是从 TIF 文件提取的。

我在下面附上了我的面具图片

My mask image

解决方法

我相信你必须先对目标掩码进行单热编码。 我建议您先阅读这篇好文章,以便更好地掌握语义分割 https://www.jeremyjordan.me/semantic-segmentation/ 的所有细微之处。

确保预测和目标形状匹配,无需使用 view(-1) 压平张量。

同样作为个人建议,Pytorch 张量优先选择通道。

,

我假设您显示的目标分割是一个 RGB 编码的地图。您希望将此 3 通道图像转换为 1 通道标签图。

假设 seg 是形状为 (b,3,h,w) 的地面实况分割图。标签到颜色映射可以任意设置为:

colors = torch.FloatTensor([[0,0],[1,1,[0,1]])

为每种颜色构建一个匹配像素的掩码,并在这些像素位置的新张量中分配相应的标签:

b,_,w = seg.shape
gt = torch.zeros(b,w)
seg_perm = seg.permute(0,2,1)

for label,color in enumerate(colors):
    mask = torch.all(seg_perm == color,dim=-1).unsqueeze(1)
    gt[mask] = label

以下面的分割图为例:

>>> seg = tensor([[[[1.,1.,0.,0.],[1.,0.]],[[0.,[0.,1.]],0.]]]])

用于可视化目的:

>>> T.ToPILImage()(seg[0].repeat_interleave(100,2).repeat_interleave(100,1))

enter image description here

生成的标签图将:

>>> gt
tensor([[[[2.,[2.,3.,4.,3.]]]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?