Загрузка пользовательских наборов изображений с помощью PyTorch

Я использую набор данных coil-100, который имеет изображения из 100 объектов, 72 изображения на объект, взятые с фиксированной камеры путем поворота объекта на 5 градусов на изображение. Ниже приведена структура папок, которую я использую:

data / train / obj1 / obj01_0.png, obj01_5.png... obj01_355.png
,
,
data / train / obj85 / obj85_0.png, obj85_5.png... obj85_355.png
,
,
data/test/obj86/obj86_0.ong, obj86_5.png ... obj86_355.png
,
,
data / test / obj100 / obj100_0.ong, obj100_5.png ... obj100_355.png

Я использовал классы imageloader и dataloader. Наборы данных train и test загружены правильно, и я могу напечатать имена классов.

train_path = 'data/train/'
test_path = 'data/test/'
data_transforms = {
    transforms.Compose([
    transforms.Resize(224, 224),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ])
}

train_data = torchvision.datasets.ImageFolder(
    root=train_path,
    transform= data_transforms
)
test_data = torchvision.datasets.ImageFolder(
    root = test_path,
    transform = data_transforms
)
train_loader = torch.utils.data.DataLoader(
    train_data,
    batch_size=None,
    num_workers=1,
    shuffle=False
)
test_loader = torch.utils.data.DataLoader(
    test_data,
    batch_size=None,
    num_workers=1,
    shuffle=False
)

print(len(train_data))
print(len(test_data))
classes = train_data.class_to_idx
print("detected classes: ", classes)

В моей модели я хочу пропустить каждое изображение через предварительно обученную повторную сеть и сделать набор данных из вывода повторной сети для передачи в двунаправленный LSTM. Для чего мне нужно получить доступ к изображениям по имени класса и индексу. например pre_resnet_train_data['obj01'][0] должно быть obj01_0.png а также post_resnet_train_data['obj01'][0] должен быть вывод реснета obj01_0.png и так далее.
Я новичок в Pytorch, и за последние 2 дня я прочитал много уроков и вопросов о стекопереработке по созданию пользовательского класса набора данных, но не смог понять, как добиться того, чего я хочу. пожалуйста помоги!

1 ответ

Предполагая, что вы планируете запускать повторную отправку изображений только один раз и сохранять результат для дальнейшего использования, я предлагаю вам написать свой собственный набор данных, полученный из ImageFolder.
Сохраняйте каждый вывод resnet в том же месте, что и файл изображения с.pth расширение.

class MyDataset(torchvision.datasets.ImageFolder):
  def __init__(self, root, transform):
    super(MyDataset, self).__init__(root, transform)

  def __getitem__(self, index):
    # override ImageFolder's method
    """
    Args:
      index (int): Index
    Returns:
      tuple: (sample, resnet, target) where target is class_index of the target class.
    """
    path, target = self.samples[index]
    sample = self.loader(path)
    if self.transform is not None:
      sample = self.transform(sample)
    if self.target_transform is not None:
      target = self.target_transform(target)
    # this is where you load your resnet data
    resnet_path = os.path.join(os.path.splitext(path)[0], '.pth')  # replace image extension with .pth
    resnet = torch.load(resnet_path)  # load the stored features
    return sample, resnet, target
Другие вопросы по тегам