Да, это правильно, и AFAIK pillow
по умолчанию загружает изображения в RGB
, см., Например, ответы на этот вопрос . Таким образом, преобразование в grayscale
является единственным способом, хотя и требует времени.
Решение Pure Pytorch (если ImageFolder
не подходит)
Вы можете развернуть собственную загрузку данных функциональности и на вашем месте я бы не стал go fastai
прокладывать маршрут, так как он довольно высокого уровня и отнимает у вас контроль (вам, возможно, не понадобятся эти функции в любом случае).
В принципе, все, что у вас есть Чтобы сделать это, создайте что-то вроде этого ниже:
import pathlib
import torch
from PIL import Image
class ImageDataset(torch.utils.data.Dataset):
def __init__(self, path: pathlib.Path, images_class: int, regex="*.png"):
self.files = [file for file in path.glob(regex)]
self.images_class: int = images_class
def __getitem__(self, index):
return Image.open(self.files[index]).convert("LA"), self.images_class
# Assuming you have `png` images, can modify that with regex
final_dataset = (
ImageDataset(pathlib.Path("/path/to/dogs/images"), 0)
+ ImageDataset(pathlib.Path("/path/to/cats/images"), 1)
+ ImageDataset(pathlib.Path("/path/to/turtles/images"), 2)
)
Выше вы получите изображения по указанным выше путям, и каждое изображение вернет соответствующий предоставленный класс.
Это дает вам больше гибкости ( настройка папки отличается от torchvision.datasets.ImageFolder
) для нескольких строк.
Из c, вы можете добавить больше или использовать l oop или что-то еще. Вы также можете применить torchvision.transforms
, например, преобразовав изображения выше в тензоры, прочитав
Torchdata Solution
Отказ от ответственности, автор здесь . Если вы обеспокоены временем загрузки ваших данных и преобразованием grayscale
, вы можете использовать torchdata
стороннюю библиотеку для pytorch
.
Используя ее, можно создать то же самое, что и выше, но используйте cache
или map
(чтобы легко использовать torchvision.transforms
или другие преобразования) и некоторые другие известные вещи, например, из модуля tensorflow.data
, см. ниже:
import pathlib
from PIL import Image
import torchdata
# Change inheritance
class ImageDataset(torchdata.Dataset):
def __init__(self, path: pathlib.Path, images_class: int, regex="*.png"):
super().__init__() # And add constructor call and that's it
self.files = [file for file in path.glob(regex)]
self.images_class: int = images_class
def __getitem__(self, index):
return Image.open(self.files[index]), self.images_class
final_dataset = (
ImageDataset(pathlib.Path("/path/to/dogs/images"), 0)
+ ImageDataset(pathlib.Path("/path/to/cats/images"), 1)
+ ImageDataset(pathlib.Path("/path/to/turtles/images"), 2)
).cache() # will cache data in-memory after first pass
# You could apply transformations after caching for possible speed-up
torchvision ImageFolder
loader
Как правильно указано @jodag
в комментариях, можно использовать loader
, вызываемый с одним аргументом path
, чтобы сделать настраиваемое открытие данных, например, для оттенков серого это может быть:
from PIL import Image
import torchvision
dataset = torchvision.datasets.ImageFolder(
"/path/to/images", loader=lambda path: Image.open(path).convert("LA")
)
Обратите внимание, что вы также можете использовать его для других типов файлов, это не обязательно изображения.