我开始使用PyTorch图像分割项目。我有一个文件夹和子文件夹2在减小的数据集 - “图像”来存储图像和“掩模”的掩蔽图像。图像和口罩.png文件有3个频道和256×256像素。因为是图像分割,标记必须执行由像素的像素。我此刻的简单与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口罩。
第二个问题是,虽然该文件是明确的,当标签是整个图像,它并不清楚如何在像素级应用它的标签,我敢肯定的标签是不正确的。
什么是正确的标签数据集的方法吗?
谢谢
类torchvision.datasets.ImageFolder
设计用于影像的分类问题,而不是为了分割;因此,预计每个图像的单个整数标签和标签由其中的图像被存储的子文件夹确定。所以,只要你的DataLoader关心你有两个班的图像“图像”和“面具”和你的净试图区分它们。
你真正需要的是一个不同的实现数据集,对于每一个__getitem__
返回的图像和相应的屏蔽。你可以看到这样的类here的例子。
此外,它是有点不可思议的是二进制文件逐像素标签被存储为3个信道的图像。分割掩码通常存储为单个信道的图像。