Как преобразовать изображение быстрого рисования в 84 на 84 в pytorch с помощью библиотеки Learn2learn?

Я пытался использовать QuickDraw Learn2learn, но кажется, что я получаю ошибки, когда пытаюсь применить к нему преобразования (изменение размера до 84x84, случайное кадрирование). Проблема возникает из-за того, что библиотека быстрой отрисовки l2l пытается применить преобразования к изображению быстрой отрисовки (которое, по-видимому, имеет форму записи np.memmap/.npy, которую PIL не может понять), и поэтому я получаю следующую ошибку:

      Traceback (most recent call last):
  File "/home/pzy2/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/dataloaders/maml_patricks_l2l.py", line 2300, in <module>
    loop_through_l2l_indexable_benchmark_with_model_test()
  File "/home/pzy2/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/dataloaders/maml_patricks_l2l.py", line 2259, in loop_through_l2l_indexable_benchmark_with_model_test
    for benchmark in [quickdraw_l2l_tasksets()]: #hdb8_l2l_tasksets(),hdb9_l2l_tasksets(), delaunay_l2l_tasksets()]:#[dtd_l2l_tasksets(), cu_birds_l2l_tasksets(), fc100_l2l_tasksets()]:
  File "/home/pzy2/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/dataloaders/maml_patricks_l2l.py", line 2216, in quickdraw_l2l_tasksets
    _transforms: tuple[TaskTransform, TaskTransform, TaskTransform] = get_task_transforms_quickdraw(_datasets,
  File "/home/pzy2/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/dataloaders/maml_patricks_l2l.py", line 2184, in get_task_transforms_quickdraw
    train_transforms: TaskTransform = DifferentTaskTransformIndexableForEachDataset(train_dataset,
  File "/home/pzy2/diversity-for-predictive-success-of-meta-learning/div_src/diversity_src/dataloaders/common.py", line 130, in __init__
    self.indexable_dataset = MetaDataset(indexable_dataset)
  File "learn2learn/data/meta_dataset.pyx", line 59, in learn2learn.data.meta_dataset.MetaDataset.__init__
  File "learn2learn/data/meta_dataset.pyx", line 96, in learn2learn.data.meta_dataset.MetaDataset.create_bookkeeping
  File "learn2learn/data/meta_dataset.pyx", line 65, in learn2learn.data.meta_dataset.MetaDataset.__getitem__
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/learn2learn/vision/datasets/quickdraw.py", line 511, in __getitem__
    image = self.transform(image)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torchvision/transforms/transforms.py", line 60, in __call__
    img = t(img)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1051, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torchvision/transforms/transforms.py", line 900, in forward
    i, j, h, w = self.get_params(img, self.scale, self.ratio)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torchvision/transforms/transforms.py", line 859, in get_params
    width, height = F._get_image_size(img)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torchvision/transforms/functional.py", line 67, in _get_image_size
    return F_pil._get_image_size(img)
  File "/home/pzy2/miniconda3/envs/metalearning3.9/lib/python3.9/site-packages/torchvision/transforms/functional_pil.py", line 26, in _get_image_size
    raise TypeError("Unexpected type {}".format(type(img)))
TypeError: Unexpected type <class 'numpy.memmap'>

оригинал:

4 ответа

Если вы используетеtorchvision.transforms.ToTensorэто невозможно напрямую, потому что, как указано в документации

это преобразование не следует использовать при преобразовании масок целевого изображения.

вместо этого проверьте это , чтобы увидеть правильный способ изменения размера

И вот пример, приведенный из этого ответа :

      >>> import numpy as np
>>> import torch
>>> np_arr = np.ones((5289, 38))
>>> torch_tensor = torch.from_numpy(np_arr).long()
>>> type(np_arr)
<class 'numpy.ndarray'>
>>> type(torch_tensor)
<class 'torch.Tensor'>

Из-за отсутствия кода я черпаю вдохновение из вашей проблемы № 333 годичной давности. Думаю, многое изменилось, и вы работаете не над тем же самым. Хотя, я думаю, вы сохранили базовую структуру данных.

Вы хотите создать свой файл на основе набора данных QuickDraw. Я не думаю, что QuickDraw можно индексировать напрямую, потому что он вызывает каждый элемент . Если вы примените преобразование данных к плохому формату данных -> вы получите несовместимость.

На самом деле, если вы посмотрите на Quickdraw в репозитории, то нигде из него не будет создан экземпляр. Это потому, что оно не работает: это ваш баг.

Проблема в следующем: как вести учет (индексацию) на Quickdraw, который кажется очень большим по сравнению с другим набором данных?

Я предлагаю вам следующее:

  1. Выполните ведение книги самостоятельно на основе файла аннотаций из репозитория Quickdraw. Затем вы можете поместить его в атрибут вашего новогоQuickDrawсорт. У вас не будет (очень длинной) бухгалтерской отчетности.MetaDataset. Эта индексация может храниться в.pklфайл, чтобы вы могли сделать это только один раз.
  2. Затем добавьте предварительное преобразование только для QuickDraw. На самом деле, если вы действительно не хотите трогать свое преобразование в своем классе, скажем, я не знаю ваших ограничений, вы можете в худшем случае исправить объект. Но более разумным решением было бы вставить в преобразование данных функцию для преобразованияnp.memmapкPILилиTensorобъект.

Попробуйте преобразовать объект numpy.memmap в массив NumPy, а затем в изображение PIL.

попробуйте этот код и дайте мне знать, как он работает

      import torch
import torchvision.transforms as transforms
from PIL import Image
from learn2learn.data import QuickDraw

quickdraw = QuickDraw(root='path/to/quickdraw/data', train=True, transform=None)
transform = transforms.Compose([
    transforms.Resize(84),
    transforms.CenterCrop(84),
    transforms.ToTensor(),
])

# Get an example QuickDraw image
img, _ = quickdraw[0]

# Convert to PIL image
img = Image.fromarray(img)

# Apply transform
img = transform(img)

# Add a batch dimension
img = img.unsqueeze(0)

# Display the transformed image
print(img.shape)  # torch.Size([1, 1, 84, 84])
Другие вопросы по тегам