Ultralytics YOLO27: Inscreve-te na lista de espera.
Get Started
Treine seu primeiro modelo YOLO·Implementar·Aula 10/10
Aulainiciante

Exportar para implantação

Exporte best.pt para ONNX, OpenVINO, TensorRT, CoreML, LiteRT ou QNN e, antes de colocá-lo em produção, comprove que a exportação corresponde ao modelo PyTorch.

Seu best.pt precisa de Python e PyTorch para funcionar; celulares, navegadores, Jetsons e servidores de produção geralmente não os têm. O modo Export converte o modelo em um arquivo independente para esses ambientes de execução em uma única chamada. O problema: o fato de uma exportação ser carregada não significa que ela esteja correta, e uma comparação descuidada pode fazer uma exportação correta parecer defeituosa ou ocultar uma exportação defeituosa.

Nesta lição, você exportará o modelo de pílulas para ONNX, executará o modelo pela mesma API YOLO, comprovará que ele corresponde ao PyTorch nas caixas e no mAP de validação com as mesmas configurações e escolherá o formato necessário para o destino: ONNX, OpenVINO, TensorRT, CoreML, LiteRT ou QNN.

Resultado

Você pode exportar um modelo treinado para o formato adequado ao destino da implantação e comprovar, com uma verificação de paridade equivalente e validação, que a exportação corresponde a best.pt.

Via rápida
Se já sabes orientar-te, aqui está a versão resumida.
  1. yolo export model=runs/detect/pills_v1/weights/best.pt format=onnx — comece por aqui.

  2. OpenVINO para CPUs Intel; TensorRT para GPUs NVIDIA e Jetson; CoreML para Apple; LiteRT para Android; QNN para NPUs Snapdragon.

  3. Compare .pt e a exportação na mesma imagem, usando rect=False no lado .pt.

  4. Valide ambos com o imgsz usado no treinamento; o mAP50-95 deve corresponder.

Prático

Exemplo prático: exportar para ONNX#

A guia Exportar modelos da Ultralytics Platform lista formatos de implantação como ONNX, TensorRT, CoreML e OpenVINO

yolo export model=runs/detect/pills_v1/weights/best.pt format=onnx
PyTorch: starting from 'runs/detect/pills_v1/weights/best.pt' with input shape (1, 3, 320, 320) BCHW and output shape(s) (1, 5, 2100) (5.2 MB)
ONNX: export success ✅ 0.9s, saved as 'runs/detect/pills_v1/weights/best.onnx' (9.3 MB)
Predict:         yolo predict task=detect model=runs/detect/pills_v1/weights/best.onnx imgsz=320
Validate:        yolo val task=detect model=runs/detect/pills_v1/weights/best.onnx imgsz=320 data=my_dataset/data.yaml

Linha por linha:

  • input shape (1, 3, 320, 320): uma imagem, 3 canais de cor, um quadrado fixo de 320×320 — o imgsz usado no treinamento, incorporado ao arquivo.
  • output shape(s) (1, 5, 2100): 4 valores de caixa mais 1 pontuação de classe para 2.100 caixas candidatas; por padrão, o NMS é executado fora do grafo.
  • 9.3 MB: o arquivo ONNX armazena pesos FP32, por isso é maior que o .pt FP16.
  • Predict: / Validate:: comandos prontos para o arquivo exportado, já com o imgsz correto.

Alguns argumentos atendem à maioria das necessidades; o guia de integração ONNX apresenta os demais.

ArgumentoPadrãoUse para
imgszTamanho de treinamentoExporte com um tamanho de entrada fixo diferente, por exemplo, imgsz=640
dynamicFalseAceite tamanhos de entrada variáveis em vez de uma única forma fixa
quantizeNenhum (FP32)16 para pesos FP16 (yolo26n.onnx reduz de 9.5 MB para 4.8 MB); 8 para INT8 quando o formato for compatível
nmsNenhumnms=True incorpora o NMS ao grafo, para que o ambiente de execução retorne as caixas finais

Exemplo prático: comprovar que a exportação corresponde ao modelo#

A classe YOLO também carrega arquivos exportados, então o código de previsão anterior funciona sem alterações. Compare os dois arquivos na mesma imagem de validação:

