Ultralytics YOLO27:

Xuất model với Ultralytics YOLO#

Ultralytics YOLO ecosystem and integrations

Giới thiệu#

Mục tiêu cuối cùng của việc huấn luyện một model là triển khai nó cho các ứng dụng thực tế. Chế độ xuất trong Ultralytics YOLO26 cung cấp đa dạng các tùy chọn để xuất model đã huấn luyện sang các định dạng khác nhau, giúp model có thể triển khai trên nhiều nền tảng và thiết bị khác nhau. Hướng dẫn toàn diện này nhằm mục đích dẫn dắt bạn qua các chi tiết tinh tế của việc xuất model, minh họa cách đạt được khả năng tương thích và hiệu năng tối đa.

Xem bản xem trước YOLO27 chưa phát hành để biết hỗ trợ xuất được lên kế hoạch.



Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀

Tại sao nên chọn Chế độ xuất của YOLO26?#

  • Tính linh hoạt: Xuất ra nhiều định dạng bao gồm ONNX, TensorRT, CoreML và nhiều định dạng khác.
  • Hiệu năng: Tăng tốc độ GPU lên tới 5 lần với TensorRT và tăng tốc độ CPU lên tới 3 lần với ONNX hoặc OpenVINO.
  • Khả năng tương thích: Giúp model của bạn có thể triển khai phổ quát trên vô số môi trường phần cứng và phần mềm.
  • Dễ sử dụng: CLI và Python API đơn giản giúp việc xuất model diễn ra nhanh chóng và trực quan.

Các tính năng chính của Chế độ xuất#

Dưới đây là một số tính năng nổi bật:

  • Xuất một cú nhấp chuột: Các lệnh đơn giản để xuất sang các định dạng khác nhau.
  • Xuất theo lô: Xuất các model có khả năng suy luận theo lô.
  • Suy luận được tối ưu hóa: Các model đã xuất được tối ưu hóa để có thời gian suy luận nhanh hơn.
  • Video hướng dẫn: Các hướng dẫn và tài liệu chuyên sâu để có trải nghiệm xuất mượt mà.
Mẹo
  • Xuất sang ONNX hoặc OpenVINO để tăng tốc độ CPU lên tới 3 lần.
  • Xuất sang TensorRT để tăng tốc độ GPU lên tới 5 lần.

Ví dụ sử dụng#

Xuất model YOLO26n sang một định dạng khác như ONNX hoặc TensorRT. Xem phần Đối số bên dưới để có danh sách đầy đủ các đối số xuất.

Ví dụ
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load an official model
model = YOLO("path/to/best.pt")  # load a custom-trained model

# Export the model
model.export(format="onnx")

Arguments#

Bảng này chi tiết các cấu hình và tùy chọn có sẵn để xuất các model YOLO sang các định dạng khác nhau. Các cài đặt này đóng vai trò quan trọng trong việc tối ưu hóa hiệu năng, kích thước và khả năng tương thích của model đã xuất trên các nền tảng và môi trường khác nhau. Cấu hình đúng đắn đảm bảo rằng model sẵn sàng để triển khai trong ứng dụng dự kiến với hiệu suất tối ưu.

