是的,那是正确的,据我所知,默认情况下,
pillow
加载图像时使用的是
RGB
,例如请参见
此问题的答案。因此,转换为
grayscale
是唯一的方法,尽管这需要时间。
纯 PyTorch 解决方案(如果
ImageFolder
不适用)
您可以编写自己的数据加载功能,如果我是您,我不会选择
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
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
的文件夹设置)需要写几行额外的代码。
当然,你也可以添加更多的内容或使用循环或其他方法。你还可以应用
torchvision.transforms
,例如将上述图像转换为张量,请参阅下文。
torchdata 解决方案
免责声明,作者在这里。如果你关心数据加载时间和灰度转换,你可以使用第三方库
torchdata
来处理
pytorch
。
使用它,你可以创建与上面相同的东西,但使用缓存或映射(以便轻松使用
torchvision.transforms
或其他转换),以及一些其他的东西,如来自
tensorflow.data
模块的知识,见下文:
import pathlib
from PIL import Image
import torchdata
class ImageDataset(torchdata.Dataset):
def __init__(self, path: pathlib.Path, images_class: int, regex="*.png"):
super().__init__()
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()
torchvision ImageFolder
loader
正如评论中@jodag
所正确指出的,可以使用具有单个参数path
的loader
可调用函数来进行自定义数据打开,例如对于灰度图像,它可以是:
from PIL import Image
import torchvision
dataset = torchvision.datasets.ImageFolder(
"/path/to/images", loader=lambda path: Image.open(path).convert("LA")
)
请注意,您也可以将其用于其他类型的文件,这些文件不一定是图像。