# Tải dữ liệu lưới

Bộ dữ liệu Mesh có các cột kiểu [Mesh](/docs/datasets/main/vi/package_reference/main_classes#datasets.Mesh), chứa các đối tượng `trimesh.Trimesh` hoặc `trimesh.Scene`.

> [!TIP]
> Để làm việc với bộ dữ liệu lưới (mesh), bạn cần cài đặt phụ thuộc `mesh`. Xem hướng dẫn [cài đặt](./installation#mesh) để biết cách cài đặt.

Khi bạn tải một bộ dữ liệu lưới và gọi cột lưới, các lưới sẽ được giải mã bằng `trimesh`:

```py
>>> from datasets import load_dataset, Mesh

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

Tùy thuộc vào nội dung tệp, `trimesh` có thể trả về một đối tượng `trimesh.Trimesh` hoặc một đối tượng `trimesh.Scene`.

> [!WARNING]
> Truy cập vào bộ dữ liệu lưới bằng chỉ số hàng trước, sau đó là cột `mesh` - `dataset[0]["mesh"]` - để tránh việc giải mã tất cả các tệp lưới trong bộ dữ liệu. Nếu không, đây có thể là một quy trình chậm và tốn thời gian nếu bạn có một bộ dữ liệu lớn.

Để tìm hiểu cách tải bất kỳ loại tập dữ liệu nào, hãy xem hướng dẫn tải chung.

## Tệp cục bộ

Bạn có thể tải một tập dữ liệu từ các đường dẫn mesh. Sử dụng hàm [cast_column()](/docs/datasets/main/vi/package_reference/main_classes#datasets.Dataset.cast_column) để nhận một cột chứa các đường dẫn tệp mesh, và giải mã nó thành một đối tượng `trimesh` với tính năng [Mesh](/docs/datasets/main/vi/package_reference/main_classes#datasets.Mesh):

```py
>>> 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)>
```

Nếu bạn chỉ muốn tải đường dẫn hoặc byte cơ bản của bộ dữ liệu lưới mà không giải mã đối tượng lưới, hãy đặt `decode=False` trong tính năng [Mesh](/docs/datasets/main/vi/package_reference/main_classes#datasets.Mesh):

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

Tính năng [Mesh](/docs/datasets/main/vi/package_reference/main_classes#datasets.Mesh) hỗ trợ các tệp `.glb`, `.ply` và `.stl`. Tùy thuộc vào nội dung tệp, `trimesh` có thể trả về một đối tượng `trimesh.Trimesh` hoặc một đối tượng `trimesh.Scene`.

## MeshFolder

Bạn cũng có thể tải một dataset bằng trình tạo dataset `MeshFolder`, không yêu cầu viết dataloader tùy chỉnh. Điều này khiến `MeshFolder` hữu ích để nhanh chóng tạo và tải các dataset mesh với vài nghìn tệp 3D. Cấu trúc dataset mesh của bạn nên trông như sau:

```text
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
```

Nếu bộ dữ liệu tuân theo cấu trúc `MeshFolder`, bạn có thể tải nó trực tiếp bằng [load_dataset()](/docs/datasets/main/vi/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

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

Đối với các bộ dữ liệu cục bộ, điều này tương đương với việc truyền `meshfolder` thủ công trong [load_dataset()](/docs/datasets/main/vi/package_reference/loading_methods#datasets.load_dataset) và thư mục trong `data_dir`:

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

Sau đó, bạn có thể truy cập các lưới dưới dạng các đối tượng `trimesh`:

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

Để bỏ qua thông tin trong tệp metadata, đặt `drop_metadata=True` trong [load_dataset()](/docs/datasets/main/vi/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

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

Nếu bạn không có tệp metadata, `MeshFolder` sẽ tự động suy ra tên nhãn từ tên thư mục. Nếu bạn muốn loại bỏ các nhãn được tạo tự động, hãy đặt `drop_labels=True`. Trong trường hợp này, tập dữ liệu của bạn sẽ chỉ chứa một cột mesh:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
```

Cuối cùng, đối số `filters` cho phép bạn chỉ tải một tập con của bộ dữ liệu, dựa trên điều kiện về nhãn hoặc metadata. Điều này đặc biệt hữu ích nếu metadata ở định dạng Parquet, vì định dạng này cho phép lọc nhanh. Cũng nên sử dụng đối số này cùng với `streaming=True`, vì mặc định bộ dữ liệu sẽ được tải xuống hoàn toàn trước khi lọc.

```python
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
```

> [!TIP]
> Để biết thêm thông tin về việc tạo bộ dữ liệu `MeshFolder` của riêng bạn, hãy xem hướng dẫn [Tạo bộ dữ liệu mesh](./mesh_dataset).

## Giải mã lưới

Mặc định, các lưới (mesh) được giải mã tuần tự dưới dạng các đối tượng `trimesh.Trimesh` hoặc `trimesh.Scene` khi bạn lặp qua một tập dữ liệu.

Nếu bạn không quan tâm đến các lưới được giải mã dưới dạng đối tượng `trimesh` và muốn truy cập đường dẫn hoặc bytes thay vào đó, bạn có thể tắt giải mã:

```python
>>> dataset = dataset.decode(False)
```

Lưu ý: [IterableDataset.decode()](/docs/datasets/main/vi/package_reference/main_classes#datasets.IterableDataset.decode) hiện chỉ khả dụng cho các bộ dữ liệu dạng streaming.