Đối sốKiểuMặc địnhMô tả
formatstr'torchscript'Định dạng đích cho model đã export, chẳng hạn như 'onnx', 'torchscript', 'engine' (TensorRT) hoặc các định dạng khác. Mỗi định dạng cho phép tương thích với các môi trường deployment khác nhau.
namestrNoneTên đích phần cứng cho các định dạng yêu cầu tên này: kiến trúc Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; mặc định là 'hailo8l'), chip Rockchip RKNN (mặc định là 'rk3588'), SoC Huawei Ascend (một --soc_version CANN; mặc định là 'Ascend310B4') hoặc target Qualcomm QNN HTP (mặc định là '73'). Khác với cặp đặt tên run project/name được các mode khác sử dụng.
imgszint hoặc tuple640Kích thước image mong muốn cho input của model. Có thể là số nguyên đối với image vuông (ví dụ: 640 cho 640×640) hoặc tuple (height, width) cho các kích thước cụ thể. Khi không được truyền vào, export sẽ sử dụng lại kích thước training được ghi trong checkpoint đã load: checkpoint YOLO26 chính thức ghi 768 cho depth, 224 cho classify, 1024 cho OBB và 640 cho các tác vụ khác, trong khi fine-tune ghi lại giá trị imgsz mà model được training. Model được xây dựng từ YAML không có kích thước training được ghi lại và sử dụng 640.
kerasboolFalseBật export sang định dạng Keras cho TensorFlow SavedModel, cung cấp khả năng tương thích với TensorFlow serving và các API.
optimizeboolFalseBật tối ưu hóa compiler cao hơn cho DEEPX, giảm latency inference nhưng làm tăng thời gian compilation.
quantizeint hoặc strNoneĐộ chính xác lượng tử hóa: 16 (FP16, giảm kích thước model và có thể tăng tốc inference trên phần cứng được hỗ trợ) hoặc 8 (INT8/PTQ, nén model thêm với mức tổn thất accuracy tối thiểu, chủ yếu dành cho edge devices; cần hiệu chuẩn data/fraction); 32/không thiết lập là FP32. Checkpoint được train bằng quantize=8 luôn xuất INT8: onnxengine xuất từ các khoảng mà checkpoint đó mang theo mà không cần hiệu chuẩn, các định dạng hoặc độ chính xác khác sẽ bị từ chối. Các định dạng export hỗ trợ độ chính xác trọng số/activation hỗn hợp cũng chấp nhận ký hiệu 'w8a8'/'w16a16'/'w8a16'/'w8a32'. Thay thế các cờ half/int8 đã bị deprecated (half=True16, int8=True8, vẫn được chấp nhận kèm theo cảnh báo deprecation). Chỉ cho phép các độ chính xác được định dạng mục tiêu hỗ trợ (xem bên dưới).
dynamicboolFalseCho phép kích thước input động cho các export TorchScript, ONNX, OpenVINO, TensorRT và CoreML, tăng tính linh hoạt khi xử lý các kích thước image khác nhau.
simplifyboolTrueĐơn giản hóa graph ONNX trung gian bằng onnxslim đối với các export xây dựng graph này (xem Export Formats), có khả năng cải thiện hiệu suất và khả năng tương thích với các inference engine.
opsetintNoneChỉ định phiên bản ONNX opset cho các export xây dựng graph ONNX (xem Export Formats), nhằm tương thích với các parser và runtime ONNX khác nhau. Nếu không được đặt, sử dụng phiên bản mới nhất được hỗ trợ.
workspacefloat hoặc NoneNoneĐặt kích thước workspace tối đa tính bằng GiB cho các tối ưu hóa TensorRT, cân bằng giữa mức sử dụng bộ nhớ và hiệu suất. Sử dụng None để TensorRT tự động cấp phát tối đa theo giới hạn của thiết bị.
nmsbool, tùy chọnNoneNone xuất các dự đoán thô một-nhiều cho NMS bên ngoài; True nhúng NMS nơi được hỗ trợ; False chọn phần đầu không có NMS khi khả dụng. NMS nhúng của CoreML hỗ trợ phát hiện, phân đoạn và tư thế với các hình dạng tĩnh. Xem hướng dẫn Phát hiện Đầu-cuối.
conffloatNoneNgưỡng confidence được sử dụng ở mọi nơi NMS tại thời điểm export được tạo: các export nms=True; các export detect không end-to-end của Hailo; và các export detect, pose và segment của IMX, vốn buộc sử dụng nms=True nội bộ. Mặc định là 0.25 khi không được đặt.
ioufloat0.7Ngưỡng IoU được sử dụng ở mọi nơi NMS tại thời điểm export được tạo: các export nms=True; các export detect không end-to-end của Hailo; và các export detect, pose và segment của IMX, vốn buộc sử dụng nms=True nội bộ.
max_detint300Số lượng phát hiện tối đa được giữ lại trong đầu ra của model đã xuất. Áp dụng cho các bản xuất nms=True trên mọi định dạng ngoại trừ phát hiện CoreML (vốn có pipeline NMS tự nhiên không giới hạn số lượng phát hiện), cùng với các bản xuất phát hiện end-to-end không dùng NMS (YOLO26, YOLOv10, được giới hạn ở số lượng anchor khả dụng) và các bản xuất detect, pose, segment của IMX.
agnostic_nmsboolFalseBật NMS không phụ thuộc class ở mọi nơi NMS tại thời điểm export được tạo thông qua pipeline nms=True tiêu chuẩn, bao gồm cả stage NMS riêng của CoreML, loại bỏ các box chồng lấn có score thấp hơn giữa các class khác nhau thay vì chỉ trong cùng một class. Không được áp dụng bởi cấu hình NMS riêng do Hailo hoặc IMX tạo ra; các cấu hình này không có tùy chọn không phụ thuộc class và vẫn nhận biết class bất kể flag này. Cũng được tích hợp sẵn trong các export end-to-end không cần NMS (YOLO26, YOLOv10), trong đó chỉ ngăn cùng một detection xuất hiện dưới nhiều nhãn class (các bản sao IoU=1.0), không thực hiện suppression theo ngưỡng IoU giữa các box riêng biệt.
batchint1Chỉ định kích thước batch khi inference của model xuất hoặc số lượng ảnh tối đa mà model đã xuất sẽ xử lý đồng thời ở chế độ predict. Đối với bản xuất Edge TPU, giá trị này tự động được đặt thành 1.
devicestrNoneChỉ định thiết bị dùng để xuất: GPU (device=0), CPU (device=cpu), MPS cho Apple silicon (device=mps), Huawei Ascend NPU (device=npu hoặc device=npu:0), hoặc DLA cho NVIDIA Jetson (device=dla:0 hoặc device=dla:1). Bản xuất TensorRT tự động sử dụng GPU, nhưng TensorRT 11.0 không hỗ trợ DLA.
verboseboolFalseNâng mức log của TensorRT builder lên mức VERBOSE trong quá trình xuất format='engine'. Các format xuất khác sẽ bỏ qua tùy chọn này.
datastrNoneĐường dẫn đến YAML của dataset, rất cần thiết cho việc hiệu chuẩn lượng tử hóa INT8; tác vụ classification thay vào đó nhận thư mục dataset hoặc tên dataset tích hợp sẵn. Nếu không được chỉ định khi bật INT8, Ultralytics sẽ chọn một dataset hiệu chuẩn dành riêng cho tác vụ khi cần thiết, hoặc quay về dataset mặc định cho tác vụ của model. Checkpoint được train bằng quantize=8 mang theo các khoảng INT8 của riêng checkpoint đó và không cần dữ liệu hiệu chuẩn.
splitstr'val'Split của dataset ('train', 'val' hoặc 'test') được dùng để xây dựng dataloader calibration lượng tử hóa INT8 từ data.
fractionfloat, int hoặc list1.0Subset của dataset được dùng cho calibration INT8: một tỷ lệ, số lượng ảnh hoặc các giá trị [train, val, test]. 1 nghĩa là toàn bộ split, các số nguyên lớn hơn 1 là số lượng ảnh, và chỉ entry test tùy chọn mới chấp nhận 0/0.0 với ý nghĩa không có ảnh. Các list gồm hai phần tử sẽ giữ nguyên toàn bộ test.

