Referência da REST API#
A Ultralytics Platform fornece uma REST API para acesso programático a conjuntos de dados, imagens, projetos, modelos, treino, exportações e implementações.

# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/datasets/YOUR_USERNAMECada endpoint abaixo lista a chamada client.<resource>.<method>(...) do SDK ultralytics-platform, que é gerado a partir do mesmo contrato que esta referência.
Esta página é um guia da API. A referência gerada e sempre atualizada está disponível em platform.ultralytics.com/api/docs, e o documento OpenAPI 3.2 legível por máquina que a alimenta é publicado em platform.ultralytics.com/openapi.json. Ambos são gerados diretamente a partir do contrato do lado do servidor, portanto são a autoridade sempre que esta página e o esquema divergirem.
Visão geral da API#
A API está organizada em torno dos principais recursos da Platform:
graph LR
A[API Key]:::start --> B[Datasets]:::proc
A --> C[Projects]:::proc
B -->|images| G[Images]:::proc
C -->|contains| D[Models]:::proc
B -->|train on| D
D -->|deploy| E[Deployments]:::proc
D -->|export| F[Exports]:::proc
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff| Recurso | Descrição | Operações principais |
|---|---|---|
| Conjuntos de dados | Coleções de imagens anotadas | CRUD, ingestão, versões, classes, divisões, clonagem |
| Imagens | Imagens individuais e anotações | Ler, anotar, mover divisão, eliminar, anotar automaticamente |
| Projetos | Espaços de trabalho de modelos | CRUD, clonagem |
| Modelos | Checkpoints treinados | CRUD, prever, transferir, clonar, estado do treino |
| Treino | Tarefas de treino na GPU na nuvem | Disponibilidade da GPU, iniciar, progresso, cancelar |
| Exportações | Tarefas de conversão de formato | Criar, listar, estado, cancelar |
| Implementações | Endpoints de inferência dedicados | Criar, iniciar/parar/substituir, prever, métricas, registos |
| Lixo | Recursos eliminados logicamente | Listar, restaurar, eliminar permanentemente |
| Armazenamento | Integrações de armazenamento na nuvem | Ligar, descobrir, navegar, desligar |
| Conta | Plano, créditos, armazenamento, perfil | Resumo da conta, chaves da API, utilização do armazenamento, pesquisa de utilizadores |
| Faturação | Utilização do plano e livro-razão | Resumo da utilização, transações |
| Explorar | Pesquisa de conteúdo público | Pesquisar projetos e conjuntos de dados |
Autenticação#
A maioria dos endpoints requer uma chave da API. Os endpoints que disponibilizam conteúdo público — ler um conjunto de dados, projeto ou modelo público, listar imagens de um conjunto de dados público, executar inferência num modelo público ou pesquisar em Explorar — também aceitam pedidos anónimos e simplesmente devolvem mais resultados quando é fornecida uma chave.
Obter uma chave da API#
- Acede a
Settings>API Keys - Clica em
Create Key - Copia a chave gerada
Consulta Chaves da API para obter instruções detalhadas.
Cabeçalho de autorização#
Inclui a tua chave da API como token bearer:
Authorization: Bearer YOUR_API_KEYAs chaves da API são constituídas pelo prefixo literal ul_ seguido de 40 caracteres hexadecimais, num total de 43 caracteres (por exemplo, ul_a1b2c3d4e5f6789012345678901234567890abcd). Os pedidos com um cabeçalho em falta, uma chave malformada ou uma chave revogada devolvem 401. Mantém a tua chave secreta -- nunca a submetas ao controlo de versões nem a partilhes publicamente.
Exemplo#
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/account/summaryURL base#
Todos os endpoints da API utilizam:
https://platform.ultralytics.com/apiCaminhos dos recursos#
Os recursos são identificados pelos mesmos nomes legíveis por humanos que aparecem nos URLs da Platform, e não por IDs de base de dados:
| Recurso | Caminho | Exemplo |
|---|---|---|
| Conjunto de dados | /api/datasets/{owner}/{dataset} | /api/datasets/acme-vision/warehouse |
| Projeto | /api/projects/{owner}/{project} | /api/projects/acme-vision/inspection |
| Modelo | /api/models/{owner}/{project}/{model} | /api/models/acme-vision/inspection/v3 |
| Implementação | /api/deployments/{owner}/{deployment} | /api/deployments/acme-vision/edge-1 |
| Imagem | /api/images/{imageId} | /api/images/65f1c0a2b3d4e5f601234567 |
{owner}é um nome de utilizador pessoal ou identificador de espaço de trabalho de uma equipa: 4–32 caracteres alfanuméricos em minúsculas, com hífenes únicos entre segmentos.{dataset},{project},{model}e{deployment}seguem o mesmo padrão de minúsculas com hífenes, até 128 caracteres.{imageId}e{exportId}são IDs hexadecimais de 24 caracteres devolvidos pela API.- Mudar o nome de um recurso através de
PATCHaltera simultaneamente onameapresentado e o nome no URL, e a resposta devolve o nome atual no URL para que possas continuar a utilizá-lo.
Não existe nenhum parâmetro de consulta owner. Os caminhos com escopo de espaço de trabalho incluem o proprietário no caminho, e os endpoints com escopo de conta (/api/account/summary, /api/api-keys, /api/storage, /api/billing/*, /api/trash, /api/integrations/buckets) operam no espaço de trabalho que emitiu a chave da API. Para agir num espaço de trabalho de equipa, utiliza uma chave da API criada nesse espaço de trabalho.
Limites de frequência#
A API aplica limites de janela deslizante por chave da API. Cada rota pertence a uma categoria, e cada categoria tem um contador independente, por isso 20 pedidos de previsão não consomem o teu limite predefinido.
| Categoria | Limite | Aplica-se a |
|---|---|---|
| Predefinido | 100 pedidos/min | Todas as rotas não listadas abaixo |
| Training | 10 pedidos/min | POST /api/training/start |
| Carregar | 10 pedidos/min | URLs de carregamento assinadas, conclusão de carregamentos e ingestão de conjuntos de dados |
| Previsão | 20 pedidos/min | Inferência de modelos e implementações através das rotas da API da Platform |
| Exportar | 20 pedidos/min | Rotas de exportação de modelos e rotas de exportação/versão de conjuntos de dados, exceto a leitura de uma exportação de conjunto de dados (GET), que usa o limite padrão |
| Download | 30 pedidos/min | Transferências de ficheiros de modelos |
| Mutação | 10 pedidos/min | Listagem de chaves da API, ligação ou descoberta de armazenamento na nuvem e ações PATCH de implementações |
| Hidratação | 20 pedidos/min | POST /api/datasets/{owner}/{dataset}/images (busca de um conjunto selecionado de imagens) e GET /api/images/{imageId}/similar |
| Agrupamento | 10 pedidos/min | GET /api/datasets/{owner}/{dataset}/images/clustering e GET /api/models/{owner}/{project}/{model}/similar-images |
As rotas da Platform exclusivas do navegador, como o checkout da faturação e a gestão de equipas, têm os seus próprios limites, que não se aplicam ao tráfego de chaves da API.
Quando sofre limitação, a API devolve 429 com cabeçalhos e um corpo JSON:
Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z{
"error": "Rate limit exceeded",
"retryAfter": 12,
"resetAt": "2026-02-21T12:34:56.000Z"
}Endpoints dedicados (ilimitados)#
Os endpoints dedicados não estão sujeitos aos limites de taxa das chaves da API da Platform quando chamas diretamente o serviceUrl próprio da implementação (por exemplo, https://predict-abc123.run.app/predict). Nesse caso, o débito depende da configuração do serviço implementado.
Quando receberes um 429, aguarda Retry-After segundos (ou até X-RateLimit-Reset) antes de tentar novamente. Consulta as perguntas frequentes sobre limites de taxa para obter uma implementação de recuo exponencial.
Formato da resposta#
Respostas de sucesso#
As respostas são objetos JSON com campos específicos de cada recurso. Não existe um envelope genérico: os endpoints de listagem devolvem uma coleção nomeada juntamente com contagens, e as mutações devolvem os identificadores alterados.
{
"datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
"total": 1,
"region": "us"
}As respostas que contêm dados também incluem region (us, eu ou ap), a região de armazenamento desse espaço de trabalho.
Respostas de erro#
Todas as respostas de erro são objetos JSON com uma mensagem error:
{
"error": "Dataset not found"
}| Estado HTTP | Significado |
|---|---|
200 | Sucesso |
201 | Criado |
202 | Aceite; o trabalho continua de forma assíncrona |
400 | Caminho, consulta ou corpo do pedido inválido |
401 | Autenticação em falta ou inválida |
402 | Créditos insuficientes (treino) |
403 | Permissões, plano ou quota insuficientes |
404 | Recurso não encontrado |
409 | Conflito com o estado atual (nome duplicado, tarefa em execução) |
413 | Entrada de previsão demasiado grande |
422 | As classes do modelo não correspondem ao conjunto de dados (anotação automática) |
429 | Limite de frequência excedido |
500 | Erro do servidor |
502 | Falha no fornecedor upstream ou na chamada do serviço |
503 | Serviço dependente temporariamente indisponível |
Paginação#
O estilo de paginação depende da coleção:
| Estilo | Endpoints | Parâmetros |
|---|---|---|
| Apenas limite | Listas de conjuntos de dados, projetos, modelos, exportações e implementações | limit |
| Deslocamento e limite | Imagens de conjuntos de dados, agrupamento de imagens, pesquisa do Explore | offset, limit, além de hasMore na resposta |
| Cursor | Imagens de conjuntos de dados (conjuntos de dados grandes) | cursor, includeTotal, além de nextCursor |
| Número da página | Lixeira | page, limit, além de totalPages |
| Token de página opaco | Registos da implementação | pageToken, além de nextPageToken |
API de conjuntos de dados#
Cria, consulta e gere conjuntos de dados de imagens anotadas para treinar modelos YOLO. Consulta a documentação de conjuntos de dados.
Listar conjuntos de dados#
GET /api/datasets/{owner}SDK Python: client.datasets.list(owner)
Devolve os conjuntos de dados públicos do proprietário, além dos conjuntos de dados privados quando a tua chave pode visualizar esse espaço de trabalho.
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | int | Número máximo de conjuntos de dados a devolver (predefinição: 1000, máximo: 1000) |
includeSamples | booleano | Incluir pré-visualizações de imagens de amostra (predefinição: true) |
includeImageUrls | booleano | Incluir URLs alternativas de imagens de amostra em tamanho completo (predefinição: false) |
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"Resposta:
{
"datasets": [
{
"id": "65f1c0a2b3d4e5f601234567",
"owner": "acme-vision",
"dataset": "warehouse",
"name": "Warehouse",
"task": "detect",
"visibility": "private",
"imageCount": 1000,
"classCount": 2,
"classNames": ["person", "forklift"],
"splits": { "train": 800, "val": 200, "test": 0, "labeled": 1000 },
"annotationCount": 5400,
"starCount": 3,
"isStarred": false,
"status": "ready",
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-16T08:30:00Z"
}
],
"total": 1,
"region": "us"
}Obter conjunto de dados#
GET /api/datasets/{owner}/{dataset}SDK Python: client.datasets.retrieve(owner, dataset)
Devolve o objeto completo do conjunto de dados sob uma chave dataset, incluindo classNames, splits, versions, source e o objeto metadata definido pelo utilizador.
Criar conjunto de dados#
POST /api/datasetsSDK Python: client.datasets.create(dataset=..., name=...)
Corpo:
{
"dataset": "warehouse",
"name": "Warehouse",
"task": "detect",
"description": "Forklift and pedestrian safety dataset",
"classNames": ["person", "forklift"],
"visibility": "private",
"metadata": { "location": "factory-1", "reviewed": true },
"owner": "acme-vision"
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
dataset | string | Sim | Nome do conjunto de dados utilizado nos URLs da Platform (minúsculas, separado por hífenes, máximo de 128 caracteres) |
name | string | Sim | Nome de apresentação (máximo de 100 caracteres) |
description | string | Não | Descrição (máximo de 1000 caracteres) |
task | string | Não | Tipo de tarefa (predefinição: detect) |
classNames | array | Não | Nomes das classes por ordem de índice (máximo de 25.000) |
format | string | Não | Formato de anotação: yolo (predefinição), coco, raw, ndjson |
visibility | string | Não | public ou private |
tags | array | Não | Até 50 etiquetas com 50 caracteres cada |
license | string | Não | Identificador da licença do conjunto de dados |
metadata | objecto | Não | Metadados JSON personalizados |
owner | string | Não | Identificador do espaço de trabalho da equipa; predefinido para o teu espaço de trabalho pessoal |
requireExactSlug | booleano | Não | Retorna 409 quando dataset já estiver em uso, em vez de criar um nome com sufixo como warehouse-2 (padrão false) |
A resposta retorna o slug dataset que foi criado, portanto, leia-o antes de fazer o upload, a menos que definas requireExactSlug.
Valores válidos de task ao criar ou atualizar um conjunto de dados: detect, segment, semantic, depth, classify, pose e obb. Os conjuntos de dados de profundidade não têm classes.
Resposta (201):
{
"id": "65f1c0a2b3d4e5f601234567",
"owner": "acme-vision",
"dataset": "warehouse",
"region": "us"
}Atualizar conjunto de dados#
PATCH /api/datasets/{owner}/{dataset}SDK Python: client.datasets.update(owner, dataset)
Corpo (atualização parcial):
{
"name": "Warehouse Safety",
"description": "New description",
"visibility": "public",
"metadata": { "location": "factory-2", "reviewed": true }
}Campos aceites: name, description, visibility, metadata, tags, classNames, classColors, format, task, license, iconColor, iconLetter e starred. Envia um objeto metadata vazio ({}) para limpar os metadados personalizados. As chaves dos metadados estão limitadas a 128 caracteres e o objeto serializado a 500.000 caracteres.
Resposta:
{
"success": true,
"dataset": "warehouse-safety"
}A mudança do nome altera o nome no URL, por isso utiliza o valor dataset devolvido nos pedidos seguintes.
Eliminar dataset#
DELETE /api/datasets/{owner}/{dataset}SDK Python: client.datasets.delete(owner, dataset)
Move o conjunto de dados para a lixeira, onde pode ser recuperado durante 30 dias.
Clonar dataset#
POST /api/datasets/{owner}/{dataset}/cloneSDK Python: client.datasets.clone(owner, dataset)
Copia um conjunto de dados acessível, com as respetivas imagens e etiquetas, para o teu espaço de trabalho pessoal ou para um espaço de trabalho de equipa.
Corpo opcional (todos os campos são opcionais):
{
"dataset": "warehouse-copy",
"name": "Warehouse Copy",
"description": "Cloned for experimentation",
"visibility": "private",
"license": "CC-BY-4.0",
"owner": "acme-vision"
}Resposta (201): id, owner, dataset, name, imageCount, classCount e region. Os conjuntos de dados suportados por uma fonte de armazenamento ligada devolvem 409, porque os respetivos ficheiros não são copiados.
Transferir uma exportação de conjunto de dados#
GET /api/datasets/{owner}/{dataset}/exportSDK Python: client.datasets.export(owner, dataset)
Devolve um URL de transferência NDJSON assinado. Omite v para exportar o estado atual do conjunto de dados, reutilizando a exportação em cache quando nada mudou desde a sua geração.
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
v | inteiro | Número da versão guardada (indexado a partir de 1). Omite para obter o conjunto de dados atual. |
Resposta:
{
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"cached": true
}Pedir uma versão específica devolve downloadUrl e version em vez de cached.
Criar versão do conjunto de dados#
POST /api/datasets/{owner}/{dataset}/exportSDK Python: client.datasets.create_export(owner, dataset)
Cria um instantâneo numerado e imutável do conjunto de dados e armazena a sua exportação NDJSON. Requer acesso de editor.
Corpo (opcional):
{
"description": "Added 500 training images"
}Resposta:
{
"version": 3,
"downloadUrl": "https://storage.googleapis.com/...&signature=...",
"reused": false
}reused é true quando o conjunto de dados não sofreu alterações desde a versão anterior e esse instantâneo é devolvido em alternativa.
Atualizar descrição da versão#
PATCH /api/datasets/{owner}/{dataset}/exportSDK Python: client.datasets.update_export(owner, dataset, version=..., description=...)
Corpo:
{
"version": 2,
"description": "Fixed mislabeled classes"
}Resposta: {"ok": true}
Restaurar versão do conjunto de dados#
POST /api/datasets/{owner}/{dataset}/restoreSDK Python: client.datasets.restore(owner, dataset, version=...)
Reconstrói imagens, anotações e classes a partir de uma versão guardada sem copiar os bytes das imagens.
Corpo:
{
"version": 2
}Resposta: {"version": 2, "imageCount": 1000}
Obter estatísticas do conjunto de dados#
GET /api/datasets/{owner}/{dataset}/class-statsSDK Python: client.datasets.class_stats(owner, dataset)
Devolve contagens de anotações por classe, histogramas de imagens e anotações e mapas de calor. Os conjuntos de dados grandes são amostrados; nesse caso, sampleSize indica quantas imagens contribuíram.
Resposta (abreviada):
{
"classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
"imageStats": {
"widthHistogram": [{ "bin": 640, "count": 120, "size": 1 }],
"heightHistogram": [{ "bin": 480, "count": 95, "size": 1 }],
"pointsHistogram": [{ "bin": 4, "count": 200, "size": 1 }],
"formatDistribution": { "jpg": 900, "png": 100 },
"fileSizeHistogram": [{ "bin": 250000, "count": 300, "size": 50000 }],
"objectsPerImageHistogram": [{ "bin": 5, "count": 210, "size": 1 }],
"bboxWidthHistogram": [{ "bin": 120, "count": 340, "size": 20 }],
"bboxHeightHistogram": [{ "bin": 90, "count": 300, "size": 20 }]
},
"locationHeatmap": {
"bins": [
[5, 10],
[8, 3]
],
"maxCount": 50
},
"dimensionHeatmap": {
"bins": [
[2, 5],
[3, 1]
],
"maxCount": 12,
"minWidth": 10,
"maxWidth": 1920,
"minHeight": 10,
"maxHeight": 1080
},
"classNames": ["person", "forklift"],
"cached": true,
"sampleSize": null
}Gerir classes#
Fundir classes (reatribui as anotações a uma classe-alvo e remove as classes de origem):
POST /api/datasets/{owner}/{dataset}/classes/mergeSDK Python: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)
{
"sourceClassIds": [2, 4],
"targetClassId": 1
}Eliminar classes (as respetivas anotações são eliminadas e os IDs das classes restantes diminuem):
POST /api/datasets/{owner}/{dataset}/classes/deleteSDK Python: client.datasets.delete_classes(owner, dataset, class_ids=...)
{
"classIds": [2, 4]
}Ambas as operações devolvem success, os valores atualizados de classNames e classColors e um resumo do que mudou (mergedClassIds e targetClassId, ou deletedClassIds e deletedAnnotations).
Como os IDs restantes mudam após uma fusão ou eliminação, estas operações não são idempotentes. Obtém novamente o conjunto de dados para obter os índices atuais das classes antes de executar outra operação de classes.
Redistribuir divisões#
POST /api/datasets/{owner}/{dataset}/splits/redistributeSDK Python: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)
Reatribui aleatoriamente as imagens entre as divisões. As três percentagens têm de totalizar 100.
{
"train": 80,
"val": 20,
"test": 0
}Resposta: success, as contagens resultantes de splits e modified (número de imagens movidas).
Embeddings do conjunto de dados#
GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddingsSDK Python: client.datasets.embeddings(owner, dataset), client.datasets.create_embeddings(owner, dataset), client.datasets.delete_embeddings(owner, dataset)
GET devolve o resumo da análise (analyzedAt, embeddingsCount, latestImageAt, activeJob). POST coloca uma análise de embeddings na fila e devolve 202 com um jobId. DELETE cancela a tarefa ativa e devolve o ID da tarefa cancelada ou null.
Agrupamento de imagens#
GET /api/datasets/{owner}/{dataset}/images/clusteringSDK Python: client.datasets.clustering(owner, dataset)
Devolve o layout 2D UMAP de uma análise concluída, paginado com offset e limit (predefinição e máximo de 50.000). Cada entrada contém id, umapX, umapY, split, classIds, width, height, bytes, labelCount e missing.
Listar modelos treinados num conjunto de dados#
GET /api/datasets/{owner}/{dataset}/modelsSDK Python: client.datasets.models(owner, dataset)
Resposta:
{
"models": [
{
"id": "65f1c0a2b3d4e5f601234599",
"owner": "acme-vision",
"project": "inspection",
"model": "v3",
"name": "v3",
"status": "completed",
"task": "detect",
"epochs": 100,
"bestEpoch": 87,
"metrics": { "mAP50": 0.85, "mAP50-95": 0.72, "precision": 0.88, "recall": 0.81 },
"startedAt": "2026-01-14T22:00:00Z",
"completedAt": "2026-01-15T10:00:00Z",
"createdAt": "2026-01-14T21:55:00Z"
}
],
"count": 1
}Listar imagens do conjunto de dados#
GET /api/datasets/{owner}/{dataset}/imagesSDK Python: client.datasets.images(owner, dataset)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | int | Número máximo de imagens a devolver (predefinição: 50, máximo: 5000) |
offset | int | Imagens a ignorar (predefinição: 0) |
cursor | string | Último ID de imagem da página anterior, para paginação por cursor |
includeTotal | booleano | Incluir a contagem total correspondente (predefinição: true) |
split | string | Filtrar por divisão: train, val, test |
hasLabel | booleano | Filtrar pelo estado da anotação |
hasError | booleano | Filtrar pelo estado de erro de processamento |
classIds | string | IDs de classes separados por vírgulas; devolve imagens que contenham qualquer um deles |
search | string | Correspondência de substring no nome do ficheiro e nos metadados personalizados (máximo de 200 caracteres) |
sort | string | newest (predefinição), oldest, name-asc, name-desc, height-asc, height-desc, width-asc, width-desc, size-asc, size-desc, labels-asc, labels-desc |
includeThumbnails | booleano | Incluir URLs assinados de miniaturas (predefinição: true) |
includeImageUrls | booleano | Incluir URLs de imagens assinadas em tamanho completo (predefinição: false) |
includeLabels | booleano | Incluir anotações de pré-visualização com limite (predefinição: false) |
Resposta:
{
"images": [
{
"id": "65f1c0a2b3d4e5f601234567",
"hash": "9f2c1d4b6a8e0f3c5d7b9a1e2f4c6d8b",
"ext": "jpg",
"name": "aisle-04.jpg",
"thumbnailUrl": "https://storage.googleapis.com/...&signature=...",
"width": 1920,
"height": 1080,
"split": "train",
"labelCount": 6,
"bytes": 284213,
"error": null
}
],
"total": 1000,
"hasMore": true,
"classes": ["person", "forklift"],
"errorCount": 0,
"nextCursor": "65f1c0a2b3d4e5f601234567"
}Obter imagens selecionadas#
POST /api/datasets/{owner}/{dataset}/imagesSDK Python: client.datasets.selected_images(owner, dataset, image_ids=...)
Retorna a mesma estrutura de imagem para até 1.000 IDs de imagem fornecidos e aceita os mesmos parâmetros de filtro e de consulta de URL que a operação de listagem.
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Ingerir dados do conjunto de dados#
POST /api/datasets/{owner}/{dataset}/ingestSDK Python: client.datasets.ingest(owner, dataset, body=...)
Processa um carregamento concluído, um arquivo remoto ou uma fonte de armazenamento ligada num conjunto de dados existente. Fornece exatamente uma fonte:
| Campo | Tipo | Descrição |
|---|---|---|
sessionId | string | Sessão de carregamento de POST /api/upload/signed-url, já concluída |
sourceUrl | string | URL HTTP ou HTTPS pública de um arquivo ZIP, TAR, TAR.GZ, TGZ ou NDJSON (máximo de 4096 caracteres) |
reference | objecto | Uma fonte ligada: armazenamento na nuvem (provider: "cloud", integrationId, target, prefix) ou no local (provider: "local", keyId, root, prefix) |
targetSplit | string | train, val ou test; substitui a estrutura de divisões do arquivo |
conflictPolicy | string | skip, keep_both ou replace para conflitos de nome de arquivo ou conteúdo |
classMapping | objecto | Mapeia os nomes de classe recebidos para um índice de classe, um nome de classe existente ou novo, ou null para ignorar |
imageMetadata | objecto | Metadados personalizados indexados pelo caminho relativo ao arquivo de cada imagem ou pelo valor file do NDJSON |
As sessões de carregamento são associadas a um conjunto de dados pelo assetId passado a POST /api/upload/signed-url, e a ingestão rejeita uma
sessão pertencente a um conjunto de dados diferente.
Corpo (arquivo carregado):
{
"sessionId": "session_abc123",
"targetSplit": "train"
}Corpo (arquivo remoto ou NDJSON):
{
"sourceUrl": "https://example.com/my-dataset.zip"
}Corpo (importação de rótulos numa ingestão posterior):
{
"sessionId": "session_abc123",
"classMapping": { "person": 0, "automobile": "forklift", "background": null }
}Corpo (associação de metadados por imagem):
{
"sessionId": "session_abc123",
"imageMetadata": {
"airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
"images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
}
}As chaves dos metadados devem corresponder ao caminho normalizado dentro do arquivo, incluindo as pastas. Nas importações NDJSON, cada registro pode
conter o seu próprio objeto metadata, que tem precedência sobre uma entrada correspondente de imageMetadata. Os caminhos dos arquivos estão limitados
a 1.024 caracteres, as chaves de metadados de nível superior a 128 caracteres e cada objeto de metadados — bem como o mapa imageMetadata
inteiro — a 500.000 caracteres serializados.
A primeira ingestão cria automaticamente as classes a partir do arquivo. Nas ingestões posteriores, as classes do arquivo omitidas de
classMapping recorrem a uma correspondência sem distinção entre maiúsculas e minúsculas com as classes existentes do conjunto de dados. Os rótulos só são ignorados para
classes explicitamente mapeadas para null ou sem uma classe existente correspondente.
Resposta (201):
{
"jobId": "65f1c0a2b3d4e5f6012345aa",
"status": "queued"
}graph LR
A[POST /api/datasets]:::start --> B[POST /api/upload/signed-url]:::proc
B --> C[PUT archive to signed URL]:::proc
C --> D[POST /api/upload/complete]:::proc
D --> E["POST /api/datasets/{owner}/{dataset}/ingest"]:::proc
E --> F[Process archive]:::proc
F --> G[Dataset ready]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fffCarregar uma imagem com metadados usando Python
O mesmo código processa um grupo de imagens: adiciona mais arquivos ao ZIP e entradas correspondentes a imageMetadata.
import io
import zipfile
from pathlib import Path
import requests
api = "https://platform.ultralytics.com/api"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
owner, dataset = "acme-vision", "warehouse"
dataset_id = "65f1c0a2b3d4e5f601234567" # id returned by POST /api/datasets
image_path = Path("airbus-wing.jpg")
archive = io.BytesIO()
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as zf:
zf.write(image_path, image_path.name)
data = archive.getvalue()
signed = requests.post(
f"{api}/upload/signed-url",
headers=headers,
json={
"assetType": "datasets",
"assetId": dataset_id,
"filename": "images.zip",
"contentType": "application/zip",
"totalBytes": len(data),
},
)
signed.raise_for_status()
upload = signed.json()
requests.put(upload["uploadUrl"], headers={"Content-Type": "application/zip"}, data=data).raise_for_status()
requests.post(
f"{api}/upload/complete",
headers=headers,
json={"sessionId": upload["sessionId"]},
).raise_for_status()
ingest = requests.post(
f"{api}/datasets/{owner}/{dataset}/ingest",
headers=headers,
json={
"sessionId": upload["sessionId"],
"imageMetadata": {
"airbus-wing.jpg": {
"aircraft": {"family": "A350", "section": "wing"},
"inspectionStatus": "reviewed",
}
},
},
)
ingest.raise_for_status()
print(ingest.json())API de imagens#
Inspeciona, anota, move e elimina imagens de conjuntos de dados pelo seu ID de imagem de 24 caracteres. Consulta a documentação de anotações.
Obter imagem#
GET /api/images/{imageId}SDK Python: client.images.retrieve(image_id)
Retorna o objeto metadata (personalizado, definido pelo utilizador), properties (nome do arquivo, hash, dimensões, divisão, contagens, marcas temporais),
labels e o classNames do conjunto de dados.
Atualizar imagem#
PATCH /api/images/{imageId}SDK Python: client.images.update(image_id, body=...)
Substitui as anotações ou os metadados personalizados — envia uma das duas estruturas, não ambas.
Corpo (anotações):
{
"labels": [
{ "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] },
{ "classId": 1, "segments": [0.1, 0.2, 0.3, 0.2, 0.2, 0.4] }
]
}Corpo (metadados):
{
"metadata": { "location": "strasbourg", "reviewed": true }
}As coordenadas dos rótulos usam valores normalizados YOLO entre 0 e 1. As caixas delimitadoras usam
[x_center, y_center, width, height]. Os rótulos de segmentação usam segments, uma lista achatada de vértices de polígonos
[x1, y1, x2, y2, ...]. Os rótulos de pose usam keypoints numa única estrutura plana consistente: pares [x1, y1, x2, y2, ...] ou
triplos [x1, y1, v1, x2, y2, v2, ...], em que a visibilidade normalmente usa 0, 1 ou 2. As caixas orientadas usam os cantos
obb. As coordenadas guardadas são arredondadas para 5 casas decimais e uma imagem aceita no máximo 10.000 anotações.
Eliminar imagem#
DELETE /api/images/{imageId}SDK Python: client.images.delete(image_id)
Elimina permanentemente uma imagem e as suas anotações.
Anotar imagem automaticamente#
POST /api/images/{imageId}/predictSDK Python: client.images.predict(image_id, model_id=...)
Executa a inferência YOLO na imagem e retorna as anotações previstas. Não as guarda — escreve os resultados de volta com
PATCH /api/images/{imageId} quando estiveres satisfeito com eles.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
modelId | string | Sim | URI totalmente qualificado do modelo, ul://{owner}/{project}/{model} |
confidence | float | Não | Limiar de confiança, 0,01 – 1,0 (predefinição: 0,25) |
iou | float | Não | Limiar de IoU para supressão não máxima, 0,0 – 0,95 (predefinição: 0,7) |
Resposta: success, predictions (objetos de anotação), modelUsed e inferenceTime. Um modelo cujas classes
não correspondam às do conjunto de dados retorna 422.
Auto-anotar um conjunto de dados#
POST /api/datasets/{owner}/{dataset}/predict/batchSDK Python: client.datasets.create_batch(owner, dataset, model_id=...)
Salva uma versão do conjunto de dados, depois coloca na fila uma execução que rotula as imagens sem rótulo do conjunto de dados com o modelo e retorna 202.
O corpo aceita os mesmos campos modelId, confidence e iou do endpoint de imagem única, mais includeAnnotated
(padrão false) para anotar também imagens que já possuem rótulos e um array opcional classMapping fornecendo o
índice de classe do conjunto de dados para cada classe de modelo, ou null para ignorá-lo. Os rótulos existentes nunca são alterados, e a execução é cobrada
pelas imagens que ela realmente processa. 402 significa que o saldo não cobre a estimativa, 409 que o conjunto de dados não está
pronto, não tem imagens restantes para anotar ou já tem uma execução em andamento, e 422 que o conjunto de dados não tem classes: crie as classes com o endpoint de classes antes de chamar este endpoint, que é o que a etapa Mapear classes do aplicativo faz antes de iniciar uma execução.
GET no mesmo caminho (client.datasets.batch(owner, dataset)) retorna a execução em andamento e seu progresso, ou a última
execução concluída até que seja dispensada; DELETE (client.datasets.delete_batch(owner, dataset)) cancela uma execução em andamento ou
fecha a fatura e descarta o resumo concluído.
Mover imagens em massa#
PATCH /api/images/bulkSDK Python: client.images.update_bulk(image_ids=..., split=...)
Move até 1.000 imagens de um conjunto de dados para uma divisão diferente.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"],
"split": "val",
"conflictPolicy": "skip"
}Os conflitos de nome de arquivo ou conteúdo retornam 409 até escolheres uma conflictPolicy abrangente para todo o lote entre skip, keep_both ou
replace. A resposta informa modifiedCount, skippedCount e targetSplit.
Eliminar imagens em massa#
DELETE /api/images/bulkSDK Python: client.images.delete_bulk(image_ids=...)
{
"imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}Elimina até 1.000 imagens de um único conjunto de dados e retorna deletedCount e deletedImageIds.
Obter URLs de imagens assinadas#
POST /api/images/urlsSDK Python: client.images.urls(image_ids=...)
Retorna URLs assinadas temporárias para até 100 IDs de imagem de um conjunto de dados.
{
"imageIds": ["65f1c0a2b3d4e5f601234567"]
}Resposta: urls e thumbnails, ambos indexados pelo ID da imagem.
API de projetos#
Organiza os teus modelos em projetos. Cada modelo pertence a um projeto. Consulta a documentação de projetos.
Listar projetos#
GET /api/projects/{owner}SDK Python: client.projects.list(owner)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | int | Número máximo de projetos a retornar (predefinição: 20, máximo: 500) |
Obter projeto#
GET /api/projects/{owner}/{project}SDK Python: client.projects.retrieve(owner, project)
Retorna o objeto project, uma matriz models de resumos por modelo (estado, métricas, épocas, pesos, argumentos de treino)
e isOwner.
Criar projeto#
POST /api/projectsSDK Python: client.projects.create(project=..., name=...)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
project | string | Sim | Nome do projeto usado nos URLs da Platform |
name | string | Sim | Nome de apresentação (máximo de 100 caracteres) |
description | string | Não | Descrição (máximo de 1000 caracteres) |
visibility | string | Não | public ou private |
tags | array | Não | Até 50 etiquetas |
license | string | Não | Identificador da licença do projeto |
metadata | objecto | Não | Metadados JSON personalizados |
owner | string | Não | Identificador do espaço de trabalho da equipa; predefinido para o teu espaço de trabalho pessoal |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project": "inspection",
"name": "Inspection",
"description": "Detection experiments",
"metadata": {"department": "manufacturing", "cost_center": "cv-01"}
}' \
https://platform.ultralytics.com/api/projectsResposta (201): id, owner, project, region.
Atualizar projeto#
PATCH /api/projects/{owner}/{project}SDK Python: client.projects.update(owner, project)
Campos aceites: name, description, visibility, metadata, tags, license, archived, iconColor,
iconLetter, viewPreferences e starred.
{
"metadata": { "department": "research", "program": "inspection" }
}Envia um objeto metadata vazio ({}) para o limpar. Os metadados do projeto usam os mesmos limites de 128 caracteres por chave e
de 500.000 caracteres por objeto serializado dos metadados do conjunto de dados.
Eliminar projeto#
DELETE /api/projects/{owner}/{project}SDK Python: client.projects.delete(owner, project)
Move o projeto e os seus modelos para o lixo, retornando cascadedModels.
Clonar projeto#
POST /api/projects/{owner}/{project}/cloneSDK Python: client.projects.clone(owner, project)
Clona um projeto acessível e os seus modelos concluídos. O corpo opcional aceita project, name, description,
visibility, license e um owner de destino.
API de modelos#
Gere modelos YOLO treinados — consulta métricas, descarrega pesos, executa inferência e monitoriza o treino. Consulta a documentação de modelos.
Listar modelos num projeto#
GET /api/models/{owner}/{project}SDK Python: client.models.list(owner, project)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | int | Número máximo de modelos a retornar (predefinição: 20, máximo: 100) |
Obter modelo#
GET /api/models/{owner}/{project}/{model}SDK Python: client.models.retrieve(owner, project, model)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
analysis | int | Define como 1 para retornar a análise de validação por imagem em vez do modelo |
A resposta predefinida contém o objeto model — estado, tarefa, métricas, trainArgs, trainResults, classNames,
computeCost, metadata e mais — além de isOwner.
Criar modelo#
POST /api/modelsSDK Python: client.models.create(body=...)
Cria um registro de modelo não treinado ao qual podes associar pesos ou que podes treinar.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
project | string | Sim | Nome do projeto de destino |
owner | string | Não | Identificador do espaço de trabalho; predefinido para o teu espaço de trabalho pessoal |
model | string | Não | Nome do modelo usado nos URLs da Platform; gerado quando omitido |
name | string | Não | Nome de apresentação (aceite apenas juntamente com model) |
description | string | Não | Descrição (máximo de 1000 caracteres) |
task | string | Não | detect, segment, semantic, depth, classify, pose ou obb |
metadata | objecto | Não | Metadados JSON personalizados |
trainArgs | objecto | Não | Argumentos de treino a registrar |
metrics | objecto | Não | Métricas como mAP50, mAP50-95, precision, recall |
epochs | número | Não | Contagem de épocas para um modelo já treinado |
version | string | Não | Etiqueta da versão (máximo de 50 caracteres) |
Resposta (201): id, owner, project, model, region.
Para associar pesos de .pt, solicita um URL de carregamento assinado com assetType: "models" e o id deste modelo como assetId,
PUT o arquivo para o URL retornado e, em seguida, chama POST /api/upload/complete com o sessionId retornado.
Atualizar modelo#
PATCH /api/models/{owner}/{project}/{model}SDK Python: client.models.update(owner, project, model)
Os campos aceitos incluem name, description, color, metadata, status, license, datasetSlug, trainArgs,
trainResults, epochs, bestEpoch, bestFitness, version, trainingError e starred. Passar projectId sozinho
move o modelo para outro projeto do mesmo proprietário; a resposta retorna o slug do modelo no destino,
renamed: true quando esse slug já estiver em uso lá e 409 enquanto o modelo ainda estiver treinando.
{
"metadata": { "release": "candidate-3", "reviewed": true }
}O metadata personalizado é separado dos campos geridos pelo treino, como trainArgs, environment e trainResults, e
usa os mesmos limites de tamanho dos metadados do conjunto de dados.
Eliminar modelo#
DELETE /api/models/{owner}/{project}/{model}SDK Python: client.models.delete(owner, project, model)
Move o modelo para o lixo durante 30 dias.
Descarregar arquivos do modelo#
GET /api/models/{owner}/{project}/{model}/filesSDK Python: client.models.files(owner, project, model)
Retorna URLs assinados de curta duração para os pesos do modelo.
{
"files": [
{
"name": "best.pt",
"size": 6534127,
"downloadUrl": "https://storage.googleapis.com/...&signature=..."
}
]
}Clonar modelo#
POST /api/models/{owner}/{project}/{model}/cloneSDK Python: client.models.clone(owner, project, model, project_body=...)
Copia um modelo acessível para um projeto existente.
{
"owner": "acme-vision",
"project": "inspection",
"model": "v3-copy",
"name": "V3 Copy",
"description": "Cloned from a public model"
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
project | string | Sim | Nome do projeto de destino |
owner | string | Não | Espaço de trabalho de destino; predefinido para o teu espaço pessoal |
model | string | Não | Nome do modelo de destino |
name | string | Não | Nome de apresentação de destino |
description | string | Não | Descrição do clone |
Execute a inferência#
POST /api/models/{owner}/{project}/{model}/predictSDK Python: client.models.predict(owner, project, model, body=...)
É possível fazer previsões com modelos públicos sem autenticação. Os modelos privados e partilhados exigem uma chave de API com acesso ao projeto principal.
Formulário multipartes:
| Parâmetro | Tipo | Predefinição | Intervalo | Descrição |
|---|---|---|---|---|
file | file | - | - | Ficheiro de imagem ou vídeo (obrigatório, a menos que source esteja definido) |
conf | float | 0.25 | 0.01 – 1.0 | Limiar mínimo de confiança |
iou | float | 0.7 | 0.0 – 0.95 | Limiar de IoU do NMS |
imgsz | int | 640 | 32 – 1280 | Tamanho da imagem de entrada em píxeis |
normalize | bool | false | - | Devolve as coordenadas da caixa delimitadora como 0 – 1 |
decimals | int | 5 | 0 – 10 | Precisão decimal dos valores das coordenadas |
bits | int | 8 | 8, 12, 16 | Quantização do mapa de profundidade, apenas para modelos de profundidade |
source | string | - | - | URL da imagem ou cadeia base64 (alternativa a file) |
Fornece file ou source. Os modelos de profundidade também aceitam bits (8, 12 ou 16) para selecionar a quantização PNG do mapa de
profundidade. As solicitações que excedam os limites de entrada do serviço retornam 413.
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@image.jpg" \
-F "conf=0.5" \
https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/predictResposta:
Cada entrada em images contém shape, speed, results e, para tarefas de predição densa, um payload PNG semantic_mask ou depth (os valores de profundidade são pixel × max / divisor, com divisor 255 para o mapa predefinido de 8 bits e 65535 quando bits é 12 ou 16). O objeto metadata informa a contagem de imagens, os tempos das funções, a tarefa e as versões do serviço. Os caminhos internos dos modelos nunca são retornados.
{
"images": [
{
"shape": [1080, 1920],
"speed": { "preprocess": 2.1, "inference": 12.4, "postprocess": 1.3 },
"results": [
{
"class": 0,
"name": "person",
"confidence": 0.92,
"box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
}
]
}
],
"metadata": {
"imageCount": 1,
"functionTimeAlive": 184.2,
"functionTimeCall": 0.31,
"task": "detect",
"version": { "ultralytics": "8.4.120" }
}
}Verificar o progresso do treino#
GET /api/models/{owner}/{project}/{model}/trainingSDK Python: client.models.training(owner, project, model)
Retorna job, contendo o estado, o progresso das épocas, os tempos, os detalhes computacionais, os argumentos de treino, as métricas da época e detalhes de erro seguros, ou null quando o modelo nunca foi treinado. Os modelos em projetos públicos podem ser lidos sem autenticação.
Cancelar o Treino#
DELETE /api/models/{owner}/{project}/{model}/trainingSDK Python: client.models.delete_training(owner, project, model)
Termina a instância de computação em execução e marca o trabalho como cancelado. Retorna 409 quando o treino já não está ativo.
API de treino#
Inicia o treino de YOLO em GPUs na nuvem e monitoriza o progresso em tempo real. Consulta a documentação do treino na nuvem.
graph LR
A[POST /api/training/start]:::start --> B[Job Created]:::proc
B --> C{Training}:::decide
C -->|progress| D[GET .../training]:::proc
C -->|cancel| E[DELETE .../training]:::error
C -->|complete| F[Model Ready]:::out
F --> G[Deploy or Export]:::proc
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef error fill:#F44336,color:#fffObter disponibilidade de GPUs#
GET /api/training/gpu-availabilitySDK Python: client.training.gpu_availability()
Retorna o estado atual do stock, indexado pelo ID da GPU. É público e não requer autenticação; passa managed=true para incluir a capacidade de treino gerida, que requer uma chave de API.
Iniciar treino#
POST /api/training/startSDK Python: client.training.start(model_id=..., train_args=...)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
modelId | string | Sim | ID do modelo a treinar |
trainArgs | objecto | Sim | Argumentos de treino de YOLO; model, data e epochs são obrigatórios |
gpuType | string | Não | GPU na nuvem a utilizar (predefinição: rtx-4090) |
captureDatasetVersion | booleano | Não | Guardar uma versão imutável do dataset para esta execução (predefinição: false) |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"modelId": "65f1c0a2b3d4e5f601234599",
"gpuType": "rtx-4090",
"trainArgs": {
"model": "yolo26n.pt",
"data": "ul://acme-vision/datasets/warehouse",
"epochs": 100,
"imgsz": 640,
"batch": 16
}
}' \
https://platform.ultralytics.com/api/training/startResposta:
{
"modelId": "65f1c0a2b3d4e5f601234599",
"status": "starting",
"gpuType": "rtx-4090",
"estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
"billing": {
"estimatedCostCents": 138,
"estimatedCostDisplay": "$1.38",
"balanceCents": 2500
}
}O treino retorna 402 quando o teu saldo de créditos é demasiado baixo e 503 quando não há capacidade disponível para a GPU solicitada.
Estão disponíveis 26 tipos de GPU, desde rtx-2000-ada até b300, incluindo rtx-4090, l40s, a100-80gb-pcie, a100-80gb-sxm, rtx-pro-6000, h100-sxm, h200-sxm e b200. Consulta Treino na nuvem para veres a lista completa com preços.
API de exportação#
Converte modelos para formatos otimizados como ONNX, TensorRT, CoreML e LiteRT para implementação na edge. Consulta a documentação de implementação.
Listar exportações#
GET /api/models/{owner}/{project}/{model}/exportsSDK Python: client.exports.list(owner, project, model)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | string | Filtrar por queued, starting, running, completed, failed ou cancelled |
limit | int | Número máximo de exportações a retornar (predefinição: 20, máximo: 100) |
Criar exportação#
POST /api/models/{owner}/{project}/{model}/exportsSDK Python: client.exports.create(owner, project, model, format=...)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
format | string | Sim | Formato de exportação de destino (consulta a tabela abaixo) |
gpuType | string | Condicional | Obrigatório quando format é engine; utiliza um destino compatível de GPU ou Jetson |
args | objecto | Não | Opções de exportação: imgsz, quantize, dynamic, simplify, opset, conf, iou, batch, workspace, nms, optimize, keras e name (destino do dispositivo para os formatos RKNN, QNN, Hailo e Ascend) |
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"format": "onnx", "args": {"imgsz": 640, "quantize": 16}}' \
https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/exportsResposta (201): id, format, status (queued ou running), gpuType, region. Uma exportação equivalente que já esteja em curso retorna 409.
Formatos compatíveis:
Utiliza o argumento format da tabela de exportação partilhada abaixo. PyTorch é o formato de origem e não é um destino de exportação da API.
| Formato | Argumento format | Modelo | Metadados | Argumentos |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
nms=None por padrão utiliza saídas brutas para NMS externo. Define nms=False para selecionar uma cabeça livre de NMS disponível; os formatos não suportados recorrem ao seu caminho de saída nativo. As entradas nms acima identificam formatos que podem incorporar NMS com nms=True.
Obter estado da exportação#
GET /api/models/{owner}/{project}/{model}/exports/{exportId}SDK Python: client.exports.retrieve(owner, project, model, export_id)
Retorna o objeto export com status, format, args, gpuType, marcas temporais e, quando concluído, um objeto file contendo size, downloadUrl e downloadFilename.
Cancelar ou eliminar exportação#
DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}SDK Python: client.exports.delete(owner, project, model, export_id)
Cancela uma exportação ativa ou elimina uma concluída e o respetivo ficheiro. A resposta indica qual das ações ocorreu:
{
"success": true,
"action": "cancelled"
}API de implementações#
Implementa modelos em endpoints de inferência dedicados, com verificações de integridade e monitorização. Consulta a documentação dos endpoints.
graph LR
A[Create]:::start --> B[Deploying]:::proc
B --> C[Ready]:::out
C -->|action stop| D[Stopped]:::extern
C -->|action replace| B
D -->|action start| C
C -->|delete| E[Deleted]:::error
D -->|delete| E
C -->|predict| F[Inference Results]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef error fill:#F44336,color:#fff
classDef extern fill:#607D8B,color:#fffListar implementações#
GET /api/deployments/{owner}SDK Python: client.deployments.list(owner)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | string | creating, deploying, ready, stopping, stopped ou failed |
model | string | Filtrar por {project}/{model}, por exemplo inspection/v3 |
limit | int | Número máximo de implementações a retornar (predefinição: 20, máximo: 100) |
Os utilizadores anónimos têm de filtrar por um modelo público; para listar um workspace completo é necessária autenticação.
Criar implementação#
POST /api/deployments/{owner}SDK Python: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)
Corpo:
{
"project": "inspection",
"model": "v3",
"deployment": "edge-1",
"name": "Edge 1",
"region": "us-central1"
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
project | string | Sim | Projeto que contém o modelo |
model | string | Sim | Modelo a implementar |
deployment | string | Sim | Nome da implementação utilizado nos URLs da Platform |
name | string | Sim | Nome de apresentação |
region | string | Sim | Uma das 42 regiões de implementação compatíveis |
Resposta (201): id, deployment, status (creating), message e region.
O CPU, a memória e o dimensionamento das instâncias são geridos pela Platform com base nos limites do teu plano, e o pedido de criação não aceita uma configuração de recursos. Os valores atuais são retornados no objeto resources em cada leitura da implementação.
Escolhe uma região próxima dos teus utilizadores para obteres a menor latência. A interface da Platform apresenta estimativas de latência para todas as 42 regiões disponíveis.
Obter implementação#
GET /api/deployments/{owner}/{deployment}SDK Python: client.deployments.retrieve(owner, deployment)
Retorna o objeto deployment com status, statusMessage, region, serviceUrl e resources.
Iniciar, parar ou substituir uma implementação#
PATCH /api/deployments/{owner}/{deployment}SDK Python: client.deployments.update(owner, deployment, body=...)
Um único campo action seleciona a operação:
{ "action": "start" }A substituição implementa uma nova revisão, preservando o ID da implementação, a região e o URL do endpoint; a revisão existente continua ativa se a implementação falhar. O modelo de substituição tem de estar concluído e ter pesos aos quais a tua chave possa aceder. As operações concluídas retornam 200 com status ready ou stopped; as operações ainda em implementação retornam 202 com deploying ou stopping.
Eliminar implementação#
DELETE /api/deployments/{owner}/{deployment}SDK Python: client.deployments.delete(owner, deployment)
Remove permanentemente o endpoint de inferência.
Verificação de integridade#
GET /api/deployments/{owner}/{deployment}/healthSDK Python: client.deployments.health(owner, deployment)
Faz ping e aquece o endpoint, retornando healthy, latencyMs e o código upstream status.
Executar inferência numa implementação#
POST /api/deployments/{owner}/{deployment}/predictSDK Python: client.deployments.predict(owner, deployment, body=...)
Encaminha uma imagem ou um vídeo através do endpoint dedicado. Os contratos do pedido e da resposta correspondem aos da inferência de modelos.
Formulário multipartes:
| Parâmetro | Tipo | Predefinição | Intervalo | Descrição |
|---|---|---|---|---|
file | file | - | - | Ficheiro de imagem ou vídeo (obrigatório, a menos que source esteja definido) |
conf | float | 0.25 | 0.01 – 1.0 | Limiar mínimo de confiança |
iou | float | 0.7 | 0.0 – 0.95 | Limiar de IoU do NMS |
imgsz | int | 640 | 32 – 1280 | Tamanho da imagem de entrada em píxeis |
normalize | bool | false | - | Devolve as coordenadas da caixa delimitadora como 0 – 1 |
decimals | int | 5 | 0 – 10 | Precisão decimal dos valores das coordenadas |
bits | int | 8 | 8, 12, 16 | Quantização do mapa de profundidade, apenas para modelos de profundidade |
source | string | - | - | URL da imagem ou cadeia base64 (alternativa a file) |
Obter métricas#
GET /api/deployments/{owner}/{deployment}/metricsSDK Python: client.deployments.metrics(owner, deployment)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
range | string | 1h, 6h, 24h (predefinição), 7d ou 30d |
sparkline | booleano | Retornar o resumo compacto do dashboard em vez da série completa (predefinição: false) |
A resposta completa contém summary (totais dos pedidos, taxa de erros e latência média e p50/p95/p99) e timeSeries (pedidos, erros, latência, CPU, memória e contagem de instâncias). A resposta do sparkline retorna requests24h, totalRequests, errorRate e avgLatencyMs.
Obter registos#
GET /api/deployments/{owner}/{deployment}/logsSDK Python: client.deployments.logs(owner, deployment)
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
severity | string | Separados por vírgulas: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY |
limit | int | Entradas a retornar (predefinição: 50, máximo: 200) |
pageToken | string | Token de paginação de uma resposta anterior |
API do lixo#
Visualiza, restaura e elimina permanentemente projetos, datasets e modelos eliminados de forma reversível. Os itens são purgados automaticamente após 30 dias. Consulta a documentação do lixo.
Listar a Lixeira#
GET /api/trashSDK Python: client.lifecycle.trash()
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
type | string | all (predefinição), project, dataset ou model |
page | int | Número da página (predefinição: 1) |
limit | int | Itens por página (predefinição: 50, máximo: 200) |
A resposta inclui items (cada um com daysRemaining), total, page, limit, totalPages e um summary com os totais por tipo.
Restaurar item#
POST /api/trashSDK Python: client.lifecycle.restore(id=..., type=...)
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Restaurar um projeto também restaura os modelos que foram enviados para o lixo com ele, indicados como restoredModels.
Eliminar permanentemente#
DELETE /api/trashSDK Python: client.lifecycle.delete_trash(body=...)
Eliminar um item:
{
"id": "65f1c0a2b3d4e5f601234567",
"type": "dataset"
}Ou esvaziar todo o lixo:
{
"all": true
}A resposta indica deletedCount, além de cascadedModels e survivingDeployments quando aplicável.
A eliminação permanente não pode ser anulada. O recurso e todos os dados associados são removidos.
API de carregamento#
Carrega ficheiros diretamente para o armazenamento na nuvem utilizando URLs assinados. A conclusão do carregamento de um modelo associa os respetivos pesos; a conclusão do carregamento de um arquivo de dataset regista a sessão, que de seguida passas para a ingestão do dataset. Consulta a documentação de dados.
Obter URL de carregamento assinado#
POST /api/upload/signed-urlSDK Python: client.upload.signed_url(body=...)
Corpo:
{
"assetType": "datasets",
"assetId": "65f1c0a2b3d4e5f601234567",
"filename": "warehouse.zip",
"contentType": "application/zip",
"totalBytes": 52428800
}| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
assetType | string | Sim | datasets, models, images ou videos |
assetId | string | Sim | ID do dataset ou modelo de destino |
filename | string | Sim | Nome de ficheiro original (máximo de 256 caracteres) |
contentType | string | Sim | Tipo MIME |
totalBytes | número | Sim | Tamanho do ficheiro em bytes |
Quando assetType é datasets, filename tem de terminar em .zip, .tar, .tar.gz, .tgz ou .ndjson. Empacota as imagens soltas num arquivo antes de as carregar.
Resposta:
{
"sessionId": "session_abc123",
"uploadUrl": "https://storage.googleapis.com/...&signature=...",
"expiresAt": "2026-02-22T12:00:00Z",
"headers": { "x-goog-if-generation-match": "0" }
}Envia o arquivo com uma solicitação PUT para uploadUrl, usando o mesmo Content-Type que declaraste e cada cabeçalho
retornado em headers. As URLs de upload de conjuntos de dados são válidas por 12 horas e servem apenas para criação: um segundo PUT para a mesma URL
retorna 412, e um PUT sem os cabeçalhos retornados retorna 400.
Concluir carregamento#
POST /api/upload/completeSDK Python: client.upload.complete(session_id=...)
{
"sessionId": "session_abc123",
"md5": "<optional md5 hex>"
}Resposta: success e um objeto file com size e contentType. Para modelos, isto associa os pesos; para arquivos de datasets, chama ingest de seguida para iniciar o processamento.
Quando md5 é fornecido, ele é verificado em relação ao objeto armazenado. Uma divergência retorna 400; em uma sessão que ainda não
está completa, isso também exclui o arquivo enviado e deixa a sessão incompleta, portanto, solicita uma nova URL assinada e faz o upload
novamente. Uma sessão de conjunto de dados concluída pode ser concluída novamente enquanto o arquivo compactado existir, mas conclusões concorrentes com
resumos diferentes retornam 409; as sessões de modelos são removidas após a conclusão. checksum é armazenado como metadados do arquivo do modelo
e não é verificado.
API de integrações de armazenamento#
Liga contas somente de leitura do Google Cloud Storage, Amazon S3 ou Azure Blob Storage e navega por elas como fontes de datasets. Consulta a documentação de integrações.
Listar integrações#
GET /api/integrations/bucketsSDK Python: client.storage_integrations.list()
Retorna integrations, cada um com id, provider, credentialIdentity, targets e createdAt. As credenciais
nunca são retornadas.
Descobrir localizações#
POST /api/integrations/buckets/discoverSDK Python: client.storage_integrations.discover(body=...)
Lista os buckets ou contentores legíveis com as credenciais fornecidas, sem os guardar.
{
"provider": "gcs",
"credentials": {
"client_email": "svc@project.iam.gserviceaccount.com",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"project_id": "my-project"
}
}Resposta: {"targets": ["my-bucket", "another-bucket"]}
Ligar armazenamento#
POST /api/integrations/bucketsSDK Python: client.storage_integrations.create(body=...)
Usa os mesmos formatos de credenciais da descoberta, além de um array targets obrigatório com 1 a 50 nomes de buckets ou contentores. Retorna 201
com a integração guardada. As credenciais temporárias do S3 (chaves de acesso ASIA) são rejeitadas.
Procurar objetos#
GET /api/integrations/buckets/{id}/objectsSDK Python: client.storage_integrations.objects(id, target=...)
Parâmetros de consulta:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
target | string | Sim | Nome do bucket ou contentor |
prefix | string | Não | Prefixo da pasta (máx. 1024 caracteres) |
cursor | string | Não | Cursor de paginação do fornecedor da página anterior |
Retorna entries (cada kind é folder ou file) e um cursor opcional para a página seguinte.
Desligar armazenamento#
DELETE /api/integrations/buckets/{id}SDK Python: client.storage_integrations.delete(id)
Remove as credenciais guardadas sem eliminar os dados do fornecedor. Os conjuntos de dados ligados continuam visíveis, mas os respetivos ficheiros permanecem indisponíveis até que a mesma conta de armazenamento seja ligada novamente. Requer acesso de administrador do espaço de trabalho.
API de importação de conjuntos de dados#
Importa conjuntos de dados de serviços de terceiros. Consulta a integração do Roboflow.
Pré-visualizar uma importação do Roboflow#
POST /api/integrations/roboflow/previewSDK Python: client.datasets.preview_roboflow(api_key=...)
Resolve uma chave de API do Roboflow num plano de importação: detalhes do espaço de trabalho, newDatasets que seriam importados, contagens de projetos
ignorados, não suportados e não resolvidos, bytesTotal e a tua margem disponível storage. A chave de API do Roboflow é lida
no corpo e não é persistida.
{
"apiKey": "ROBOFLOW_API_KEY"
}Importar do Roboflow#
POST /api/integrations/roboflow/importSDK Python: client.datasets.import_roboflow(api_key=..., items=...)
Coloca em fila trabalhos de ingestão para até 500 versões de projetos do Roboflow selecionadas, usando os itens retornados pela pré-visualização.
{
"apiKey": "ROBOFLOW_API_KEY",
"items": [
{
"workspace": "my-workspace",
"projectId": "warehouse-safety",
"projectName": "Warehouse Safety",
"projectType": "object-detection",
"latestVersion": 4
}
]
}Resposta (201): arrays imported, failed e skipped. As importações requerem espaço de armazenamento disponível, e cada conjunto de dados
deve respeitar o limite de tamanho por importação do teu plano.
API da conta#
Consulta a tua conta da Platform, chaves, armazenamento e perfis públicos. Consulta a documentação das definições.
Resumo da conta#
GET /api/account/summarySDK Python: client.account.summary()
Retorna o plano, o saldo de créditos e as contagens de recursos do espaço de trabalho que emitiu a chave.
{
"username": "acme-vision",
"name": "Acme Vision",
"accountType": "team",
"plan": "pro",
"creditsCents": 2500,
"counts": { "projects": 4, "datasets": 7, "models": 21 },
"teams": []
}teams é preenchido para sessões do navegador. As respostas autenticadas com chave de API retornam uma lista vazia, porque uma chave já está associada
a um único espaço de trabalho.
Listar chaves de API#
GET /api/api-keysSDK Python: client.account.api_keys()
Retorna keys com keyId, name, keyPrefix e createdAt para o espaço de trabalho da chave. Os pedidos autenticados com chave de API
recebem apenas metadados; os valores completos das chaves são apresentados ao proprietário do espaço de trabalho em
Definições > Chaves de API na interface da Platform, onde as chaves também são criadas e revogadas.
Verificar utilização do armazenamento#
GET /api/storageSDK Python: client.account.storage()
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
details | booleano | Incluir os dez maiores consumidores de armazenamento (predefinição: false) |
Resposta:
{
"tier": "pro",
"usage": {
"storage": { "current": 1073741824, "limit": 107374182400, "percent": 1.0 },
"datasets": { "current": 536870912, "limit": 107374182400, "percent": 0.5 }
},
"breakdown": {
"byCategory": {
"datasets": { "bytes": 536870912, "count": 2 },
"models": { "bytes": 268435456, "count": 4 },
"exports": { "bytes": 268435456, "count": 3 }
},
"topItems": [
{
"_id": "65f1c0a2b3d4e5f601234567",
"name": "Warehouse",
"slug": "warehouse",
"sizeBytes": 536870912,
"type": "dataset"
}
]
},
"region": "us",
"username": "acme-vision",
"updatedAt": "2026-01-15T10:00:00Z"
}Obter um perfil público de utilizador#
GET /api/usersSDK Python: client.account.profile(username=...)
Parâmetros de consulta:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
username | string | Sim | Nome de utilizador a consultar |
Retorna o perfil público user com followerCount e, para autores de pedidos autenticados, isFollowed.
Seguir ou deixar de seguir um utilizador#
PATCH /api/usersSDK Python: client.account.follow(username=..., followed=...)
{
"username": "target-user",
"followed": true
}Resposta: followed e o followerCount atualizado.
API de faturação#
Consulta a utilização do plano e o teu registo de créditos. Consulta a documentação de faturação.
Os valores de faturação são inteiros em cêntimos dos EUA, em que 100 = $1.00.
Ver plano e utilização#
GET /api/billing/usage-summarySDK Python: client.billing.usage_summary()
Retorna plan (ID, estado, ciclo de faturação, fim do período), metrics (limite e utilização do armazenamento), trainingCredit,
features, creditsCents e contagens de lugares.
Ver transações#
GET /api/billing/transactionsSDK Python: client.billing.transactions()
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
from | string | Marca temporal da transação mais antiga (ISO 8601) |
to | string | Marca temporal da transação mais recente (ISO 8601) |
Cada transação inclui id, type (como purchase, training, monthly_grant ou refund), amountCents,
balanceAfter, createdAt, um receiptUrl opcional e o contexto do modelo para custos de treino. Os detalhes internos de faturação nunca são retornados.
Explorar API#
Pesquisa projetos públicos e conjuntos de dados partilhados pela comunidade. Consulta a documentação do Explorar.
Pesquisar conteúdo público#
GET /api/explore/searchSDK Python: client.explore.search()
Parâmetros de consulta:
| Parâmetro | Tipo | Descrição |
|---|---|---|
q | string | Termo de pesquisa (máx. 200 caracteres) |
type | string | all (predefinição), projects ou datasets |
sort | string | newest (predefinição), oldest, stars, name-asc, name-desc, count-desc, count-asc |
offset | int | Resultados a ignorar (predefinição: 0) |
limit | int | Máximo de resultados por tipo de recurso (predefinição: 20, máx.: 100) |
task | string | Filtros de tarefas separados por vírgulas: detect, segment, semantic, depth, classify, pose, obb |
author | string | Filtro de nome de utilizador do proprietário |
starred | booleano | Retornar apenas conteúdo marcado com estrela pelo autor do pedido autenticado; requer uma chave de API |
Resposta: projects, datasets e hasMore.
curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"SDK de Python#
ultralytics-platform é um cliente Python tipado gerado a partir do contrato
OpenAPI, com um método por endpoint (client.datasets.list, client.models.predict,
client.exports.create, ...). Cada método aceita os parâmetros do caminho posicionalmente, outras entradas como argumentos nomeados
e timeout e extra_headers opcionais por pedido.
pip install "ultralytics-platform>=0.1.45" # Python 3.11+from ultralytics_platform import Platform
with Platform() as client: # reads ULTRALYTICS_API_KEY or the key saved by yolo login
dataset = client.datasets.retrieve("acme-vision", "warehouse")
images = client.datasets.images("acme-vision", "warehouse", limit=10)
export = client.exports.create("acme-vision", "inspection", "v3", format="onnx")AsyncPlatform expõe a mesma árvore de recursos para código async/await, as respostas malsucedidas geram APIError com
status_code, body e json analisado, e as falhas de ligação geram APIConnectionError. Consulta o
repositório do SDK para ver o README completo.
Integração com Python#
Para fluxos de trabalho de treinamento e inferência, usa o pacote Python da Ultralytics, que lida automaticamente com autenticação, uploads e transmissão de métricas em tempo real. No Python 3.11+, pip install ultralytics também instala o SDK ultralytics-platform. Quando model.train(project=...) tem como alvo a Platform, os retornos de chamada de treinamento transmitem eventos através de client.training.metrics() do SDK e solicitam URLs de upload de pontos de verificação através de client.models.upload_checkpoint(), as operações POST /api/webhooks/training/metrics e POST /api/webhooks/models/upload no documento OpenAPI, portanto não há nada para chamares por ti mesmo.
Instalação e configuração#
A integração com a plataforma requer Python>=3.11 e ultralytics>=8.4.120:
pip install "ultralytics>=8.4.120"Verifica a instalação:
yolo checkAutenticação#
yolo login YOUR_API_KEYUtilizar conjuntos de dados da Platform#
Faz referência a conjuntos de dados com URIs ul://:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Train on your Platform dataset
model.train(
data="ul://your-username/datasets/your-dataset",
epochs=100,
imgsz=640,
)Formato da URI:
| Padrão | Descrição |
|---|---|
ul://username/datasets/slug | Conjunto de dados |
ul://username/project-name | Projeto |
ul://username/project/model-name | Modelo específico |
ul://ultralytics/yolo26/yolo26n | Modelo oficial |
Enviar para a Platform#
Envia resultados para um projeto da Platform:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Results automatically sync to Platform
model.train(
data="coco8.yaml",
epochs=100,
project="your-username/my-project",
name="experiment-1",
)O que é sincronizado:
- Métricas de treino (em tempo real)
- Pesos finais do modelo
- Gráficos de validação
- Saída do console
- Métricas do sistema
- Argumentos de treinamento e ambiente do host (nome do host, sistema operativo, Python, hardware, commit do git, linha de comandos)
Exemplos de API#
Carregar um modelo da Platform:
# Your own model
model = YOLO("ul://username/project/model-name")
# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")Executar inferência:
results = model("image.jpg")
# Access results
for r in results:
boxes = r.boxes # Detection boxes
masks = r.masks # Segmentation masks
keypoints = r.keypoints # Pose keypoints
probs = r.probs # Classification probabilitiesExportar modelo:
# Export to ONNX
model.export(format="onnx", imgsz=640, quantize=16)
# Export to TensorRT
model.export(format="engine", imgsz=640, quantize=16)
# Export to CoreML
model.export(format="coreml", imgsz=640) # use imgsz=224 for classificationValidação:
metrics = model.val(data="ul://username/datasets/my-dataset")
print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")Perguntas frequentes#
Usa os mesmos segmentos de proprietário e nome que aparecem no URL da Platform. Um modelo em
https://platform.ultralytics.com/acme-vision/inspection/v3éGET /api/models/acme-vision/inspection/v3. Os IDs da base de dados continuam a ser retornados nas respostas (comoid) e algumas rotas aceitam-nos diretamente — as rotas de imagem aceitam umimageId, os carregamentos aceitam umassetIdePOST /api/training/startaceita ummodelId.Depende da coleção. A maioria dos endpoints de listagem aceita
limit:curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"As imagens de conjuntos de dados, o clustering e a pesquisa do Explorar usam
offsetcomlimite retornamhasMore:curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"É melhor percorrer conjuntos de imagens muito grandes com o cursor retornado como
nextCursor:curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://platform.ultralytics.com/api/datasets/acme-vision/warehouse/images?limit=1000&includeTotal=false&cursor=LAST_IMAGE_ID"A reciclagem usa
page, e os registos de implementação usam opageTokenopaco retornado comonextPageToken.Sim. Cada operação nesta página é um pedido HTTPS simples, e o contrato completo é publicado como OpenAPI 3.2 em platform.ultralytics.com/openapi.json, que podes fornecer a um gerador de clientes em qualquer linguagem. O pacote
ultralytics-platformé precisamente isso: um cliente tipado gerado a partir do contrato, enquanto o pacoteultralyticsadiciona transmissão de métricas em tempo real e carregamentos automáticos de modelos, além de suportar treino e inferência. Os fluxos de conta exclusivos de sessões do navegador, como o checkout de faturação e a gestão da equipa, permanecem na interface da Platform.Usa o cabeçalho
Retry-Afterda resposta429para aguardar o tempo adequado:import time import requests def api_request_with_retry(url, headers, max_retries=3): for attempt in range(max_retries): response = requests.get(url, headers=headers) if response.status_code != 429: return response wait = int(response.headers.get("Retry-After", 2**attempt)) time.sleep(wait) raise RuntimeError("Rate limit exceeded")404significa que o recurso não existe ou não está visível para a tua chave.403significa que o recurso foi encontrado, mas a ação requer mais acesso do que a tua chave possui — acesso de editor para modificar um conjunto de dados, acesso de proprietário para eliminar uma implementação, acesso de administrador para desligar o armazenamento ou um plano ou quota superior para exportações e implementações.Ler conjuntos de dados, projetos e modelos públicos, incluindo as respetivas imagens, URLs de imagens assinadas, estatísticas de classes, estado de embeddings, esquema de clustering e lista de exportações; verificar o progresso do treino num modelo público; descarregar os ficheiros de um modelo público; executar inferência num modelo público; consultar o perfil público de um utilizador; listar implementações filtradas por um modelo público; e pesquisar no Explorar.
GET /api/training/gpu-availabilityé totalmente público, exceto se pedires capacidade gerida. Tudo o resto requer uma chave, e fornecê-la num endpoint público também revela os teus recursos privados.