Как преобразовать изображение быстрого рисования в 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, который кажется очень большим по сравнению с другим набором данных?
Я предлагаю вам следующее:
- Выполните ведение книги самостоятельно на основе файла аннотаций из репозитория Quickdraw. Затем вы можете поместить его в атрибут вашего нового
QuickDraw
сорт. У вас не будет (очень длинной) бухгалтерской отчетности.MetaDataset
. Эта индексация может храниться в.pkl
файл, чтобы вы могли сделать это только один раз. - Затем добавьте предварительное преобразование только для 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])