Việc điều chỉnh các tham số này cho phép tùy chỉnh quá trình xuất để phù hợp với các yêu cầu cụ thể, chẳng hạn như môi trường triển khai, giới hạn phần cứng và mục tiêu hiệu năng. Việc lựa chọn định dạng và cài đặt phù hợp là yếu tố thiết yếu để đạt được sự cân bằng tốt nhất giữa kích thước model, tốc độ và accuracy.

Các format export#

Các định dạng xuất YOLO26 có sẵn nằm trong bảng bên dưới. Bạn có thể xuất sang bất kỳ định dạng nào bằng cách sử dụng đối số format, tức là format='onnx' hoặc format='engine'. Bạn có thể dự đoán hoặc xác thực trực tiếp trên các model đã xuất, tức là yolo predict model=yolo26n.onnx. Các ví dụ sử dụng được hiển thị cho model của bạn sau khi quá trình xuất hoàn tất. Các model cũng có thể được xuất trực tiếp từ trình duyệt trên Ultralytics Platform mà không cần cài đặt cục bộ.

Định dạngArgument formatModelMetadataArguments
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnximgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n_openvino_model/imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n.engineimgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackageimgsz, dynamic, quantize, nms, batch, device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz, keras, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n.pbimgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz, quantize, opset, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz, batch, device
MNNmnnyolo26n.mnnimgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n_ncnn_model/imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz, batch, device
Axeleraaxelerayolo26n_axelera_model/imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnximgsz, batch, name, quantize, simplify, opset, data, fraction, device
LiteRTlitertyolo26n.tfliteimgsz, quantize, batch, data, fraction, device
Hailohailoyolo26n_hailo_model/imgsz, name, quantize, data, fraction, simplify, conf, iou
Huawei Ascendascendyolo26n_ascend_model/imgsz, batch, name, quantize, opset, simplify, nms
Apple Core AIcoreaiyolo26n.aimodelimgsz, batch, quantize

