Datasets documentation

加载网格数据

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

加载网格数据

网格数据集包含 Mesh 类型的列,其中包含 trimesh.Trimesh 或 trimesh.Scene 对象。

要处理网格数据集,您需要安装 mesh 依赖项。请参阅 安装 指南了解如何安装。

加载网格数据集并调用网格列时,网格会通过trimesh进行解码:

>>> from datasets import load_dataset, Mesh

>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train")
>>> dataset[0]["mesh"]
<trimesh.Scene(len(geometry)=33)>

根据文件内容,trimesh 可能返回一个 trimesh.Trimesh 对象或一个 trimesh.Scene 对象。

使用行索引先索引到网格数据集,然后索引到 mesh 列 - dataset[0]["mesh"] - 以避免解码数据集中的所有网格文件。否则,如果数据集较大,这可能是一个缓慢且耗时的过程。

有关如何加载任意类型数据集的指南,请参阅通用加载指南。

本地文件

您可以从网格路径加载数据集。使用 cast_column() 函数接受一列网格文件路径,并使用 Mesh 特征将其解码为 trimesh 对象:

>>> from datasets import Dataset, Mesh

>>> dataset = Dataset.from_dict({"mesh": ["path/to/model_1.glb", "path/to/model_2.ply", "path/to/model_3.stl"]}).cast_column("mesh", Mesh())
>>> dataset[0]["mesh"]
<trimesh.Scene(len(geometry)=33)>

如果只想加载网格数据集的底层路径或字节,而不解码网格对象,请在 Mesh 特征中设置 decode=False:

>>> dataset = load_dataset("VINAY-UMRETHE/My-Mesh-Dataset", split="train").cast_column("mesh", Mesh(decode=False))
>>> dataset[0]["mesh"]
{'bytes': b'...',
 'path': '00001.glb'}

Mesh 功能支持 .glb、.ply 和 .stl 文件。根据文件内容,trimesh 可能返回 trimesh.Trimesh 对象或 trimesh.Scene 对象。

MeshFolder

您也可以通过 MeshFolder 数据集构建器加载数据集,这无需编写自定义的数据加载器。这使得 MeshFolder 非常适合快速创建和加载包含数千个 3D 文件的网格数据集。您的网格数据集结构应如下所示:

folder/train/diya/brass_diya.glb
folder/train/diya/clay_diya.ply
folder/train/diya/festival_diya.stl

folder/train/kalash/copper_kalash.glb
folder/train/kalash/pooja_kalash.ply
folder/train/kalash/temple_kalash.stl

如果数据集遵循 MeshFolder 结构,则可以直接使用 load_dataset() 加载:

>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")

对于本地数据集,这相当于在 load_dataset() 中手动传入 meshfolder 以及 data_dir 中的目录:

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

然后,您可以将网格作为 trimesh 对象进行访问:

>>> dataset["train"][0]
{"mesh": <trimesh.Scene(len(geometry)=33)>, "label": 0}

若要忽略元数据文件中的信息,请在 load_dataset() 中设置 drop_metadata=True:

>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)

如果没有元数据文件,MeshFolder 会自动从目录名称推断标签名称。 如果要丢弃自动创建的标签,请设置 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)

有关创建自定义 MeshFolder 数据集的更多信息,请参阅 创建网格数据集 指南。

网格解码

默认情况下,当您在数据集上迭代时,网格会按顺序解码为 trimesh.Trimesh 或 trimesh.Scene 对象。

如果您对解码为 trimesh 对象的网格不感兴趣,而是希望访问其路径或字节数据,则可以禁用解码:

>>> dataset = dataset.decode(False)

注意:IterableDataset.decode() 目前仅适用于流式数据集。

Update on GitHub