当加载图像/遮罩文件以进行图像分割时,PyTorch如何处理标签?

时间:2019-02-05 05:47:02

标签: image-processing computer-vision pytorch image-segmentation semantic-segmentation

我正在使用PyTorch启动图像分割项目。我在一个文件夹和2个子文件夹中有一个简化的数据集-“图像”用于存储图像,“蒙版”用于被蒙版图像。图像和遮罩是具有3个通道和256x256像素的.png文件。因为它是图像分割,所以必须逐个像素地执行标记。为了简单起见,我目前仅处理2个类。到目前为止,我实现了以下目标:

我能够通过以下方式将文件加载到“图像”或“遮罩”类中:

root_dir="./images_masks"
train_ds_untransf = torchvision.datasets.ImageFolder(root=root_dir)
train_ds_untransf.classes
Out[621]:
['images', 'masks']  

并将数据转换为张量

from torchvision import transforms
train_trans = transforms.Compose([transforms.ToTensor()])
train_dataset = torchvision.datasets.ImageFolder(root=root_dir,transform=train_trans)

此“ train_dataset”中的每个张量具有以下形状:

train_dataset[1][0].shape
torch.Size([3, 256, 256])

现在我需要将加载的数据馈入CNN模型,并为此探索了PyTorch DataLoader

train_dataloaded = DataLoader(train_dataset, batch_size=2, shuffle=False, num_workers=4)

我使用以下代码来检查生成的张量的形状

for x, y in train_dl:
    print (x.shape)
    print (y.shape)
    print(y)

并获得

torch.Size([2, 3, 256, 256])
torch.Size([2])
tensor([0, 0])
torch.Size([2, 3, 256, 256])
torch.Size([2])
tensor([0, 1])
.
.
.

形状似乎正确。但是,第一个问题是我得到了相同文件夹的张量,并由具有相同值[0,0]的一些“ y”张量表示。我希望它们都是[1,0]:1代表图像,0代表蒙版。

第二个问题是,虽然标签是完整的图像时文档很清楚,但是在像素级别如何应用标签尚不清楚,我敢肯定标签是不正确的。

正确标记此数据集的替代方法是什么?

谢谢

1 个答案:

答案 0 :(得分:3)

torchvision.datasets.ImageFolder是为图像分类问题设计的,而不是用于细分的;因此,它希望每个图像具有单个整数标签,并且该标签由存储图像的子文件夹确定。因此,就您的数据加载器而言,您有两类图像“图像”和“掩码”,并且您的网络会尝试区分它们。

您实际需要的是数据集的不同实现,该实现针对每个__getitem__返回图像和相应的遮罩。您可以看到此类here的示例。

此外,将二进制像素标记存储为3通道图像有点奇怪。分段蒙版通常存储为单个通道图像。