nms=None mặc định sử dụng đầu ra thô cho NMS bên ngoài. Thiết lập nms=False để chọn phần đầu không có NMS khả dụng; các định dạng không được hỗ trợ sẽ quay lại đường dẫn đầu ra gốc của chúng. Các mục nms ở trên xác định các định dạng có thể nhúng NMS bằng nms=True.

Tự động cài đặt các phụ thuộc xuất

Hầu hết các định dạng cần các gói không được cài đặt sẵn cùng với ultralytics. Khi thiếu một gói, quá trình xuất sẽ cài đặt gói đó tại thời điểm chạy bằng uv hoặc pip, và trên Linux bằng apt đối với các gói hệ thống như trình biên dịch Edge TPU hoặc Java cho IMX. Để giữ nguyên môi trường, ví dụ như trong ảnh container, công việc CI hoặc dịch vụ sản xuất, hãy đặt YOLO_AUTOINSTALL=False. Quá trình xuất khi đó vẫn kiểm tra các gói còn thiếu và báo cáo các gói đó, nhưng giữ nguyên môi trường và thất bại cho đến khi các gói đó được cài đặt.

export YOLO_AUTOINSTALL=False

Tùy chọn lượng tử hóa#

Sử dụng đối số quantize để yêu cầu độ chính xác khi xuất. Các giá trị chuỗi không phân biệt chữ hoa chữ thường và Ultralytics chuẩn hóa các bí danh được chấp nhận trước khi xuất:

Giá trị yêu cầuGiá trị chuẩn hóaÝ nghĩa
8, "8", "int8", "w8a8"8Trọng số và activation INT8
16, "16", "fp16", "w16a16"16Trọng số và activation FP16
32, "32", "fp32", "w32a32"32Xuất FP16; giống như không đặt ngoại trừ CoreML NMS ML Programs, mặc định là FP16
"w8a16""w8a16"Trọng số INT8 với activation 16-bit (FP16; INT16 trên LiteRT)
"w8a32""w8a32"Trọng số INT8 với activation FP32 (LiteRT dynamic INT8, không cần hiệu chuẩn)

Các cờ cũ half=Trueint8=True vẫn được chấp nhận kèm theo cảnh báo ngừng hỗ trợ và chuyển tiếp sang quantize=16quantize=8.

Không phải mọi định dạng xuất đều hỗ trợ mọi độ chính xác. Các yêu cầu quantize rõ ràng sẽ tạo ra độ chính xác đó hoặc thất bại trước khi xuất:

