Exportação de modelos com o Ultralytics YOLO#
Introdução#
O objetivo final do treinamento de um modelo é implantá-lo em aplicações do mundo real. O modo de exportação do Ultralytics YOLO26 oferece diversas opções para exportar seu modelo treinado em diferentes formatos, permitindo implantá-lo em várias plataformas e dispositivos. Este guia abrangente explica os detalhes da exportação de modelos e mostra como alcançar a máxima compatibilidade e desempenho.
Veja a prévia do YOLO27 ainda não lançado para saber mais sobre o suporte de exportação planejado.
Assista: Como exportar o Ultralytics YOLO26 em diferentes formatos para implantação | ONNX, TensorRT, CoreML 🚀
Por que escolher o modo de exportação do YOLO26?#
- Versatilidade: Exporte para vários formatos, incluindo ONNX, TensorRT, CoreML e outros.
- Desempenho: Obtenha até 5 vezes mais velocidade na GPU com TensorRT e 3 vezes mais velocidade na CPU com ONNX ou OpenVINO.
- Compatibilidade: Implante seu modelo em diversos ambientes de hardware e software.
- Facilidade de uso: CLI e API Python simples para exportar modelos de forma rápida e direta.
Exemplos de uso#
Exporte um modelo YOLO26n para outro formato, como ONNX ou TensorRT. Consulte a seção Argumentos abaixo para ver a lista completa de argumentos de exportação.
from ultralytics import YOLO
# Carregar um modelo
model = YOLO("yolo26n.pt") # carrega um modelo oficial
model = YOLO("path/to/best.pt") # carrega um modelo treinado de forma personalizada
# Exporta o modelo
model.export(format="onnx")Argumentos#
Esta tabela detalha as configurações e opções disponíveis para exportar modelos YOLO para diferentes formatos. Essas configurações são essenciais para otimizar o desempenho, o tamanho e a compatibilidade do modelo exportado em várias plataformas e ambientes. A configuração adequada garante que o modelo esteja pronto para implantação na aplicação pretendida com eficiência ideal.
| Argumento | Tipo | Padrão | Descrição |
|---|---|---|---|
format | str | 'torchscript' | Formato de destino do modelo exportado, como 'onnx', 'torchscript', 'engine' (TensorRT) ou outros. Cada formato permite a compatibilidade com diferentes ambientes de implantação. |
name | str | None | Nome do hardware de destino para os formatos que exigem um: arquitetura Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; o padrão é 'hailo8l'), chip Rockchip RKNN (o padrão é 'rk3588'), SoC Huawei Ascend (um --soc_version do CANN; o padrão é 'Ascend310B4'), destino Qualcomm QNN HTP (o padrão é '73') ou dispositivo AMD Xilinx Versal AI Edge Series Gen 2 (o padrão é 've2-xc2ve3858', o kit de avaliação VEK385). Diferente do par de nomes de execução project/name usado por outros modos. |
imgsz | int ou tuple | 640 | Tamanho de imagem desejado para a entrada do modelo. Pode ser um número inteiro para imagens quadradas (por exemplo, 640 para 640×640) ou uma tupla (height, width) para dimensões específicas. Se não for informado, a exportação reutiliza o tamanho de treinamento registrado no ponto de verificação carregado: os pontos de verificação oficiais do YOLO26 registram 768 para detect, 224 para classify, 1024 para OBB e 640 para as outras tarefas, enquanto um ajuste fino registra o imgsz usado no treinamento. Um modelo criado a partir de um YAML não tem tamanho de treinamento registrado e usa 640. |
optimize | bool | False | Ativa uma otimização mais avançada do compilador para DEEPX, reduzindo a latência da inferência e aumentando o tempo de compilação. |
quantize | int ou str | None | Precisão da quantização: 16 (FP16, reduz o tamanho do modelo e pode acelerar a inferência em hardware compatível) ou 8 (INT8/PTQ, comprime ainda mais o modelo com perda mínima de precisão, principalmente para dispositivos de borda; requer calibração data/fraction); 32/não definido corresponde a FP32. Um ponto de verificação treinado com quantize=8 sempre é exportado como INT8: onnx e engine exportam usando os intervalos que contêm, sem calibração, e outros formatos ou precisões são rejeitados. 'w8a8' e 'w16a16' são aliases de 8 e 16; as precisões mistas 'w8a16' (pesos INT8 com ativações de 16 bits: CoreML, LiteRT, QNN) e 'w8a32' (INT8 dinâmico: LiteRT) são aceitas somente por esses formatos. Substitui as flags obsoletas half/int8 (half=True → 16, int8=True → 8, ainda aceitas com um aviso de descontinuação). Somente são permitidas as precisões compatíveis com o formato de destino (veja abaixo). |
dynamic | bool | False | Permite tamanhos de entrada dinâmicos nas exportações TorchScript, ONNX, OpenVINO, TensorRT, CoreML e MNN, aumentando a flexibilidade para lidar com dimensões de imagem variáveis. |
simplify | bool | True | Simplifica o grafo ONNX intermediário com onnxslim nas exportações que o geram (consulte Formatos de exportação), podendo melhorar o desempenho e a compatibilidade com mecanismos de inferência. |
opset | int | None | Especifica a versão do opset ONNX para exportações que geram um grafo ONNX (consulte Formatos de exportação), garantindo compatibilidade com diferentes analisadores e ambientes de execução ONNX. Se não for definida, usa a versão mais recente compatível. |
workspace | float ou None | None | Define o tamanho máximo do espaço de trabalho, em GiB, para otimizações TensorRT, equilibrando o uso de memória e o desempenho. Use None para que o TensorRT aloque automaticamente até o máximo do dispositivo. |
nms | bool, opcional | None | None exporta predições brutas de um para muitos para NMS externo; True incorpora NMS quando compatível; False seleciona a cabeça sem NMS quando disponível. A NMS incorporada do CoreML é compatível com detect, segment e pose com formatos estáticos. Consulte o guia de detecção de ponta a ponta. |
conf | float | None | Limiar de confiança usado sempre que a NMS é gerada durante a exportação: exportações nms=True; exportações detect da Hailo que não são de ponta a ponta; e exportações detect, pose e segment do IMX, que definem internamente nms=True. O padrão, se não for definido, é 0.25. |
iou | float | 0.7 | Limiar de IoU usado sempre que a NMS é gerada durante a exportação: exportações nms=True; exportações detect da Hailo que não são de ponta a ponta; e exportações detect, pose e segment do IMX, que definem internamente nms=True. |
max_det | int | 300 | Número máximo de detecções mantidas na saída do modelo exportado. Aplica-se às exportações nms=True em todos os formatos, exceto à detecção CoreML, cujo pipeline nativo de NMS não tem limite de detecções, além das exportações de detecção de ponta a ponta sem NMS (YOLO26, YOLOv10, limitadas ao número de âncoras disponíveis) e das exportações detect, pose e segment do IMX. |
agnostic_nms | bool | False | Ativa a NMS independente de classe sempre que ela é gerada durante a exportação pelo pipeline padrão nms=True, incluindo a própria etapa de NMS do CoreML, suprimindo caixas sobrepostas com pontuações menores entre classes diferentes, em vez de apenas dentro da mesma classe. Não é aplicada às configurações de NMS geradas pela própria Hailo ou pelo IMX, que não têm uma opção independente de classe e permanecem cientes das classes, independentemente dessa flag. Também é incorporada às exportações de ponta a ponta sem NMS (YOLO26, YOLOv10), nas quais apenas impede que a mesma detecção apareça com vários rótulos de classe (duplicatas com IoU=1.0), sem aplicar supressão baseada em limiar de IoU entre caixas distintas. |
batch | int | 1 | Especifica o tamanho do lote de inferência do modelo exportado ou o número máximo de imagens que o modelo exportado processará simultaneamente no modo predict. Os formatos sem batch nos argumentos de exportação (Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx) exportam lote 1 e rejeitam outros valores. |
device | str | None | Especifica o dispositivo para exportação: GPU (device=0), CPU (device=cpu), MPS para Apple silicon (device=mps), NPU Huawei Ascend (device=npu ou device=npu:0) ou DLA para NVIDIA Jetson (device=dla:0 ou device=dla:1). As exportações TensorRT usam GPU automaticamente, mas o TensorRT 11.0 não é compatível com DLA. |
verbose | bool | False | Eleva o nível de severidade do registro do compilador TensorRT para VERBOSE durante a exportação format='engine'. Os outros formatos de exportação ignoram essa opção. |
data | str | None | Caminho para o YAML do conjunto de dados, essencial para a calibração da quantização INT8; para classificação, use um diretório de conjunto de dados ou o nome de um conjunto de dados integrado. Se não for especificado com INT8 ativado, a Ultralytics seleciona um conjunto de dados de calibração específico da tarefa quando necessário ou usa o conjunto de dados padrão para a tarefa do modelo. Um ponto de verificação treinado com quantize=8 contém seus próprios intervalos INT8 e não precisa de dados de calibração. |
split | str | 'val' | Divisão do conjunto de dados ('train', 'val' ou 'test') usada para criar o carregador de dados de calibração da quantização INT8 a partir de data. |
fraction | float, int ou list | 1.0 | Subconjunto do conjunto de dados usado para calibração INT8: uma proporção, uma quantidade de imagens ou valores [train, val, test]. 1 significa a divisão completa; números inteiros acima de 1 indicam a quantidade de imagens; e somente a entrada opcional de teste aceita 0/0.0 para indicar nenhum. Listas de dois itens mantêm test completo. |
Ajustar esses parâmetros permite personalizar o processo de exportação de acordo com requisitos específicos, como o ambiente de implantação, as limitações de hardware e as metas de desempenho. Escolher o formato e as configurações adequados é essencial para alcançar o melhor equilíbrio entre tamanho do modelo, velocidade e precisão.
Formatos de exportação#
Os formatos de exportação disponíveis para o YOLO26 estão na tabela abaixo. Você pode exportar para qualquer formato usando o argumento format, por exemplo, format='onnx' ou format='engine'. Você pode executar predições ou validações diretamente nos modelos exportados, por exemplo, yolo predict model=yolo26n.onnx. Após a conclusão da exportação, são apresentados exemplos de uso para o seu modelo. Também é possível exportar modelos diretamente pelo navegador na Plataforma Ultralytics, sem precisar configurar um ambiente local.
| 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 |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, 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 |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, 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 |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None usa por predefinição saídas brutas para NMS externo. Define nms=False para selecionar uma cabeça sem NMS disponível; os formatos não suportados recorrem ao respetivo caminho de saída nativo. As entradas nms acima identificam os formatos que podem incorporar NMS com nms=True.
A maioria dos formatos requer pacotes que não são instalados com ultralytics. Se um pacote estiver ausente, a exportação o instala durante a execução com uv ou pip e, no Linux, usa apt para pacotes do sistema, como Java para IMX. O compilador Edge TPU é baixado sem apt ou sudo. Para manter o ambiente fixo, por exemplo, em uma imagem de contêiner, uma tarefa de CI ou um serviço de produção, defina YOLO_AUTOINSTALL=False. A exportação ainda verifica quais pacotes estão ausentes e os informa, mas não altera o ambiente e falha até que eles sejam instalados.
export YOLO_AUTOINSTALL=FalseOpções de quantização#
Use o argumento quantize para solicitar a precisão da exportação. Os valores de texto não diferenciam maiúsculas de minúsculas, e o Ultralytics normaliza os aliases aceitos antes da exportação:
| Valores solicitados | Valor canônico | Significado |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | Pesos e ativações INT8 |
16, "16", "fp16", "w16a16" | 16 | Pesos e ativações FP16 |
32, "32", "fp32", "w32a32" | 32 | Exportação FP32; igual a não definido, exceto nos programas CoreML NMS ML, que usam FP16 por predefinição |
"w8a16" | "w8a16" | Pesos INT8 com ativações de 16 bits (FP16; INT16 no LiteRT) |
"w8a32" | "w8a32" | Pesos INT8 com ativações FP32 (INT8 dinâmico no LiteRT, sem necessidade de calibração) |
As flags legadas half=True e int8=True continuam a ser aceites com avisos de descontinuação e encaminham para quantize=16 e quantize=8.
Nem todos os formatos de exportação suportam todas as precisões. Os pedidos explícitos de quantize resultam nessa precisão ou falham antes da exportação:
| Formato | FP32 (32/não definido) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Observações |
|---|---|---|---|---|---|
| PyTorch | ✅ | N/D | N/D | N/D | Formato nativo de treino/ponto de controlo. |
| TorchScript | ✅ | ✅ Apenas GPU | ❌ | ❌ | A exportação TorchScript FP16 requer device=0; a exportação para CPU é FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 usa quantização estática do ONNX Runtime e dados de calibração. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 usa quantização pós-treino do NNCF. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 requer dados de calibração representativos. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8 é quantização de pesos; W8A16 usa pesos INT8 com ativações FP16. ¹ Por predefinição, os programas NMS ML não definidos usam FP16, e as exportações nms=True de segmentação/pose são sempre FP16. |
| Core AI | ✅ | ✅ | ❌ | ❌ | FP32 por predefinição ou um recurso .aimodel FP16 com quantize=16; não existe um percurso INT8. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | A exportação INT8 usa calibração TensorFlow. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Não há conversão de precisão durante a exportação. |
| Edge TPU | ❌ | ❌ | ✅ automático | ❌ | O Edge TPU requer INT8; a opção é ativada automaticamente quando não está definida. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | INT8 estático (8) e "w8a16" (pesos int8 + ativações int16) usam dados de calibração; também é compatível com "w8a32" INT8 dinâmico (sem calibração). quantize=16 não é uma exportação separada; um modelo FP32 é executado em FP16 durante a execução através do delegado de GPU. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Não há conversão de precisão durante a exportação. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 é quantização de pesos através da conversão MNN. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Formato de execução para dispositivos móveis/embarcados. |
| IMX500 | ❌ | ❌ | ✅ automático | ❌ | O IMX500 requer quantização; INT8 é ativado automaticamente quando não está definido. |
| RKNN | ❌ | ✅ depende do chip | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B são compatíveis com FP16 ou INT8; as variantes RV1103/RV1106 só são compatíveis com INT8. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | Não há conversão de precisão durante a exportação. |
| Axelera | ❌ | ❌ | ✅ automático | ❌ | A exportação Axelera requer INT8; a opção é ativada automaticamente quando não está definida. |
| DEEPX | ❌ | ❌ | ✅ automático | ❌ | A exportação DEEPX requer INT8; a opção é ativada automaticamente quando não está definida. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ automático | A exportação QNN HTP é fixa: pesos INT8 com ativações de 16 bits. |
| Hailo | ❌ | ❌ | ✅ automático | ❌ | A exportação Hailo requer INT8; a opção é ativada automaticamente quando não está definida. |
| Huawei Ascend | ❌ | ✅ automático | ❌ | ❌ | As convoluções Ascend AI Core só aceitam entradas FP16/INT8, pelo que o ATC compila em FP16; a opção é ativada automaticamente quando não está definida. |
| AMD Xilinx | ❌ | ❌ | ✅ automático | ❌ | A exportação AMD Xilinx requer Vitis AI INT8 (VINT8); essa opção é ativada automaticamente quando não é definida. |
Para exportações INT8 e W8A16, fornece dados de calibração representativos com data, como data="coco8.yaml", exceto quando a integração de destino documenta um comportamento predefinido ou de ativação automática. O esquema "w8a32" do LiteRT (INT8 dinâmico) não requer dados de calibração.
Treino com reconhecimento de quantização#
As exportações INT8 acima usam quantização pós-treino (PTQ): os intervalos são observados numa única passagem de calibração sobre data. Em contrapartida, o treino com reconhecimento de quantização (QAT) aprende pesos que toleram INT8 através de ajuste fino com quantização simulada no ciclo, recuperando a precisão que se perde apenas com a calibração. Passa quantize=8 para train para ajustar um ponto de controlo pré-treinado e, em seguida, exporta-o como habitualmente:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco.yaml",
quantize=8,
epochs=5,
batch=64,
optimizer="AdamW",
lr0=0.00001,
lrf=0.1,
warmup_epochs=0.5,
cos_lr=True,
mosaic=0.0,
)
model.export(format="engine", quantize=8) # os intervalos acompanham o ponto de controlo; não são necessários dados de calibraçãoUsa uma taxa de aprendizagem baixa ao ajustar um ponto de controlo pré-treinado. O QAT pode reduzir inicialmente a precisão, e a sua vantagem em relação à quantização pós-treino depende do modelo, do conjunto de dados e do orçamento de treino. Valida o modelo exportado comparando-o com o ponto de controlo original e com uma exportação quantizada pós-treino; as pontuações de quantização simulada durante o treino não comprovam a precisão na implementação.
A utilidade do QAT depende da eficácia da calibração própria do backend de exportação para o modelo. Os valores abaixo são mAP50-95 no COCO val2017, medidos com motores TensorRT 10.16 em imgsz=640 e lote 1, sendo que cada ponto de controlo QAT foi treinado com epochs=20 patience=3:
| Modelo | Motor FP32 | Motor PTQ INT8 | Motor QAT INT8 |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.5527 |
O QAT custa entre 0,008 e 0,017 mAP50-95 em relação ao FP32 em toda a gama, enquanto a quantização pós-treino custa 0,010 em yolo26n e entre 0,038 e 0,057 nos modelos maiores. Assim, o QAT quase não traz vantagens no modelo mais pequeno, em que a calibração já funciona bem, e melhora entre 0,030 e 0,044 nos restantes. Os valores serão diferentes noutro conjunto de dados, formato de exportação ou versão do TensorRT, por isso mede os teus.
Os modelos QAT requerem compile=False; os módulos quantizados do ModelOpt não são compatíveis com torch.compile.
As convoluções de saída finais da cabeça são deliberadamente mantidas em ponto flutuante para limitar a perda de precisão INT8; o TensorRT ativa precisão mista FP16 para as camadas não quantizadas. O QAT é executado através do NVIDIA TensorRT Model Optimizer, instalado automaticamente na primeira utilização, e é necessário tê-lo instalado para carregar o ponto de controlo resultante. Esses intervalos acompanham o ponto de controlo e as exportações onnx e engine emitem-nos como nós Q/DQ; os outros formatos leem os dados de calibração e rejeitam um ponto de controlo QAT.
O que fazer a seguir#
Consulta o guia de integração do teu destino de implementação — ONNX, TensorRT, CoreML e outros estão na lista completa de integrações — para saberes como executar o modelo exportado.
Perguntas frequentes#
Exportar um modelo YOLO26 para o formato ONNX é simples com a Ultralytics. A biblioteca disponibiliza métodos Python e CLI para exportar modelos.
Exemplofrom ultralytics import YOLO # Carregar um modelo model = YOLO("yolo26n.pt") # carrega um modelo oficial model = YOLO("path/to/best.pt") # carrega um modelo treinado de forma personalizada # Exporta o modelo model.export(format="onnx")Para mais detalhes sobre o processo, incluindo opções avançadas como a gestão de diferentes tamanhos de entrada, consulta o guia de integração ONNX.
Usar TensorRT para exportar modelos proporciona melhorias significativas de desempenho. Os modelos YOLO26 exportados para TensorRT podem alcançar uma aceleração de GPU até 5x, o que os torna ideais para aplicações de inferência em tempo real.
- Versatilidade: otimiza modelos para uma configuração de hardware específica.
- Velocidade: obtém inferência mais rápida através de otimizações avançadas.
- Compatibilidade: integra-te facilmente com hardware NVIDIA.
Para saberes mais sobre a integração do TensorRT, consulta o guia de integração do TensorRT.
A quantização INT8 é uma excelente forma de comprimir o modelo e acelerar a inferência, sobretudo em dispositivos de periferia. Eis como podes ativar a quantização INT8:
Exemplofrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Carregar um modelo model.export(format="onnx", quantize=8, data="coco8.yaml")A quantização INT8 pode ser aplicada a formatos como ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN e AMD Xilinx. Para obter resultados ideais de quantização, forneça um conjunto de dados representativo usando o parâmetro
data. Consulte Opções de quantização para ver os valoresquantizeaceitos e os formatos compatíveis.O tamanho dinâmico da entrada permite ao modelo exportado processar imagens com dimensões variáveis, proporcionando flexibilidade e otimizando a eficiência do processamento para diferentes casos de utilização. Ao exportar para formatos como ONNX ou TensorRT, ativar o tamanho dinâmico da entrada garante que o modelo se adapta sem problemas a diferentes formas de entrada.
Para ativar esta funcionalidade, usa a flag
dynamic=Truedurante a exportação:Exemplofrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)O dimensionamento dinâmico da entrada é particularmente útil em aplicações onde as dimensões de entrada podem variar, como no processamento de vídeo ou ao lidar com imagens de diferentes origens.
Por predefinição, os modelos PyTorch e as exportações dinâmicas usam preenchimento com retângulo mínimo, enquanto as exportações estáticas preenchem até ao valor completo de
imgsz, pelo que as deteções perto do limiar de confiança podem diferir. Usarect=Falsepara a inferência nativa corresponder a uma exportação estática, ou exporta comdynamic=Truequando disponível.Compreender e configurar os argumentos de exportação é fundamental para otimizar o desempenho do modelo:
format:O formato de destino do modelo exportado (por exemplo,onnx,torchscript,saved_model).imgsz:O tamanho de imagem pretendido para a entrada do modelo (por exemplo,640ou(height, width)).quantize:Precisão da quantização, como8/"int8",16/"fp16",32/"fp32"ou os esquemas mistos de pesos/ativações"w8a16"e"w8a32"(INT8 dinâmico no LiteRT) nos formatos compatíveis. Consulta Opções de quantização.dynamic:Aceita tamanhos de entrada variáveis em formatos compatíveis com formas dinâmicas, como ONNX, OpenVINO e TensorRT.nms:Seleciona saídas em bruto para NMS externa (None), NMS integrada (True) ou a cabeça sem NMS (False).device:Dispositivo usado para rastrear o modelo durante a exportação, comocpuou0para a primeira GPU CUDA; TorchScript FP16 requer uma GPU.
Para implementar em plataformas de hardware específicas, considera usar formatos de exportação especializados, como TensorRT para GPUs NVIDIA, CoreML para dispositivos Apple ou Edge TPU para dispositivos Google Coral.
Quando exportas um modelo YOLO para formatos como ONNX ou TensorRT, a estrutura do tensor de saída depende da tarefa do modelo. Compreender estas saídas é importante para implementações de inferência personalizadas.
Para modelos de deteção YOLO26 (por exemplo,
yolo26n.pt) exportados comnms=False, os formatos compatíveis produzem uma saída sem NMS com forma semelhante a(batch_size, max_detections, 6)e[x1, y1, x2, y2, confidence, class_id]valores. Com omax_det=300predefinido, esta saída é normalmente(batch_size, 300, 6). Alguns formatos com restrições recorrem automaticamente ao esquema de saída tradicional quando não são compatíveis com operadores de ponta a ponta.Por predefinição (
nms=None), os modelos de deteção, incluindo YOLO26, exportam previsões brutas de um para muitos: a saída é normalmente um único tensor com forma semelhante a(batch_size, 4 + num_classes, num_predictions), cujos canais representam as coordenadas das caixas e as pontuações por classe, enum_predictionsdepende da resolução de entrada da exportação (e pode ser dinâmica). O guia de deteção de ponta a ponta explica quais os formatos que mantêm a saída de ponta a ponta.Para modelos de segmentação (por exemplo,
yolo26n-seg.pt), normalmente obterás duas saídas: o primeiro tensor tem forma semelhante a(batch_size, 4 + num_classes + mask_dim, num_predictions)(caixas, pontuações de classe e coeficientes de máscara), e o segundo tensor tem forma semelhante a(batch_size, mask_dim, proto_h, proto_w)e contém protótipos de máscara usados com os coeficientes para gerar máscaras de instância. Os tamanhos dependem da resolução de entrada da exportação (e podem ser dinâmicos).Para modelos de pose (por exemplo,
yolo26n-pose.pt), o tensor de saída tem normalmente forma semelhante a(batch_size, 4 + num_classes + keypoint_dims, num_predictions), ondekeypoint_dimsdepende da especificação da pose (por exemplo, do número de pontos-chave e da inclusão ou não de confiança), enum_predictionsdepende da resolução de entrada da exportação (e pode ser dinâmica).Os exemplos em exemplos de inferência ONNX mostram como processar estas saídas para cada tipo de modelo.
Atualmente, a Ultralytics não disponibiliza uma API de inferência C++ dedicada para modelos YOLO. Para implementações em C++, exporta o modelo para um formato de execução, como ONNX, TensorRT, TorchScript ou MNN, e depois carrega o artefacto exportado com a API C++ nativa desse ambiente de execução.
Por exemplo, exporta um modelo de deteção com
yolo export model=yolo26n.pt format=onnxe executa o ficheiro.onnxcom ONNX Runtime C++, ou exporta comformat=enginee executa o motor TensorRT a partir de uma aplicação C++ TensorRT. Ao usares pós-processamento C++ personalizado, ajusta o esquema do tensor de saída à tarefa e às definições de exportação; as exportações de deteção YOLO26 predefinidas devolvem tensores de previsão brutos que requerem NMS externo. Exporta comnms=Falsepara obter deteções sem NMS com a forma(batch, max_det, 6), ou comnms=Truepara incorporar NMS nos formatos compatíveis.Ao exportar com
quantize=16(FP16) ouquantize=8(INT8), a maioria dos tensores é convertida para uma precisão inferior, reduzindo o tamanho do modelo e melhorando o desempenho. No entanto, quandonms=Falseestá ativado, o pós-processamento (incluindo os índices de classe) é incorporado diretamente no grafo exportado.O tensor
output0contém índices de classe, que são representados internamente como valores de vírgula flutuante. O FP16 não consegue representar de forma fiável valores inteiros acima de 2048 devido à precisão limitada da mantissa. Para evitar possíveis perdas de precisão ou IDs de classe incorretos,output0é mantido intencionalmente em FP32.Se precisares de saídas totalmente em FP16, exporta com
nms=Nonenuma GPU e executa o pós-processamento externamente. As exportações ONNX FP16 em CPU mantêm sempre as entradas e saídas em FP32, convertendo apenas o grafo interno.