Pular para o conteúdo principal
Fase 4 · Capítulo 20 · Prática

20. Preparando o dataset VLA do SO-ARM

Capítulo 20 do curso para iniciantes em SO-ARM Physical AI — transforme um dataset LeRobot da Fase 3 num dataset VLA pronto para o GR00T: anotações de linguagem, meta/modality.json, a etiqueta new_embodiment e a configuração so100_dualcam, checagem de dimensões e organização multitarefa.

20.1 Pré-requisitos​

Pré-requisitos

20.1 Pré-requisitos

Você precisa de:

  • Um dataset limpo da Fase 3 gravado no SO-ARM (Capítulos 11-13): duas vistas (front + side), 50+ episódios, uma tarefa por episódio, qualidade conferida;
  • O repositório Isaac-GR00T clonado na máquina de treino (o Capítulo 21 instala o ambiente completo — este capítulo só edita arquivos do dataset);
  • A receita oficial de referência: Ajustar o GR00T N1.5 no SO101.
dica

Seu dataset ACT existente é a matéria-prima — o GR00T reutiliza os mesmos episódios LeRobot. Este capítulo só acrescenta os metadados de linguagem e modalidade.

20.2 Conferir o dataset LeRobot​

Conferência

20.2 Conferir o dataset LeRobot

Estrutura do diretório​

~/.cache/huggingface/lerobot/seeedstudio123/test/
├── meta/
│ ├── info.json ← fps, features, chaves de câmera
│ ├── tasks.jsonl ← descrições de tarefa (edite aqui!)
│ ├── episodes/... ← metadados por episódio
│ └── stats/... ← estatísticas de normalização
├── data/ ← quadros parquet
└── videos/ ← fluxos de câmera

Checagem rápida com Python​

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("seeedstudio123/test", root="~/.cache/huggingface/lerobot")
print(ds.meta.info) # fps, features
print(ds[0]["observation.state"].shape) # esperado torch.Size([6])
print(ds[0]["action"].shape) # esperado torch.Size([6])

Checklist obrigatório​

  • observation.state e action com 6 dimensões (5 juntas + garras);
  • Exatamente duas features de imagem, ex.: observation.images.front / observation.images.side;
  • Cada episódio pertence a uma tarefa com descrição significativa;
  • Episódios quebrados conhecidos removidos (Capítulo 13).

20.3 Adicionar descrições de tarefa em linguagem​

Linguagem

20.3 Adicionar descrições de tarefa em linguagem

Método A: escrever direto ao gravar (recomendado)​

Se gravar um dataset novo para a Fase 4, ligue a instrução na gravação com o mesmo --dataset.single_task que você já usa:

--dataset.single_task="Pick up the block at point A and place it at point B"

Uma tarefa = uma frase curta começando por verbo — ela vai sozinha para os metadados da tarefa.

Método B: preencher meta/tasks.jsonl depois​

Para um dataset existente, edite o meta/tasks.jsonl para que cada índice mapeie a uma instrução adequada. Mantenha o mapeamento estável: o modelo aprende essas strings exatas.

Diretrizes de anotação​

  1. Uma tarefa = uma frase fixa; nunca duas redações para a mesma;
  2. Começar por verbo e ser concreto: "Coloque o bloco na caixa" é melhor que "manuseio do bloco";
  3. Chinês ou inglês servem — o VLM do GR00T entende ambos — mas não misture idiomas dentro de uma tarefa.

20.4 Criar o meta/modality.json​

Modalidade

20.4 Criar o meta/modality.json

O modality.json diz ao GR00T quais campos do dataset alimentam quais entradas do modelo. O layout padrão de duas câmeras do SO-ARM corresponde à configuração oficial so100_dualcam; o equivalente mínimo para um dataset local:

{
"state": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"action": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"video": {
"front": "observation.images.front",
"side": "observation.images.side"
},
"annotation": {
"human.task_description": "task_description"
}
}

Descrição dos campos​

CampoSignificado
state.single_armFatia [início, fim) do observation.state para as 5 juntas
state.gripperFatia da garras
action.*As mesmas fatias no vetor action
videoChave de câmera → feature do dataset (deve casar letra por letra com o gravado)
annotation.human.task_descriptionDe onde vem a instrução (chave recomendada do Capítulo 18)
nota

A configuração so100_dualcam do repositório Isaac-GR00T é a versão canônica deste arquivo — se o seu layout segue o padrão (duas câmeras, estado/ação de 6), é melhor passar --data-config so100_dualcam no treino do que manter uma cópia à mão.

20.5 Definir a etiqueta de embodiment​

Embodiment

20.5 Definir a etiqueta de embodiment

O SO-ARM é ajustado como embodiment novo: etiqueta new_embodiment. Ela raramente é escrita no próprio dataset — é argumento de treino/inferência (Capítulo 21: --embodiment-tag new_embodiment no serviço; a receita SO101 define no treino).

O que importa no dataset é a configuração de dados bater com a realidade: duas câmeras e estado/ação de 6, conforme verificado em 20.2.

20.6 Verificar ordem de juntas e dimensões​

Verificação

20.6 Verificar ordem de juntas e dimensões

Passo 1: imprimir os metadados​

Confirme a lista de features e dimensões (ver 20.2): estado/ação 6/6, duas features de imagem.

Passo 2: conferir as fatias de modalidade​

Se escreveu um modality.json próprio, as fatias devem cobrir exatamente [0,6), sem buracos nem sobreposições.

Passo 3: visualizar​

lerobot-dataset-viz \
--repo-id seeedstudio123/test \
--mode local \
--episode-index 0

Confira: imagens das câmeras certas, a garras abrindo/fechando ao agarrar, juntas movendo em ordem plausível.

Passo 4: checagem estatística​

meta/stats: mínimos/máximos do estado dentro do intervalo calibrado; brilho médio das imagens longe de 0 ou 255 (gravações pretas ou estouradas).

20.7 Organização multitarefa​

Multitarefa

20.7 Organização multitarefa

Método A: mesmo repo_id, vários task_index (recomendado)​

Grave várias tarefas num dataset; cada episódio guarda seu task_index, e o tasks.jsonl mapeia cada índice à sua instrução. Essa é a forma natural do ajuste condicionado a linguagem.

Método B: mesclar vários datasets​

Mescle datasets por tarefa com o kit do Capítulo 13 (--operation.type merge). Requisitos: configuração de câmera idêntica, layout robô/features idêntico e frases de tarefa distintas e consistentes por origem.

Volumes recomendados​

CenárioEpisódiosNotas
Tarefa única, A→B fixo~50Validar o fluxo de ajuste
Tarefa única, posições variadas50-100O volume padrão da Fase 3
Multitarefa (3-5 tarefas)50-100 por tarefaO condicionamento exige cobertura por tarefa

20.8 Checklist de qualidade​

Checklist

20.8 Checklist de qualidade

  • Cada episódio com uma instrução correta e única;
  • Chaves de câmera do modality.json idênticas às features do dataset, caractere por caractere;
  • state / action com 6 dimensões e fatias corretas (single_arm / gripper);
  • Episódios falhos e atípicos apagados (Capítulo 13);
  • Estatísticas presentes (meta/stats) — nunca treine com uma sessão morta no meio;
  • Backup do dataset final antes de o Capítulo 21 mexer em qualquer coisa.

Dataset pronto — o próximo capítulo ajusta o GR00T sobre ele.

Loading Comments...