資料集文件
載入影像資料
並獲得增強的文件體驗
開始使用
載入圖像數據
圖像數據集具有 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 檔案。
datasetsAPI 目前不會將運算下推(push down)至 Lance 表格,因此對於較大的數據集可能會比較慢。目前,直接使用lancePython 套件將獲得更好的效能。有關使用範例,請查看 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 上更新