# メッシュデータを読み込む

メッシュデータセットには[Mesh](/docs/datasets/main/ja/package_reference/main_classes#datasets.Mesh)型の列があり、`trimesh.Trimesh`または`trimesh.Scene`オブジェクトが含まれています。

> [!TIP]
> メッシュデータセットを扱うには、`mesh`依存関係のインストールが必要です。インストール方法については、[インストール](./installation#mesh)ガイドを参照してください。

メッシュデータセットを読み込み、メッシュ列を呼び出すと、メッシュは`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)>
```

ファイルの内容に応じて、`trimesh` は `trimesh.Trimesh` オブジェクトまたは `trimesh.Scene` オブジェクトを返す場合があります。

> [!WARNING]
> 行インデックスを先に使用してメッシュデータセットにインデックスし、その後`mesh`列 - `dataset[0]["mesh"]` - を使用することで、データセット内のすべてのメッシュファイルをデコードすることを避けてください。そうしないと、データセットが大きい場合、この処理は低速で時間がかかる可能性があります。

あらゆるタイプのデータセットを読み込む方法については、一般的な読み込みガイドを参照してください。

## ローカルファイル

メッシュパスからデータセットを読み込むことができます。[cast_column()](/docs/datasets/main/ja/package_reference/main_classes#datasets.Dataset.cast_column)関数を使用してメッシュファイルパスの列を受け入れ、[Mesh](/docs/datasets/main/ja/package_reference/main_classes#datasets.Mesh)機能で`trimesh`オブジェクトにデコードします:

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

メッシュオブジェクトのデコードを行わず、メッシュデータセットの基底パスまたはバイトのみを読み込みたい場合は、[Mesh](/docs/datasets/main/ja/package_reference/main_classes#datasets.Mesh)機能で`decode=False`を設定します:

```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'}
```

[Mesh](/docs/datasets/main/ja/package_reference/main_classes#datasets.Mesh)機能は、`.glb`、`.ply`、および`.stl`ファイルをサポートしています。ファイルの内容に応じて、`trimesh`は`trimesh.Trimesh`オブジェクトまたは`trimesh.Scene`オブジェクトを返す場合があります。

## MeshFolder

`MeshFolder` データセットビルダーを使用して、カスタムdataloaderの作成を必要とせずにデータセットを読み込むこともできます。これにより、`MeshFolder` は、数千の3Dファイルからなるメッシュデータセットを素早く作成・読み込むのに有用になります。メッシュデータセットの構造は次のようになるべきです:

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

データセットが`MeshFolder`構造に従っている場合、[load_dataset()](/docs/datasets/main/ja/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")
```

ローカルデータセットの場合、これは`meshfolder`を手動で`data_dir`のディレクトリに渡すのと同等であり、[load_dataset()](/docs/datasets/main/ja/package_reference/loading_methods#datasets.load_dataset)で指定することになります:

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

その後、メッシュを`trimesh`オブジェクトとしてアクセスできます:

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

メタデータファイル内の情報を無視するには、[load_dataset()](/docs/datasets/main/ja/package_reference/loading_methods#datasets.load_dataset)で`drop_metadata=True`を設定します:

```py
>>> from datasets import load_dataset

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

メタデータファイルがない場合、`MeshFolder`はディレクトリ名からラベル名を自動的に推測します。自動作成されたラベルを削除したい場合は、`drop_labels=True`を設定してください。この場合、データセットにはメッシュ列のみが含まれます。

```py
>>> from datasets import load_dataset

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

最後に、`filters` 引数を使用すると、ラベルまたはメタデータに対する条件に基づいて、データセットの一部のみを読み込むことができます。メタデータが Parquet 形式である場合、この形式は高速なフィルタリングを可能にするため、特に有用です。また、デフォルトではフィルタリングの前にデータセット全体がダウンロードされるため、`streaming=True` と組み合わせてこの引数を使用することをお勧めします。

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

> [!TIP]
> 独自の`MeshFolder`データセットを作成する方法の詳細については、[メッシュデータセットの作成](./mesh_dataset)ガイドをご覧ください。

## メッシュデコーディング

デフォルトでは、データセットを反復処理する際、メッシュは`trimesh.Trimesh`または`trimesh.Scene`オブジェクトとして逐次的にデコードされます。

`trimesh` オブジェクトとしてデコードされたメッシュに関心がない場合、代わりにパスやバイトにアクセスしたい場合は、デコードを無効化できます。

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

注: [IterableDataset.decode()](/docs/datasets/main/ja/package_reference/main_classes#datasets.IterableDataset.decode) は現在、ストリーミングデータセットでのみ利用可能です。

