Datasets 文档

创建图像数据集

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

创建图像数据集

有两种方法可以创建和分享图像数据集。本指南将向您展示如何:

  • 使用 Python 中的本地文件和 Dataset.push_to_hub() 创建图像数据集。这是一种简单的方法,在 Python 中只需几个步骤即可完成。

  • 使用 ImageFolder 和一些元数据创建图像数据集。这是一个无需编写代码的解决方案,可以快速创建包含数千张图像的数据集。

您可以通过要求用户先分享他们的联系信息来控制对数据集的访问。请查看 受保护的数据集 指南,了解更多关于如何在 Hub 上启用此功能的信息。

ImageFolder

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

如果数据集遵循 ImageFolder 结构,那么您可以直接使用 load_dataset() 加载它

>>> from datasets import load_dataset

>>> dataset = load_dataset("path/to/folder")

这等同于在 load_dataset() 中手动传递 imagefolder,并在 data_dir 中指定目录

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")

您也可以使用 imagefolder 来加载包含多个切分的数据集。为此,您的数据集目录应具有以下结构

folder/train/dog/golden_retriever.png
folder/train/cat/maine_coon.png
folder/test/dog/german_shepherd.png
folder/test/cat/bengal.png

如果所有图像文件都包含在单个目录中,或者它们不在同一级别的目录结构中,`label` 列将不会自动添加。如果需要它,请显式设置 `drop_labels=False`。

如果您想包含有关数据集的其他信息,例如文本标题或边界框,请将其作为 `metadata.csv` 文件添加到您的文件夹中。这使您可以快速为不同的计算机视觉任务(如文本字幕或目标检测)创建数据集。您还可以使用 JSONL 文件 `metadata.jsonl` 或 Parquet 文件 `metadata.parquet`。

folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.png

您也可以压缩您的图像,在这种情况下,每个 zip 文件应包含图像和元数据

folder/train.zip
folder/test.zip
folder/validation.zip

您的 `metadata.csv` 文件必须有一个 `file_name` 或 `*_file_name` 字段,用于将图像文件与其元数据链接起来

file_name,additional_feature
0001.png,This is a first value of a text feature you added to your images
0002.png,This is a second value of a text feature you added to your images
0003.png,This is a third value of a text feature you added to your images

或使用 metadata.jsonl

{"file_name": "0001.png", "additional_feature": "This is a first value of a text feature you added to your images"}
{"file_name": "0002.png", "additional_feature": "This is a second value of a text feature you added to your images"}
{"file_name": "0003.png", "additional_feature": "This is a third value of a text feature you added to your images"}

这里的 `file_name` 必须是元数据文件旁边图像文件的名称。更一般地说,它必须是从包含元数据的目录到图像文件的相对路径。

可以在数据集的每一行中指向多张图像,例如,如果您的输入和输出都是图像:

{"input_file_name": "0001.png", "output_file_name": "0001_output.png"}
{"input_file_name": "0002.png", "output_file_name": "0002_output.png"}
{"input_file_name": "0003.png", "output_file_name": "0003_output.png"}

您还可以定义图像列表。在这种情况下,您需要将字段命名为 `file_names` 或 `*_file_names`。下面是一个例子

{"frames_file_names": ["0001_t0.png", "0001_t1.png"], label: "moving_up"}
{"frames_file_names": ["0002_t0.png", "0002_t1.png"], label: "moving_down"}
{"frames_file_names": ["0003_t0.png", "0003_t1.png"], label: "moving_right"}

图像字幕

图像字幕数据集包含描述图像的文本。一个 `metadata.csv` 的例子可能如下所示

file_name,text
0001.png,This is a golden retriever playing with a ball
0002.png,A german shepherd
0003.png,One chihuahua

使用 ImageFolder 加载数据集,它将为图像字幕创建一个 `text` 列

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"This is a golden retriever playing with a ball"

目标检测

目标检测数据集包含识别图像中物体的边界框和类别。一个示例 `metadata.jsonl` 可能如下所示:

{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}}
{"file_name": "0002.png", "objects": {"bbox": [[810.0, 100.0, 57.0, 28.0]], "categories": [1]}}
{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}}

使用 ImageFolder 加载数据集,它将创建一个 `objects` 列,其中包含边界框和类别

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["objects"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}

将数据集上传到 Hub

创建数据集后,您可以使用 push_to_hub() 方法将其分享到 Hub。请确保您已安装 huggingface_hub 库并已登录到您的 Hugging Face 帐户(有关更多详细信息,请参阅使用 Python 上传教程)。

使用 push_to_hub() 上传您的数据集

>>> from datasets import load_dataset

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset")

WebDataset

WebDataset 格式基于 TAR 归档,适用于大型图像数据集。实际上,您可以将图像分组到 TAR 归档中(例如,每个 TAR 归档 1GB 的图像),并拥有数千个 TAR 归档

folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...

在归档文件中,每个示例由共享相同前缀的文件组成

e39871fd9fd74f55.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.jpg
f18b91585c4d3f3e.json
ede6e66b2fb59aab.jpg
ede6e66b2fb59aab.json
ed600d57fcee4f94.jpg
ed600d57fcee4f94.json
...

您可以使用 JSON 或文本文件等方式来存放您的图像标签/字幕/边界框。

加载您的 WebDataset,它会为每个文件后缀(这里是“jpg”和“json”)创建一个列

>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train")
>>> dataset[0]["json"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}

每个样本也可以包含多张图片,像这样

e39871fd9fd74f55.input.jpg
e39871fd9fd74f55.output.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.input.jpg
f18b91585c4d3f3e.output.jpg
f18b91585c4d3f3e.json
...

有关 WebDataset 格式和 Python 库的更多详情,请查阅 WebDataset 文档

< > 在 GitHub 上更新