from ultralytics import YOLO

image = "my_dataset/images/val/Frame_144.jpg"
pt = YOLO("runs/detect/pills_v1/weights/best.pt")(image, rect=False, verbose=False)[0]  # square input, like ONNX
onnx = YOLO("runs/detect/pills_v1/weights/best.onnx")(image, verbose=False)[0]

print(f"pt:   {len(pt.boxes)} pills, mean conf {pt.boxes.conf.mean():.3f}")
print(f"onnx: {len(onnx.boxes)} pills, mean conf {onnx.boxes.conf.mean():.3f}")
print(f"max box difference: {(pt.boxes.xyxy - onnx.boxes.xyxy).abs().max():.4f} px")
pt:   25 pills, mean conf 0.870
onnx: 25 pills, mean conf 0.870
max box difference: 0.0002 px

Mesma contagem, mesma confiança e caixas idênticas com precisão de uma fração de pixel. Agora, faça a verificação mais rigorosa: validação em todo o conjunto:

from ultralytics import YOLO

pt = YOLO("runs/detect/pills_v1/weights/best.pt").val(data="my_dataset/data.yaml", rect=False, verbose=False)
onnx = YOLO("runs/detect/pills_v1/weights/best.onnx").val(data="my_dataset/data.yaml", verbose=False)
print(f".pt   mAP50-95 {pt.box.map:.4f}")
print(f".onnx mAP50-95 {onnx.box.map:.4f}")
.pt   mAP50-95 0.6570
.onnx mAP50-95 0.6570

Idênticos. (A validação retangular padrão do arquivo .pt obteve 0.659: uma pequena diferença causada pelo preenchimento da entrada, não pela exportação.)

Quando os resultados corresponderem, meça o tempo com yolo benchmark no dispositivo de destino para conhecer a velocidade real antes da implantação.

Escolher um formato para seu destino#

Ciclo de vida da Ultralytics Platform: anotar com a anotação inteligente do SAM, treinar em GPUs na nuvem e implantar em regiões globais, com logotipos de parceiros de integração

MetaFormatoNotas
Opção portátil padrão: servidores e computadores desktop com Linux, Windows e MaconnxONNX Runtime em CPU ou GPU; a exportação mais rápida de verificar
GPUs NVIDIA e Jetsonengine (TensorRT)Mais rápido em NVIDIA; exporte no dispositivo. Veja Otimize com TensorRT
CPUs e iGPUs IntelopenvinoAcelerações reais de CPU com kernels Intel. Veja OpenVINO na CPU
Apps para iPhone, iPad e MaccoremlNativo; usa o Apple Neural Engine
Android e outros dispositivos móveis ou embarcadoslitertINT8 recomendado para dispositivos móveis
NPUs SnapdragonqnnAceleração Hexagon HTP; pesos INT8 com ativações de 16 bits por padrão; escolha a arquitetura HTP com name
Navegador webonnx com ONNX Runtime WebModelos menores são viáveis: n e s
from ultralytics import YOLO

model = YOLO("runs/detect/pills_v1/weights/best.pt")

model.export(format="onnx")  # multiplataforma: ONNX Runtime
model.export(format="openvino")  # CPU / iGPU Intel
model.export(format="engine", quantize=16)  # NVIDIA TensorRT, FP16 (execute na GPU de destino)
model.export(format="coreml")  # Apple iOS / macOS
model.export(format="litert", quantize=8, data="my_dataset/data.yaml")  # Android / edge, INT8
model.export(format="qnn", name="73", data="my_dataset/data.yaml")  # NPU Qualcomm Snapdragon (HTP v73); calibre com seus próprios dados

Cada exportação é gravada ao lado dos pesos: best.onnx, best_openvino_model/, best.engine e assim por diante. Comece com ONNX, mesmo que acabe usando outro formato: é o mais rápido de verificar e serve de entrada para várias outras cadeias de ferramentas. O guia de opções de implantação compara todos os formatos, e Escolha um destino de implantação explica como tomar essa decisão.

