如何在Pytorch中从图像列表加载数据集

5

我有一个服务,从另一个服务B以二进制格式接收图像:

from PIL import Image

img_list = []
img_bin = get_image_from_service_B()
image = Image.open(io.BytesIO(img_bin)) # Convert bytes to image using PIL

img_list.append(image)    

当我有足够的图像后,我想使用Pytorch将我的图像列表加载为数据集。
if img_list.__len__() == 500:
     ### Load dataset and do a transform operation on the data

my_dataset = datasets.ImageFolder("path/to/images/folder/", transform=transform)
dataset_iterator = DataLoader(my_dataset, batch_size=1)

现在我的问题是如何执行转换并从列表中加载数据集。

尝试使用pytorch/serve,那里可以使用请求批处理选项,我认为这应该可以解决问题。或者您将不得不使用异步队列。 - Krueger
1个回答

9

您可以简单地编写自定义数据集:

class MyDataset(torch.utils.data.Dataset):
    def __init__(self, img_list, augmentations):
        super(MyDataset, self).__init__()
        self.img_list = img_list
        self.augmentations = augmentations

    def __len__(self):
        return len(self.img_list)

    def __getitem__(self, idx):
        img = self.img_list[idx]
        return self.augmentations(img)
  

现在,您可以将这个自定义数据集插入到DataLoader中,然后就完成了。

1
非常感谢,我想补充说明的是,在我的情况下还需要添加一个目标 self.targets = torch.LongTensor(my_targets) ,其中 my_targets 基本上是另一个列表。当然,__getitem__ 还会返回与图像相关的目标。 - Tajinder Singh
1
@TajinderSingh 显然,有目标总是很好的。 - Shai
1
传统上,“增强”是“数据集”的一部分 - 该模块负责为训练生成单个数据点。而“Dataloader”模块负责将这些点收集到批次中。因此,应用于每个图像的增强是“数据集”的一部分,而考虑诸如“batch_size”和“shuffle”之类的内容则是“DataLoader”的一部分。 - Shai
所以,简要概括一下,以上示例中,我需要手动传递“pil_read”作为第一个数据增强操作,而多进程将在数据加载器中正确处理,是吗? - Gulzar
1
@Gulzar,就是这样。 - Shai
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接