Datasets documentation
Загрузка данных сетки
Загрузка данных сетки
Наборы данных Mesh имеют столбцы типа 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(), чтобы принять столбец с путями к файлам мешей и декодировать его в объект trimesh с фичей Mesh:
>>> 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)>Если вам нужно загрузить только базовый путь или байты набора данных меша без декодирования объекта меша, установите decode=False в фиче Mesh:
>>> 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")Для локальных наборов данных это эквивалентно ручной передаче meshfolder в load_dataset() и указанию каталога в data_dir:
>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder")Затем вы можете обращаться к сеткам как к объектам trimesh:
>>> dataset["train"][0]
{"mesh": <trimesh.Scene(len(geometry)=33)>, "label": 0}Чтобы игнорировать информацию в файле метаданных, установите drop_metadata=True в load_dataset():
>>> 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