Загрузка данных изображения из pandas в pytorch - PullRequest
0 голосов
/ 23 апреля 2020

Я совершенно новичок в pytorch и ранее работал над keras и fastai. В настоящее время я пытаюсь решить задачу регрессии изображений, и мне нужно загрузить данные из pandas dataframe. Структура фрейма данных:

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

Ранее я работал над загрузкой изображений в pytorch непосредственно из папок, потому что это была простая задача классификации, но сейчас она застряла.

Я просматривал форумы по pytorch, но не понял, как реализовать. Любая помощь будет оценена.

1 Ответ

1 голос
/ 23 апреля 2020

Наборы данных

Вы должны использовать структуру 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 и 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 позволяет вам кэшировать ваши изображения легко или применить некоторые другие преобразования с помощью .map, как показано там, проверьте github-репозиторий для получения дополнительной информации или спросите в комментарии.

DataLoader

В любом случае вы выберите, что вы должны обернуть свой набор данных в torch.utils.data.DataLoader, чтобы создать пакеты и выполнить итерации по ним, как показано ниже:

dataloader = torch.utils.data.DataLoader(dataset, batch_size=64, shuffle=True)

for images, scores in dataloader:
    # Rest of your code to train neural network or smth
    ...

Делайте с этими изображениями и счетами то, что вы хотите в l oop.

...