Định dạngFP32 (32/không đặt)FP16 (16)INT8 (8)W8A16 ("w8a16")Ghi chú
PyTorchKhông áp dụngKhông áp dụngKhông áp dụngĐịnh dạng huấn luyện/checkpoint gốc.
TorchScript✅ Chỉ GPUXuất TorchScript FP16 yêu cầu device=0; xuất CPU là FP32.
ONNXINT8 sử dụng dữ liệu hiệu chuẩn và lượng tử hóa tĩnh ONNX Runtime.
OpenVINOINT8 sử dụng lượng tử hóa hậu huấn luyện NNCF.
TensorRTINT8 cần dữ liệu hiệu chuẩn đại diện.
CoreML✅¹CoreML INT8 là lượng tử hóa trọng số; W8A16 sử dụng trọng số INT8 với activation FP16. ¹Các NMS ML Programs không đặt sẽ mặc định là FP16.
TF SavedModelXuất INT8 sử dụng hiệu chuẩn TensorFlow.
TF GraphDefKhông chuyển đổi độ chính xác tại thời điểm xuất.
Edge TPU✅ tự độngEdge TPU yêu cầu INT8; tính năng này được tự động bật khi không đặt.
PaddlePaddleKhông chuyển đổi độ chính xác tại thời điểm xuất.
MNNINT8 là lượng tử hóa trọng số thông qua quá trình chuyển đổi MNN.
NCNNĐịnh dạng runtime di động/nhúng.
IMX500✅ tự độngIMX500 yêu cầu lượng tử hóa; INT8 được tự động bật khi không đặt.
RKNN✅ phụ thuộc chipRK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B hỗ trợ FP16 hoặc INT8; các biến thể RV1103/RV1106 chỉ hỗ trợ INT8.
ExecuTorchKhông chuyển đổi độ chính xác tại thời điểm xuất.
Axelera✅ tự độngXuất Axelera yêu cầu INT8; tính năng này được tự động bật khi không đặt.
DEEPX✅ tự độngXuất DEEPX yêu cầu INT8; tính năng này được tự động bật khi không đặt.
Qualcomm QNN✅ tự độngXuất QNN HTP được cố định thành trọng số INT8 với activation 16-bit.
LiteRTINT8 tĩnh (8) và "w8a16" (trọng số int8 + activation int16) sử dụng dữ liệu hiệu chuẩn; cũng hỗ trợ "w8a32" INT8 động (không cần hiệu chuẩn). quantize=16 không phải là một bản xuất riêng biệt; model FP32 chạy ở định dạng FP16 lúc runtime thông qua GPU delegate.
Hailo✅ tự độngTính năng xuất Hailo yêu cầu INT8; tính năng này được tự động bật khi chưa thiết lập.
Huawei Ascend✅ tự độngCác phép tích chập Ascend AI Core chỉ chấp nhận đầu vào FP16/INT8, do đó ATC biên dịch FP16; tính năng này được tự động bật khi không đặt.
Core AIMặc định là FP32 hoặc tài sản FP16 .aimodel với quantize=16; không có đường dẫn INT8.

Đối với các bản xuất INT8 và W8A16, hãy cung cấp dữ liệu hiệu chuẩn đại diện bằng data, chẳng hạn như data="coco8.yaml", trừ khi tài liệu tích hợp mục tiêu mô tả hành vi mặc định hoặc tự động bật. Cơ chế LiteRT "w8a32" (INT8 động) không cần dữ liệu hiệu chuẩn.

Huấn luyện nhận thức lượng tử hóa#

Các bản xuất INT8 ở trên là lượng tử hóa sau huấn luyện (PTQ): các dải giá trị được quan sát trong một lượt hiệu chuẩn duy nhất trên data. Lượng tử hóa nhận biết huấn luyện (QAT) thay vào đó học các trọng số dung nạp INT8 bằng cách tinh chỉnh với lượng tử hóa giả trong vòng lặp, giúp khôi phục độ chính xác mà chỉ riêng hiệu chuẩn bị mất. Truyền quantize=8 vào train để tinh chỉnh một điểm kiểm tra đã huấn luyện trước, sau đó xuất ra như bình thường:

Ví dụ
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)  # ranges travel with the checkpoint, no calibration data needed

