【问题标题】:Segmentation to one-hot encoding分割为 one-hot 编码
【发布时间】:2021-04-14 15:13:04
【问题描述】:

我有一批大小不同的分割图像

seg --> [batch, channels, imsize, imgsize] --> [16, 6, 50, 50]

这个张量中的每个标量都指定了一个分割类。 我们共有2000 个细分类别。

现在的目标是转换 [16, 6, 50, 50] --> [16, 2000, 50, 50] 每个类都以一种热门方式编码。

我如何使用 pytorch api 做到这一点? 我只能想到低效的循环构造。

例子

这里我们将只有 2 个初始通道(而不是 6 个)、4 个标签(而不是 2000 个)、大小批量 1(而不是 16 个)和 4x4 图像而不是 50x50。

0, 0, 1, 1
0, 0, 0, 1
1, 1, 1, 1
1, 1, 1, 1

3, 3, 2, 2
3, 3, 2, 2
3, 3, 2, 2
3, 3, 2, 2

现在变成4通道输出

1, 1, 0, 0
1, 1, 1, 0
0, 0, 0, 0
0, 0, 0, 0

0, 0, 1, 1
0, 0, 0, 1
1, 1, 1, 1
1, 1, 1, 1

1, 1, 0, 0
1, 1, 0, 0
1, 1, 0, 0
1, 1, 0, 0

0, 0, 1, 1
0, 0, 1, 1
0, 0, 1, 1
0, 0, 1, 1

关键观察是特定标签仅出现在单个输入通道上。

【问题讨论】:

  • 6 代表什么?您的目标是将 16 6-通道 50x50 图像转换为 16 2000-频道 50x50 图像。您从 15,000 点/图像变为 5,000,000 点/图像。你确定这是你要找的吗?
  • @Ivan 6 只是一些标签从 0 到 2000 的频道。这不是那么重要的细节......在频道 0 上只能存在标签子集,在频道 1 上是另一个标签子集,等等。因此,通道零分区图像在对应于对象的标签上,通道 1 分区图像在对应于部分的标签上,等等。现在,由于总共有 2000 个标签,因此一次热编码需要 2000 x imgsize x imgsize。有意义吗
  • 好的,在给定的频道上,比如 channel=0,你怎么知道它对应的标签?我不清楚您将如何将 6 通道图像转换为相同大小的 2000 通道图像。
  • @Ivan 它将由标签编号给出...假设通道零具有标签 10 和其他一些标签。现在 [:, 10, :, :] 将在同一位置有 1 ,而在其他任何地方都有 10 和 0 。有意义吗
  • @Ivan 当然,完成了!

标签: python numpy pytorch


【解决方案1】:

我认为您可以轻松实现这一目标。构造与标签一样多的掩码,然后将这些掩码堆叠在一起,在通道层上求和并转换为浮点数:

>>> x
tensor([[[0, 0, 1, 1],
         [0, 0, 0, 1],
         [1, 1, 1, 1],
         [1, 1, 1, 1]],

        [[3, 3, 2, 2],
         [3, 3, 2, 2],
         [3, 3, 2, 2],
         [3, 3, 2, 2]]])

>>> y = torch.stack([x==i for i in range(x.max()+1)], dim=1).sum(dim=2)
tensor([[[1., 1., 0., 0.],
         [1., 1., 1., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 1., 1.],
         [0., 0., 0., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[0., 0., 1., 1.],
         [0., 0., 1., 1.],
         [0., 0., 1., 1.],
         [0., 0., 1., 1.]],

        [[1., 1., 0., 0.],
         [1., 1., 0., 0.],
         [1., 1., 0., 0.],
         [1., 1., 0., 0.]]])

【讨论】:

  • 这就是我在 torch.Size([16, 6, 50, 50]) 中得到的东西 torch.Size([2000, 6, 50, 50]) 所以有些东西是关闭的.. .
  • 显然没有考虑到批次维度,至少。
  • 另一个问题——它仍然使用 for 循环而不是 pytorch api...如果你处理大数据,这太慢了
  • 现在应该修复,这是在右轴上堆叠/求和的问题。你必须意识到这不是一个简单的任务,你正试图从多个通道中解开不确定数量的标签......你可能无法仅使用张量来实现这一点。
猜你喜欢
  • 2017-11-06
  • 2017-03-16
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2021-12-13
  • 2018-10-31
  • 1970-01-01
  • 2018-01-26
相关资源
最近更新 更多