A quantização de modelos troca precisão por tamanho e velocidade. FP16 (quantize=16) reduz o tamanho do arquivo pela metade, quase sem alterar a precisão. INT8 (quantize=8) é ainda menor e mais rápido, mas precisa de imagens de calibração — quadros representativos que a exportação processa para escolher os intervalos de valores; a Ultralytics recomenda pelo menos 300. Sempre valide um modelo INT8 antes de colocá-lo em produção: a perda pode ser insignificante ou grande, dependendo do modelo e do conjunto de calibração.

Evita estes erros#

Comparar entradas diferentes

Sintoma: o modelo .pt encontra 35 comprimidos em Frame_144.jpg e o ficheiro ONNX encontra 25, parecendo que a exportação falhou. Causa: a inferência PyTorch ajusta cada imagem ao menor retângulo alinhado com o stride (192×320 para estes fotogramas 16:9), enquanto um modelo ONNX estático recebe sempre um quadrado de 320×320. Entrada diferente, deteções de baixa confiança diferentes. Solução: ao comparar, passa rect=False ao modelo .pt, como em parity.py.

Uma exportação estática ignora o teu imgsz

Sintoma: passas imgsz=640 a best.onnx e o registo continua a indicar 320x320. Causa: uma exportação estática tem um único tamanho de entrada, definido no momento da exportação. Solução: exporta com o tamanho que vais usar (imgsz=640) ou exporta com dynamic=True.

Os motores TensorRT são específicos do dispositivo

Um .engine criado num A100 não funciona num Jetson Orin e pode deixar de funcionar após uma atualização do TensorRT. Exporta no dispositivo alvo, com a versão do TensorRT que será usada. ONNX é portátil; os motores não são.

A calibração INT8 usa COCO8, salvo indicação em contrário

Se não especificares data numa exportação INT8, o Ultralytics apresenta um aviso e calibra com a amostra COCO8 predefinida — oito imagens que não se parecem nada com os teus comprimidos. Passa o teu próprio conjunto: model.export(format="litert", quantize=8, data="my_dataset/data.yaml").

Você colocou em produção#

Agora você tem um best.pt treinado, evidências de validação comparadas a uma linha de base, um arquivo exportado para seu ambiente de execução e a comprovação de que a exportação corresponde ao original. Esse é o ciclo completo — dados, treinamento, validação, exportação, implantação — e as equipes de produção o executam em intervalos regulares. Ultralytics YOLO em produção parte da sua exportação verificada e aborda ambientes de execução otimizados, pipelines de rastreamento, processamento de múltiplos fluxos e monitoramento.

Experimente

Exporte seu pills_v1/weights/best.pt para ONNX e execute parity.py e val_export.py. Execute novamente parity.py sem rect=False e anote como o número de .pt muda. Entregue quatro itens: o número de detecções correspondentes, a diferença máxima entre as caixas, os dois valores de mAP50-95 e uma linha que indique o formato necessário para seu destino de implantação real e o motivo.

Confirmar
git add -A && git commit -m "feat(deploy): exported best.pt to onnx for production runtime"
Concluído quando
Você concluiu a aula quando todos estes critérios forem atendidos.
  • runs/detect/pills_v1/weights/best.onnx existe e faz predições por meio de YOLO().

  • Com rect=False, o número de detecções corresponde e a diferença máxima entre as caixas é inferior a 1 px.

  • Os valores de mAP50-95 da validação com ONNX e .pt correspondem quando as configurações são iguais, e você indicou o formato de destino e o motivo.

Mostrar solução
from ultralytics import YOLO

# Train
model = YOLO("yolo26n.pt")
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_e2e")

# Validate
metrics = model.val()
print(f"mAP50-95 = {metrics.box.map:.3f}")  # 0.659

# Export
model.export(format="onnx")
parity.py:      pt 25 pills, onnx 25 pills, max box difference 0.0002 px
without rect:   pt 35 pills (192x320 input) vs onnx 25 (320x320): input mismatch, not an export bug
val_export.py:  .pt 0.6570, .onnx 0.6570
Target:         Intel laptop CPU -> openvino, for faster CPU inference than ONNX Runtime
Próximos passos

Curso concluído — faça o questionário final para receber seu certificado de Treine seu primeiro modelo YOLO e, em seguida, continue com Ultralytics YOLO em produção.

Entre para salvar seu progresso