Sử dụng tốc độ học nhỏ khi tinh chỉnh một checkpoint đã huấn luyện trước. Huấn luyện nhận thức lượng tử hóa ban đầu có thể làm giảm độ chính xác và lợi ích của lượng tử hóa này so với lượng tử hóa hậu huấn luyện phụ thuộc vào model, tập dữ liệu và ngân sách huấn luyện. Xác thực model đã xuất so với cả checkpoint gốc và bản xuất được lượng tử hóa hậu huấn luyện; điểm số lượng tử hóa giả trong quá trình huấn luyện không xác định được độ chính xác khi triển khai.

Giá trị của QAT phụ thuộc vào mức độ xử lý mô hình của chính phần phụ trợ xuất trong quá trình hiệu chuẩn. Các giá trị bên dưới là mAP50-95 trên COCO val2017, được đo lường bằng các công cụ TensorRT 10.16 tại imgsz=640 và batch 1, trong đó mỗi điểm kiểm tra QAT được huấn luyện với epochs=20 patience=3:

ModelCông cụ FP32Công cụ PTQ INT8Công cụ QAT INT8
yolo26n0.40320.39340.3935
yolo26s0.47940.44120.4711
yolo26m0.52690.46960.5137
yolo26l0.54400.48890.5307
yolo26x0.57010.51380.5527

QAT tiêu tốn 0,008 đến 0,017 mAP50-95 so với FP32 trên toàn bộ dải, trong khi lượng tử hóa sau huấn luyện tiêu tốn 0,010 trên yolo26n và 0,038 đến 0,057 trên các mô hình lớn hơn. Vì vậy, QAT hầu như không mang lại lợi ích gì trên mô hình nhỏ nhất, nơi việc hiệu chuẩn đã hoạt động tốt, và đạt 0,030 đến 0,044 trên các mô hình còn lại. Hãy kỳ vọng các con số khác nhau trên tập dữ liệu, định dạng xuất hoặc phiên bản TensorRT khác, và hãy tự đo lường.

Các model huấn luyện nhận thức lượng tử hóa yêu cầu compile=False; các module được lượng tử hóa của ModelOpt không hỗ trợ torch.compile.

Các phép tích chập đầu ra cuối cùng của đầu được cố ý giữ nguyên ở dạng float để hạn chế mất độ chính xác INT8; TensorRT bật độ chính xác hỗn hợp FP16 cho các lớp chưa được lượng tử hóa của nó. QAT chạy thông qua NVIDIA TensorRT Model Optimizer, được cài đặt tự động trong lần sử dụng đầu tiên và checkpoint kết quả cần nó được cài đặt để tải. Các khoảng giá trị đó đi kèm với checkpoint và các bản export onnxengine phát ra chúng dưới dạng các nút Q/DQ; các định dạng khác đọc dữ liệu hiệu chuẩn thay thế và từ chối một checkpoint QAT.

Tiếp theo là gì?#

Tìm hướng dẫn tích hợp cho mục tiêu triển khai của bạn — ONNX, TensorRT, CoreML và nhiều mục khác nằm trên danh sách tích hợp đầy đủ — để biết cách chạy model đã xuất.

