# Crie um conjunto de dados de malha

Existem dois métodos para criar e compartilhar um conjunto de dados em malha. Este guia mostrará como:

* Crie um conjunto de dados de malha a partir de arquivos locais em python com [Dataset.push_to_hub()](/docs/datasets/main/pt/package_reference/main_classes#datasets.Dataset.push_to_hub). Esta é uma maneira fácil que requer apenas algumas etapas em python.

* Crie um conjunto de dados de malha com `MeshFolder` e alguns metadados. Esta é uma solução sem código para criar rapidamente um conjunto de dados de malha com vários milhares de arquivos 3D.

> [!TIP]
> Você pode controlar o acesso ao seu conjunto de dados exigindo que os usuários compartilhem primeiro suas informações de contato. Consulte o guia [Conjuntos de dados com controle de acesso](https://huggingface.co/docs/hub/datasets-gated) para mais informações sobre como habilitar esse recurso no Hub.

## Arquivos locais

Você pode carregar seu próprio conjunto de dados usando os caminhos para seus arquivos de malha. Use a função [cast_column()](/docs/datasets/main/pt/package_reference/main_classes#datasets.Dataset.cast_column) para pegar uma coluna de caminhos de arquivos de malha e convertê-la para o recurso [Mesh](/docs/datasets/main/pt/package_reference/main_classes#datasets.Mesh):

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

>>> 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())
>>> mesh_dataset[0]["mesh"]
<trimesh.Scene(len(geometry)=33)>
```

Em seguida, envie o conjunto de dados para o Hugging Face Hub usando [Dataset.push_to_hub()](/docs/datasets/main/pt/package_reference/main_classes#datasets.Dataset.push_to_hub):

```py
mesh_dataset.push_to_hub("<username>/my_dataset")
```

Isso criará um repositório de dataset contendo seu dataset de malha:

```text
my_dataset/README.md
my_dataset/data/train-00000-of-00001.parquet
```

## MeshFolder

O `MeshFolder` é um construtor de dataset projetado para carregar rapidamente um dataset de malhas com vários milhares de arquivos de malha, sem exigir que você escreva nenhum código.

> [!TIP]
> Dê uma olhada na [hierarquia do padrão Split](repository_structure#split-pattern-hierarchy) para saber mais sobre como o `MeshFolder` cria divisões de conjunto de dados com base na estrutura do repositório do seu conjunto de dados.

`MeshFolder` infere automaticamente os rótulos de classe do seu conjunto de dados com base no nome do diretório. Armazene seu conjunto de dados em uma estrutura de diretórios como:

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

Se o conjunto de dados seguir a estrutura `MeshFolder`, você pode carregá-lo diretamente com [load_dataset()](/docs/datasets/main/pt/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("path/to/folder")
```

Isso é equivalente a passar `meshfolder` manualmente em [load_dataset()](/docs/datasets/main/pt/package_reference/loading_methods#datasets.load_dataset) e o diretório em `data_dir`:

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

Você também pode usar `meshfolder` para carregar conjuntos de dados que envolvem múltiplas divisões. Para isso, o diretório do seu conjunto de dados deve ter a seguinte estrutura:

```text
folder/train/diya/brass_diya.glb
folder/train/kalash/copper_kalash.glb
folder/test/diya/clay_diya.ply
folder/test/kalash/temple_kalash.stl
```

> [!WARNING]
> Se todos os arquivos de malha estiverem em um único diretório ou se não estiverem no mesmo nível da estrutura de diretórios, a coluna `label` não será adicionada automaticamente. Se você precisar dela, defina `drop_labels=False` explicitamente.

Se houver informações adicionais que você deseja incluir sobre seu conjunto de dados, como legendas de texto ou metadados de ativos 3D, adicione-as como um arquivo `metadata.csv` na sua pasta. Você também pode usar um arquivo JSONL `metadata.jsonl` ou um arquivo Parquet `metadata.parquet`.

```text
folder/train/metadata.csv
folder/train/0001.glb
folder/train/0002.ply
folder/train/0003.stl
```

Você também pode compactar seus arquivos de malha em um arquivo zip, e, nesse caso, cada arquivo zip deve conter tanto os arquivos de malha quanto os metadados.

```text
folder/train.zip
folder/test.zip
folder/validation.zip
```

O seu arquivo `metadata.csv` deve ter um campo `file_name` ou `*_file_name` que vincule os arquivos de malha aos seus metadados:

```csv
file_name,caption
0001.glb,A brass diya with a small bowl and raised wick holder
0002.ply,A copper kalash with a rounded body and narrow neck
0003.stl,A carved jharokha window with an arched frame
```

ou usando `metadata.jsonl`:

```jsonl
{"file_name": "0001.glb", "caption": "A brass diya with a small bowl and raised wick holder"}
{"file_name": "0002.ply", "caption": "A copper kalash with a rounded body and narrow neck"}
{"file_name": "0003.stl", "caption": "A carved jharokha window with an arched frame"}
```

Aqui, o `file_name` deve ser o nome do arquivo de malha ao lado do arquivo de metadados. Mais geralmente, deve ser o caminho relativo do diretório que contém os metadados até o arquivo de malha.

É possível apontar para mais de uma malha em cada linha do seu conjunto de dados, por exemplo, se tanto a sua entrada quanto a sua saída forem arquivos de malha:

```jsonl
{"input_file_name": "0001.glb", "output_file_name": "0001_output.glb"}
{"input_file_name": "0002.ply", "output_file_name": "0002_output.ply"}
{"input_file_name": "0003.stl", "output_file_name": "0003_output.stl"}
```

Você também pode definir listas de malhas. Nesse caso, é necessário nomear o campo `file_names` ou `*_file_names`. Aqui está um exemplo:

```jsonl
{"parts_file_names": ["0001_bowl.glb", "0001_wick_holder.glb"], "label": "diya"}
{"parts_file_names": ["0002_body.ply", "0002_neck.ply"], "label": "kalash"}
{"parts_file_names": ["0003_frame.stl", "0003_arch.stl"], "label": "jharokha"}
```

### Legendação de malha

Conjuntos de dados de legendas de malhas possuem texto descrevendo uma malha 3D. Um exemplo de `metadata.csv` pode ser:

```csv
file_name,text
0001.glb,A brass diya with a small bowl and raised wick holder
0002.ply,A copper kalash with a rounded body and narrow neck
0003.stl,A carved jharokha window with an arched frame
```

Carregue o conjunto de dados com `MeshFolder` e ele criará uma coluna `text` para as legendas das malhas:

```py
>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"A brass diya with a small bowl and raised wick holder"
```

### Enviar o conjunto de dados para o Hub

Depois de criar um conjunto de dados, você pode compartilhá-lo no Hub com o método [push_to_hub()](/docs/datasets/main/pt/package_reference/main_classes#datasets.DatasetDict.push_to_hub). Certifique-se de que a biblioteca [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) está instalada e de que você está conectado à sua conta do Hugging Face (veja o [tutorial de upload com Python](upload_dataset#upload-with-python) para mais detalhes).

Envie seu conjunto de dados com [push_to_hub()](/docs/datasets/main/pt/package_reference/main_classes#datasets.DatasetDict.push_to_hub):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("meshfolder", data_dir="/path/to/folder", split="train")
>>> dataset.push_to_hub("username/my-mesh-captioning-dataset")
```

