将图像数据从熊猫加载到pytorch

时间:2020-04-23 16:13:31

标签: python pandas deep-learning pytorch

我对pytorch完全陌生,以前曾在keras和fastai工作。 当前正在尝试图像回归任务,而面临的挑战是我必须从pandas数据框中加载数据。 数据框结构:

ID   Path   Score
fig1  /folder/fig1.jpg  2
fig2  /folder/fig2.jpg  3
.....

我以前曾致力于直接从文件夹将图像加载到pytorch,因为这是一个简单的分类任务,但现在有点卡住了。

我浏览了pytorch论坛,但并没有安静地了解如何实现。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

数据集

您必须使用torch.utils.data.Dataset结构进行定义。 这是您可以在普通pytorch中进行的操作(我正在使用pillow加载图像,并使用torchvision将其转换为torch.Tensor对象):

import torch
import torchvision
from PIL import Image


class MyDataset(torch.utils.data.Dataset):
    def __init__(self, dataframe):
        self.dataframe = dataframe

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

    def __getitem__(self, index):
        row = self.dataframe.iloc[index]
        return (
            torchvision.transforms.functional.to_tensor(Image.open(row["Path"])),
            row["Score"],
        )

dataset = MyDataset(dataframe)

或者,您可以使用torchdata免责声明:我是作者的无耻自我促销... ),它可以使Path和{{ 1}}:

Scores

(或者您可以像在常规import torchvision from PIL import Image import torchdata class ImageDataset(torchdata.datasets.FilesDataset): def __getitem__(self, index): return Image.open(self.files[index]) class Labels(torchdata.Dataset): def __init__(self, scores): super().__init__() self.scores = scores def __len__(self): return len(self.scores) def __getitem__(self, index): return self.scores[index] # to_numpy for convenience # I assume all your images are in /folder and have *.jpg extension dataset = ImageDataset.from_folder("/folder", regex="*.jpg").map( torchvision.transforms.ToTensor() ) | Labels(dataframe["Score"].to_numpy()) 中一样实现它,但是从pytorch继承并在构造函数中调用torchdata.Dataset)。

super().__init__()允许您轻松地缓存图像,或通过torchdata应用其他转换,如图所示,check github repository for more info或在评论中提问。

DataLoader

您选择的任何一种方式都应将数据集包装在.map中,以创建批次并对其进行迭代,如下所示:

torch.utils.data.DataLoader

对这些图像进行处理,并对循环中想要的内容进行评分。