FAQ#

  • Việc xuất model YOLO26 sang định dạng ONNX rất đơn giản với Ultralytics. Nền tảng này cung cấp cả phương pháp Python và CLI để xuất model.

    Ví dụ
    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo26n.pt")  # load an official model
    model = YOLO("path/to/best.pt")  # load a custom-trained model
    
    # Export the model
    model.export(format="onnx")

    Để biết thêm chi tiết về quá trình này, bao gồm các tùy chọn nâng cao như xử lý các kích thước đầu vào khác nhau, hãy tham khảo hướng dẫn tích hợp ONNX.

  • Sử dụng TensorRT để xuất model mang lại những cải thiện đáng kể về hiệu năng. Các model YOLO26 được xuất sang TensorRT có thể đạt tốc độ GPU nhanh hơn tới 5 lần, rất lý tưởng cho các ứng dụng suy luận thời gian thực.

    • Tính linh hoạt: Tối ưu hóa các model cho một cấu hình phần cứng cụ thể.
    • Tốc độ: Đạt được suy luận nhanh hơn thông qua các kỹ thuật tối ưu hóa nâng cao.
    • Khả năng tương thích: Tích hợp mượt mà với phần cứng NVIDIA.

    Để tìm hiểu thêm về cách tích hợp TensorRT, hãy xem hướng dẫn tích hợp TensorRT.

  • Lượng tử hóa INT8 là một cách tuyệt vời để nén model và tăng tốc độ suy luận, đặc biệt là trên các thiết bị biên. Dưới đây là cách bạn có thể bật lượng tử hóa INT8:

    Ví dụ
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")  # Load a model
    model.export(format="onnx", quantize=8, data="coco8.yaml")

    Lượng tử hóa INT8 có thể được áp dụng cho các định dạng như ONNX, TensorRT, OpenVINO, CoreMLRockchip RKNN. Để có kết quả lượng tử hóa tối ưu, hãy cung cấp một dataset đại diện bằng cách sử dụng tham số data. Xem Tùy chọn lượng tử hóa để biết các giá trị quantize được chấp nhận và các định dạng được hỗ trợ.

  • Kích thước đầu vào động cho phép model đã xuất xử lý các kích thước hình ảnh thay đổi, mang lại tính linh hoạt và tối ưu hóa hiệu suất xử lý cho các trường hợp sử dụng khác nhau. Khi xuất sang các định dạng như ONNX hoặc TensorRT, việc bật kích thước đầu vào động đảm bảo rằng model có thể thích ứng với các hình dạng đầu vào khác nhau một cách liền mạch.

    Để bật tính năng này, hãy sử dụng cờ dynamic=True trong quá trình xuất:

    Ví dụ
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="onnx", dynamic=True)

    Kích thước đầu vào động đặc biệt hữu ích cho các ứng dụng mà kích thước đầu vào có thể thay đổi, chẳng hạn như xử lý video hoặc khi xử lý hình ảnh từ các nguồn khác nhau.

  • Hiểu và cấu hình các đối số xuất là điều cốt lõi để tối ưu hóa hiệu năng model:

    • format: Định dạng đích cho model đã xuất (ví dụ: onnx, torchscript, saved_model).
    • imgsz: Kích thước hình ảnh mong muốn cho đầu vào model (ví dụ: 640 hoặc (height, width)).
    • quantize: Độ chính xác lượng tử hóa, chẳng hạn như 8/"int8", 16/"fp16", 32/"fp32", hoặc các sơ đồ kết hợp trọng số/activation "w8a16""w8a32" (LiteRT INT8 động) trên các định dạng được hỗ trợ. Xem Tùy chọn lượng tử hóa.
    • optimize: Bật mức tối ưu hóa trình biên dịch cao hơn cho các bản xuất DEEPX.

    Để triển khai trên các nền tảng phần cứng cụ thể, hãy cân nhắc sử dụng các định dạng xuất chuyên biệt như TensorRT cho GPU NVIDIA, CoreML cho các thiết bị Apple, hoặc Edge TPU cho các thiết bị Google Coral.

  • Khi bạn xuất một model YOLO sang các định dạng như ONNX hoặc TensorRT, cấu trúc tensor đầu ra phụ thuộc vào tác vụ của model. Hiểu rõ các đầu ra này là quan trọng đối với các triển khai suy luận tùy chỉnh.

    Đối với các mô hình phát hiện YOLO26 (ví dụ: yolo26n.pt) được xuất với nms=False, các định dạng được hỗ trợ tạo ra đầu ra không có NMS có hình dạng như (batch_size, max_detections, 6) với các giá trị [x1, y1, x2, y2, confidence, class_id]. Với max_det=300 mặc định, điều này thường là (batch_size, 300, 6). Một số định dạng bị giới hạn sẽ tự động chuyển về bố cục đầu ra truyền thống khi các toán tử đầu cuối không được hỗ trợ.

    Theo mặc định (nms=None), các mô hình phát hiện bao gồm YOLO26 xuất các dự đoán một-nhiều thô: đầu ra thường là một tensor duy nhất có hình dạng như (batch_size, 4 + num_classes, num_predictions) trong đó các kênh đại diện cho tọa độ hộp cộng với điểm số theo lớp, và num_predictions phụ thuộc vào độ phân giải đầu vào xuất (và có thể là động). Hướng dẫn Phát hiện Đầu cuối đề cập đến các định dạng nào giữ lại đầu ra đầu cuối.

    Đối với các model phân đoạn (ví dụ: yolo26n-seg.pt), bạn thường nhận được hai đầu ra: tensor đầu tiên có hình dạng giống như (batch_size, 4 + num_classes + mask_dim, num_predictions) (các hộp, điểm số lớp và hệ số mặt nạ), và tensor thứ hai có hình dạng giống như (batch_size, mask_dim, proto_h, proto_w) chứa các nguyên mẫu mặt nạ được sử dụng cùng với các hệ số để tạo ra các mặt nạ thực thể. Kích thước phụ thuộc vào độ phân giải đầu vào xuất (và có thể là động).

    Đối với các model tư thế (ví dụ: yolo26n-pose.pt), tensor đầu ra thường có hình dạng giống như (batch_size, 4 + num_classes + keypoint_dims, num_predictions), trong đó keypoint_dims phụ thuộc vào đặc tả tư thế (ví dụ: số lượng điểm khóa và việc có bao gồm độ tin cậy hay không), và num_predictions phụ thuộc vào độ phân giải đầu vào xuất (và có thể là động).

    Các ví dụ trong ví dụ suy luận ONNX minh họa cách xử lý các đầu ra này cho từng loại model.

  • Ultralytics hiện không cung cấp API suy luận C++ chuyên dụng cho các model YOLO. Đối với các bản triển khai bằng C++, hãy xuất model sang một định dạng runtime như ONNX, TensorRT, TorchScript hoặc MNN, sau đó tải artifact đã xuất bằng API C++ gốc của runtime đó.

    Ví dụ, hãy xuất một mô hình phát hiện với yolo export model=yolo26n.pt format=onnx và chạy tệp .onnx bằng ONNX Runtime C++, hoặc xuất với format=engine và chạy công cụ TensorRT từ một ứng dụng C++ TensorRT. Khi bạn sử dụng hậu xử lý C++ tùy chỉnh, hãy khớp bố cục tensor đầu ra cho tác vụ và cài đặt xuất của bạn; các bản xuất phát hiện YOLO26 mặc định trả về các tensor dự đoán thô yêu cầu NMS bên ngoài. Hãy xuất với nms=False để có các phát hiện không có NMS có hình dạng (batch, max_det, 6), hoặc nms=True để nhúng NMS vào các định dạng được hỗ trợ.

  • Khi xuất bằng quantize=16 (FP16) hoặc quantize=8 (INT8), hầu hết các tensor được chuyển đổi sang độ chính xác thấp hơn để giảm kích thước model và cải thiện hiệu năng. Tuy nhiên, khi nms=False được bật, quá trình hậu xử lý (bao gồm cả chỉ mục lớp) được nhúng trực tiếp vào đồ thị đã xuất.

    Tensor output0 chứa các chỉ mục lớp, được biểu diễn nội bộ dưới dạng giá trị dấu phẩy động. FP16 không thể biểu diễn đáng tin cậy các giá trị số nguyên trên 2048 do độ chính xác phần định trị bị hạn chế. Để tránh mất mát độ chính xác tiềm ẩn hoặc ID lớp không chính xác, output0 được chủ đích giữ nguyên ở định dạng FP32.

    Hành vi này là hoàn toàn dự kiến và cũng áp dụng cho các bản xuất có độ chính xác thấp hơn hoặc được lượng tử hóa, nơi độ trung thực của chỉ mục lớp phải được bảo toàn.

    Nếu yêu cầu đầu ra FP16 đầy đủ, hãy xuất với nms=None và thực hiện xử lý hậu kỳ ở bên ngoài.

Bình luận