数据集文档
加载图像数据
并获得增强的文档体验
开始
加载图像数据
图像数据集具有 Image 类型的列,其中包含 PIL 对象。
要使用图像数据集,你需要安装 vision
依赖项。查看 安装 指南了解如何安装。
当你加载图像数据集并调用 image 列时,图像会被解码为 PIL 图像
>>> from datasets import load_dataset, Image
>>> dataset = load_dataset("beans", split="train")
>>> dataset[0]["image"]
首先使用行索引,然后使用 image 列 - dataset[0]["image"]
- 索引到图像数据集,以避免解码和重采样数据集中的所有图像对象。否则,如果你有一个大型数据集,这可能是一个缓慢且耗时的过程。
有关如何加载任何类型数据集的指南,请查看 通用加载指南。
本地文件
你可以从图像路径加载数据集。使用 cast_column() 函数接受图像文件路径列,并使用 Image 特征将其解码为 PIL 图像
>>> from datasets import Dataset, Image
>>> dataset = Dataset.from_dict({"image": ["path/to/image_1", "path/to/image_2", ..., "path/to/image_n"]}).cast_column("image", Image())
>>> dataset[0]["image"]
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>]
如果你只想加载图像数据集的底层路径而不解码图像对象,请在 Image 特征中设置 decode=False
>>> dataset = load_dataset("beans", split="train").cast_column("image", Image(decode=False))
>>> dataset[0]["image"]
{'bytes': None,
'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/bean_rust/bean_rust_train.29.jpg'}
ImageFolder
你还可以使用 ImageFolder
数据集构建器加载数据集,而无需编写自定义数据加载器。这使得 ImageFolder
非常适合快速创建和加载包含数千张图像的图像数据集,用于不同的视觉任务。你的图像数据集结构应如下所示
folder/train/dog/golden_retriever.png
folder/train/dog/german_shepherd.png
folder/train/dog/chihuahua.png
folder/train/cat/maine_coon.png
folder/train/cat/bengal.png
folder/train/cat/birman.png
或者它应该有元数据,例如
folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.png
如果数据集遵循 ImageFolder
结构,那么你可以直接使用 load_dataset() 加载它
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
对于本地数据集,这等同于在 load_dataset() 中手动传递 imagefolder
以及在 data_dir
中传递目录
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")
然后你可以将图像作为 PIL.Image
对象访问
>>> dataset["train"][0]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>, "label": 0}
>>> dataset["train"][-1]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E8DAD30>, "label": 1}
要忽略元数据文件中的信息,请在 load_dataset() 中设置 drop_metadata=True
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
如果你没有元数据文件,ImageFolder
会自动从目录名称推断标签名称。如果你想删除自动创建的标签,请设置 drop_labels=True
。在这种情况下,你的数据集将仅包含一个图像列
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
最后,filters
参数允许你仅加载数据集的子集,基于标签或元数据上的条件。如果元数据是 Parquet 格式,这将特别有用,因为这种格式可以实现快速过滤。还建议将此参数与 streaming=True
一起使用,因为默认情况下,数据集在过滤之前会被完全下载。
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
有关创建你自己的 ImageFolder
数据集的更多信息,请查看 创建图像数据集 指南。
WebDataset
WebDataset 格式基于 TAR 存档文件夹,适用于大型图像数据集。由于其大小,WebDataset 通常以流式模式加载(使用 streaming=True
)。
你可以像这样加载 WebDataset
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)
图像解码
默认情况下,当你迭代数据集时,图像会按顺序解码为 PIL.Image
。但是,可以使用多线程解码来显着加速数据集
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset: # up to 20 times faster !
... ...
你可以使用 num_threads
启用多线程。这对于加速远程数据流式传输特别有用。但是,对于快速磁盘上的本地数据,它可能比 num_threads=0
慢。
如果你对解码为 PIL.Image
的图像不感兴趣,并且想访问路径/字节,则可以禁用解码
>>> dataset = dataset.decode(False)
注意:IterableDataset.decode() 目前仅适用于流式数据集。
< > 在 GitHub 上更新