Datasets documentation

加载网格数据

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