資料集文件

載入影像資料

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

載入圖像數據

圖像數據集具有 Image 型別的欄位,其中包含 PIL 物件。

若要處理圖像數據集,您需要安裝 vision 依賴項。請查看安裝指南以了解如何安裝。

當您載入圖像數據集並呼叫圖像欄位時,這些圖像會被解碼為 PIL 圖像。

>>> from datasets import load_dataset, Image

>>> dataset = load_dataset("AI-Lab-Makerere/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("AI-Lab-Makerere/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 數據集建構器來載入數據集,這不需要編寫自定義的資料載入器(dataloader)。這使得 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

或者,它應該包含元數據(metadata),例如:

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 歸檔資料夾,適用於大型圖像數據集。由於其體積龐大,WebDatasets 通常以串流模式(使用 streaming=True)載入。

您可以像這樣載入 WebDataset:

>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)

Lance

Lance 是一種開放的多模態 Lakehouse 表格格式。Lance 表格不僅可以原生儲存文字和純量值,還可以在表格數據旁邊儲存大型二進位物件(blobs),例如圖像、音訊和影片。

Lance 將您的元數據和圖像 blobs 儲存在一起,同時仍讓您能有效地僅掃描您關心的元數據欄位,而無需載入圖像位元組。準備就緒後,您可以擷取一小部分列(包含圖像 blobs)並將其直接寫入本地檔案系統中的檔案。

from datasets import load_dataset

# Return as a Hugging Face dataset
ds = load_dataset(
    "lance-format/laion-1m",
    split="train",
    streaming=True
)

dir_name = "laion_samples"
Path(dir_name).mkdir(exist_ok=True)

for idx, row in enumerate(ds.take(3)):
    with open(f"{dir_name}/{idx}.jpg", "wb") as f:
        f.write(row["image"])

在此範例中,image 欄位包含編碼後的圖像位元組,因此您可以直接將它們寫入 .jpg 檔案。

datasets API 目前不會將運算下推(push down)至 Lance 表格,因此對於較大的數據集可能會比較慢。目前,直接使用 lance Python 套件將獲得更好的效能。有關使用範例,請查看 Hub 上的文件。

圖像解碼

預設情況下,當您迭代數據集時,圖像會被依序解碼為 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.