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.
Prático
Exemplo prático: exportar para ONNX#

yolo export model=runs/detect/pills_v1/weights/best.pt format=onnxPyTorch: 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.yamlLinha por linha:
input shape (1, 3, 320, 320): uma imagem, 3 canais de cor, um quadrado fixo de 320×320 — oimgszusado 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.ptFP16.Predict:/Validate:: comandos prontos para o arquivo exportado, já com oimgszcorreto.
Alguns argumentos atendem à maioria das necessidades; o guia de integração ONNX apresenta os demais.
| Argumento | Padrão | Use para |
|---|---|---|
imgsz | Tamanho de treinamento | Exporte com um tamanho de entrada fixo diferente, por exemplo, imgsz=640 |
dynamic | False | Aceite tamanhos de entrada variáveis em vez de uma única forma fixa |
quantize | Nenhum (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 |
nms | Nenhum | nms=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 pxMesma 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.6570Idê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#

| Meta | Formato | Notas |
|---|---|---|
| Opção portátil padrão: servidores e computadores desktop com Linux, Windows e Mac | onnx | ONNX Runtime em CPU ou GPU; a exportação mais rápida de verificar |
| GPUs NVIDIA e Jetson | engine (TensorRT) | Mais rápido em NVIDIA; exporte no dispositivo. Veja Otimize com TensorRT |
| CPUs e iGPUs Intel | openvino | Acelerações reais de CPU com kernels Intel. Veja OpenVINO na CPU |
| Apps para iPhone, iPad e Mac | coreml | Nativo; usa o Apple Neural Engine |
| Android e outros dispositivos móveis ou embarcados | litert | INT8 recomendado para dispositivos móveis |
| NPUs Snapdragon | qnn | Aceleração Hexagon HTP; pesos INT8 com ativações de 16 bits por padrão; escolha a arquitetura HTP com name |
| Navegador web | onnx com ONNX Runtime Web | Modelos 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 dadosCada 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#
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.
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.
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.
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.
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