如何更改分割掩码中的 类 标签顺序

How to change classes labels order in a segmentation mask

我想知道是否可以更改分割蒙版中的 class 标签。假设我有面具,其中 classes 顺序是这样的:0 - class A,1 - class B,2 - 背景。有没有办法将其更改为:0 - 背景,1 - class A,2 - class B?

这是我的代码: 现在我的面罩是这样的:0 - 背景,1 - 毛玻璃,2 - 实变,3 - 其他肺。我想要的:0 - 毛玻璃,1 - 实变,2 - 肺其他,3 - 背景。

更改前:

i = 31
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].imshow(mask_four[i, :, :, 0])
axes[0, 0].set_title('Background')
axes[0, 1].imshow(mask_four[i, :, :, 1])
axes[0, 1].set_title('Ground glass')
axes[1, 0].imshow(mask_four[i, :, :, 2])
axes[1, 0].set_title('Consolidation')
axes[1, 1].imshow(mask_four[i, :, :, 3])
axes[1, 1].set_title('Lung other')

输出:

变化中:

lut = torch.tensor([1, 2, 3, 0])
test_mask = mask_four[31]
test_mask2 = lut[test_mask.long()]

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0, 0].imshow(test_mask2[:, :, 0])
axes[0, 1].imshow(test_mask2[:, :, 1])
axes[1, 0].imshow(test_mask2[:, :, 2])
axes[1, 1].imshow(test_mask2[:, :, 3])

输出 2:

这是test_mask:

tensor([[[1., 0., 0., 0.],
         [1., 0., 0., 0.],
         [1., 0., 0., 0.],
         ...,
         [1., 0., 0., 0.],
         [1., 0., 0., 0.],
         [1., 0., 0., 0.]],

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

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

        ...,

这是test_mask2:

tensor([[[2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         ...,
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1]],

        [[2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         ...,
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1]],

        [[2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         ...,
         [2, 1, 1, 1],
         [2, 1, 1, 1],
         [2, 1, 1, 1]],

        ...,

我认为您正在寻找的是将 lookup table 应用于目标标签。
这可以很容易地完成:

In []: orig_target = torch.randint(0, 3, (3,4)); orig_target
Out[]:
tensor([[2, 1, 2, 1],
        [2, 2, 1, 2],
        [1, 2, 0, 0]])

# define the lookup table: 0 -> 2, 1 -> 0, 2 -> 1:
In []: lut = torch.tensor([2, 0, 1])

# apply the lookup table
In []: lut[orig_target]
Out[]:
tensor([[1, 0, 1, 0],
        [1, 1, 0, 1],
        [0, 1, 2, 2]])

更新:

如果你想对遮罩的通道进行peemute:

per_target = orig_target[..., lut]