Datasets 文件

載入影像資料

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

載入影像資料

影像資料集具有 Image 型別列,其中包含 PIL 物件。

要使用影像資料集,您需要安裝 `vision` 依賴項。請檢視安裝指南,瞭解如何安裝它。

當您載入影像資料集並呼叫影像列時,影像將解碼為 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.Images。但是,可以使用多執行緒解碼顯著加快資料集速度

>>> 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.Images 的影像不感興趣,並且希望訪問路徑/位元組,則可以停用解碼

>>> dataset = dataset.decode(False)

注意:目前 IterableDataset.decode() 僅適用於流式資料集。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.