Xuất model bằng Ultralytics YOLO#
Giới thiệu#
Mục tiêu cuối cùng của việc huấn luyện model là triển khai model vào các ứng dụng thực tế. Export mode trong Ultralytics YOLO26 cung cấp nhiều tùy chọn linh hoạt để xuất model đã huấn luyện sang các định dạng khác nhau, giúp triển khai model trên nhiều nền tảng và thiết bị. Hướng dẫn toàn diện này sẽ giúp bạn nắm rõ các khía cạnh của quá trình xuất model, đồng thời trình bày cách đạt được khả năng tương thích và hiệu suất tối đa.
Xem bản xem trước YOLO27 chưa phát hành để biết các định dạng xuất dự kiến được hỗ trợ.
Xem: Cách xuất Ultralytics YOLO26 sang nhiều định dạng để triển khai | ONNX, TensorRT, CoreML 🚀
Vì sao nên chọn Export Mode của YOLO26?#
- Tính linh hoạt: Xuất sang nhiều định dạng, bao gồm ONNX, TensorRT, CoreML và nhiều định dạng khác.
- Hiệu suất: Tăng tốc GPU lên đến 5 lần với TensorRT và tăng tốc CPU lên đến 3 lần với ONNX hoặc OpenVINO.
- Khả năng tương thích: Giúp model có thể được triển khai phổ quát trên nhiều 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 xuất model nhanh chóng, dễ dàng.
Ví dụ sử dụng#
Xuất model YOLO26n sang định dạng khác như ONNX hoặc TensorRT. Xem mục Đối số bên dưới để biết danh sách đầy đủ các đối số xuất.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n.pt") # tải model chính thức
model = YOLO("path/to/best.pt") # # Tải model được huấn luyện tùy chỉnh
# # Xuất model
model.export(format="onnx")Đối số#
Bảng này trình bày chi tiết các cấu hình và tùy chọn có thể dùng để xuất model YOLO sang những định dạng khác nhau. Các thiết lập này rất quan trọng để tối ưu hiệu suất, kích thước và khả năng tương thích của model đã xuất trên nhiều nền tảng và môi trường. Cấu hình phù hợp đảm bảo model sẵn sàng triển khai trong ứng dụng dự kiến với hiệu quả tối ưu.
| Đối số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
format | str | 'torchscript' | Định dạng đích cho model được export, chẳng hạn 'onnx', 'torchscript', 'engine' (TensorRT) hoặ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 triển khai khác nhau. |
name | str | None | Tên mục tiêu phần cứng cho các format yêu cầu tên mục tiêu: 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'), mục tiêu Qualcomm QNN HTP (mặc định là '73'), hoặc thiết bị AMD Xilinx Versal AI Edge Series Gen 2 (mặc định là 've2-xc2ve3858', bộ kit đánh giá VEK385). Khác với cặp đặt tên lần chạy project/name được các mode khác sử dụng. |
imgsz | int hoặc tuple | 640 | Kích thước ảnh mong muốn cho đầu vào model. Có thể là số nguyên cho ảnh vuông (ví dụ: 640 cho kích thước 640×640) hoặc tuple (height, width) để chỉ định kích thước cụ thể. Nếu không truyền giá trị, quá trình export sẽ dùng lại kích thước huấn luyện được ghi trong checkpoint đã tải: các 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 một model fine-tune ghi lại giá trị imgsz mà model được huấn luyện. Model được tạo từ YAML không có kích thước huấn luyện đã ghi nhận và dùng 640. |
optimize | bool | False | Bật tối ưu hóa trình biên dịch nâng cao cho DEEPX, giảm độ trễ suy luận nhưng tăng thời gian biên dịch. |
quantize | int hoặc str | None | Độ 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 suy luận trên phần cứng được hỗ trợ) hoặc 8 (INT8/PTQ, nén model thêm với mức giảm độ chính xác tối thiểu, chủ yếu dành cho thiết bị biên; cần calibration data/fraction); 32/không đặt tương ứng với FP32. Checkpoint được huấn luyện với quantize=8 luôn được export ở INT8: onnx và engine export từ các dải giá trị có sẵn mà không cần calibration, còn các định dạng hoặc độ chính xác khác sẽ bị từ chối. 'w8a8' và 'w16a16' là bí danh của 8 và 16; các độ chính xác hỗn hợp 'w8a16' (trọng số INT8 với activation 16-bit: CoreML, LiteRT, QNN) và 'w8a32' (INT8 động: LiteRT) chỉ được các định dạng đó chấp nhận. Thay thế các flag half/int8 đã lỗi thời (half=True → 16, int8=True → 8 vẫn được chấp nhận kèm cảnh báo lỗi thời). Chỉ cho phép các độ chính xác được định dạng đích hỗ trợ (xem bên dưới). |
dynamic | bool | False | Cho phép kích thước đầu vào động khi export TorchScript, ONNX, OpenVINO, TensorRT, CoreML và MNN, tăng tính linh hoạt khi xử lý ảnh có kích thước khác nhau. |
simplify | bool | True | Đơn giản hóa đồ thị ONNX trung gian bằng onnxslim cho các định dạng export có tạo đồ thị này (xem Các định dạng Export), có thể cải thiện hiệu năng và khả năng tương thích với các engine suy luận. |
opset | int | None | Chỉ định phiên bản opset ONNX cho các định dạng export tạo đồ thị ONNX (xem Các định dạng Export), nhằm bảo đảm khả năng tương thích với các trình phân tích cú pháp và runtime ONNX khác nhau. Nếu không đặt, phiên bản mới nhất được hỗ trợ sẽ được dùng. |
workspace | float hoặc None | None | Đặ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 mức sử dụng bộ nhớ và hiệu năng. Dùng None để TensorRT tự động cấp phát tối đa theo giới hạn của thiết bị. |
nms | bool, không bắt buộc | None | None export dự đoán một-nhiều thô để dùng NMS bên ngoài; True tích hợp NMS khi được hỗ trợ; False chọn head không có NMS khi khả dụng. NMS tích hợp của CoreML hỗ trợ detect, segment và pose với shape tĩnh. Xem hướng dẫn Detection đầu-cuối. |
conf | float | None | Ngưỡng confidence được dùng ở mọi nơi tạo NMS trong quá trình export: các định dạng export nms=True; định dạng export detect không đầu-cuối của Hailo; và định dạng export detect, pose, segment của IMX, vốn buộc dùng nms=True nội bộ. Mặc định là 0.25 nếu không đặt. |
iou | float | 0.7 | Ngưỡng IoU được dùng ở mọi nơi tạo NMS trong quá trình export: các định dạng export nms=True; định dạng export detect không đầu-cuối của Hailo; và định dạng export detect, pose, segment của IMX, vốn buộc dùng nms=True nội bộ. |
max_det | int | 300 | Số lượng detection tối đa được giữ lại trong đầu ra của model đã export. Áp dụng cho các định dạng export nms=True trên mọi định dạng, ngoại trừ detection CoreML có pipeline NMS gốc không giới hạn số detection, cùng với các định dạng export detection đầu-cuối không dùng NMS (YOLO26, YOLOv10, giới hạn theo số anchor hiện có) và các định dạng export detect, pose, segment của IMX. |
agnostic_nms | bool | False | Bật NMS không phụ thuộc class ở mọi nơi tạo NMS trong quá trình export thông qua pipeline nms=True tiêu chuẩn, bao gồm cả giai đoạn NMS riêng của CoreML; tùy chọn này loại bỏ các box chồng lấp có điểm thấp hơn giữa các class khác nhau thay vì chỉ trong cùng một class. Không áp dụng với cấu hình NMS được tạo riêng của Hailo hoặc IMX; các cấu hình này không có tùy chọn không phụ thuộc class và vẫn xét class bất kể flag này. Tùy chọn này cũng được tích hợp sẵn trong các định dạng export đầu-cuối không dùng NMS (YOLO26, YOLOv10), tại đó nó chỉ ngăn cùng một detection xuất hiện dưới nhiều nhãn class (các bản trùng IoU=1.0), chứ không loại bỏ các box riêng biệt dựa trên ngưỡng IoU. |
batch | int | 1 | Chỉ định batch inference của model export hoặc số lượng ảnh tối đa mà model đã export xử lý đồng thời ở mode predict. Các format không có batch trong tham số export (Edge TPU, IMX500, DEEPX, Hailo, AMD Xilinx) sẽ export batch 1 và từ chối các giá trị khác. |
device | str | None | Chỉ định thiết bị dùng để export: GPU (device=0), CPU (device=cpu), MPS cho Apple silicon (device=mps), NPU Huawei Ascend (device=npu hoặc device=npu:0) hoặc DLA cho NVIDIA Jetson (device=dla:0 hoặc device=dla:1). Các định dạng export TensorRT tự động dùng GPU, nhưng TensorRT 11.0 không hỗ trợ DLA. |
verbose | bool | False | Tăng mức độ nhật ký của TensorRT builder lên VERBOSE trong quá trình export format='engine'. Các định dạng export khác bỏ qua tùy chọn này. |
data | str | None | Đường dẫn đến YAML của dataset, cần thiết để calibration lượng tử hóa INT8; với phân loại, thay vào đó hãy cung cấp thư mục dataset hoặc tên dataset tích hợp sẵn. Nếu không chỉ định khi bật INT8, Ultralytics sẽ chọn dataset calibration phù hợp với tác vụ khi cần hoặc dùng dataset mặc định cho tác vụ của model. Checkpoint được huấn luyện với quantize=8 có sẵn các dải giá trị INT8 riêng và không cần dữ liệu calibration. |
split | str | 'val' | Phần chia dataset ('train', 'val' hoặc 'test') dùng để tạo dataloader calibration lượng tử hóa INT8 từ data. |
fraction | float, int hoặc list | 1.0 | Tập con dataset dùng cho calibration INT8: tỷ lệ, số lượng ảnh hoặc các giá trị [train, val, test]. 1 có nghĩa là toàn bộ phần chia; số nguyên lớn hơn 1 là số lượng ảnh; chỉ mục test không bắt buộc mới chấp nhận 0/0.0 với nghĩa là không dùng mục nào. Danh sách hai mục sẽ giữ nguyên toàn bộ test. |
Điều chỉnh các tham số này cho phép tùy chỉnh quy trình xuất theo 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 suất. Việc chọn định dạng và thiết lập 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, tốc độ và độ chính xác của model.
Các định dạng xuất#
Các định dạng xuất YOLO26 hiện có được liệt kê trong bảng bên dưới. Bạn có thể xuất sang bất kỳ định dạng nào bằng đối số format, ví dụ: format='onnx' hoặc format='engine'. Bạn có thể chạy dự đoán hoặc xác thực trực tiếp trên model đã xuất, ví dụ: yolo predict model=yolo26n.onnx. Sau khi quá trình xuất hoàn tất, các ví dụ sử dụng sẽ được hiển thị cho model của bạn. Bạn cũng có thể xuất model trực tiếp từ trình duyệt trên Ultralytics Platform mà không cần thiết lập cục bộ.
| Định dạng | Đối số format | Model | Metadata | Đối số |
|---|---|---|---|---|
| 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 mặc định xuất đầu ra thô cho NMS bên ngoài. Đặt nms=False để chọn một head không dùng NMS hiện có; các định dạng không được hỗ trợ sẽ chuyển về luồng đầu ra gốc. Các mục nms ở trên xác định những định dạng có thể tích hợp NMS với nms=True.
Hầu hết định dạng cần các package không được cài đặt cùng với ultralytics. Khi thiếu package, quá trình xuất sẽ cài đặt package đó khi chạy bằng uv hoặc pip, và trên Linux sẽ dùng apt để cài các package hệ thống như Java cho IMX. Trình biên dịch Edge TPU được tải xuống mà không cần apt hoặc sudo. Để giữ nguyên môi trường, chẳng hạn như trong image container, CI job hoặc dịch vụ production, hãy đặt YOLO_AUTOINSTALL=False. Quá trình xuất vẫn kiểm tra và báo cáo các package còn thiếu, nhưng không thay đổi môi trường và sẽ thất bại cho đến khi các package đó được cài đặt.
export YOLO_AUTOINSTALL=FalseTùy chọn lượng tử hóa#
Dùng đối số quantize để yêu cầu độ chính xác khi xuất. Giá trị chuỗi không phân biệt chữ hoa, chữ thường; Ultralytics chuẩn hóa các alias được chấp nhận trước khi xuất:
| Giá trị yêu cầu | Giá trị chuẩn | Ý nghĩa |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | Trọng số và activation INT8 |
16, "16", "fp16", "w16a16" | 16 | Trọng số và activation FP16 |
32, "32", "fp32", "w32a32" | 32 | Xuất FP32; giống như khi không thiết lập, ngoại trừ CoreML NMS ML Programs mặc định dùng 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 (INT8 động của LiteRT, không cần hiệu chuẩn) |
Các flag cũ half=True và int8=True vẫn được chấp nhận kèm cảnh báo ngừng hỗ trợ và chuyển tiếp sang quantize=16 và quantize=8.
Không phải định dạng xuất nào cũng hỗ trợ mọi độ chính xác. Các yêu cầu rõ ràng về quantize sẽ tạo ra độ chính xác đó hoặc thất bại trước khi xuất:
| Định dạng | FP32 (32/không thiết lập) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Ghi chú |
|---|---|---|---|---|---|
| PyTorch | ✅ | Không áp dụng | Không áp dụng | Không áp dụng | Định dạng huấn luyện/checkpoint gốc. |
| TorchScript | ✅ | ✅ Chỉ GPU | ❌ | ❌ | Xuất TorchScript FP16 yêu cầu device=0; xuất trên CPU sẽ dùng FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 sử dụng lượng tử hóa tĩnh của ONNX Runtime và dữ liệu hiệu chuẩn. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 sử dụng lượng tử hóa sau huấn luyện của NNCF. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 cần dữ liệu hiệu chuẩn đại diện. |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | INT8 của CoreML là lượng tử hóa trọng số; W8A16 sử dụng trọng số INT8 với activation FP16. ¹ NMS ML Programs khi không thiết lập mặc định dùng FP16, và các model segment/pose được xuất bằng nms=True luôn dùng FP16. |
| Core AI | ✅ | ✅ | ❌ | ❌ | Mặc định dùng FP32 hoặc dùng tài sản FP16 .aimodel với quantize=16; không có quy trình INT8. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | Xuất INT8 sử dụng hiệu chuẩn TensorFlow. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Không chuyển đổi độ chính xác trong quá trình xuất. |
| Edge TPU | ❌ | ❌ | ✅ tự động | ❌ | Edge TPU yêu cầu INT8; tính năng này được bật tự động khi không thiết lập. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | INT8 tĩnh (8) và "w8a16" (trọng số int8 + activation int16) sử dụng dữ liệu hiệu chuẩn; đồng thời hỗ trợ INT8 động "w8a32" (không cần hiệu chuẩn). quantize=16 không phải là một định dạng xuất riêng; model FP32 chạy ở FP16 trong thời gian thực thi thông qua GPU delegate. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Không chuyển đổi độ chính xác trong quá trình xuất. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 là lượng tử hóa trọng số thông qua quá trình chuyển đổi MNN. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Định dạng runtime cho thiết bị di động/nhúng. |
| IMX500 | ❌ | ❌ | ✅ tự động | ❌ | IMX500 yêu cầu lượng tử hóa; INT8 được bật tự động khi không thiết lập. |
| RKNN | ❌ | ✅ tùy thuộc vào chip | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B hỗ trợ FP16 hoặc INT8; các biến thể RV1103/RV1106 chỉ hỗ trợ INT8. |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | Không chuyển đổi độ chính xác trong quá trình xuất. |
| Axelera | ❌ | ❌ | ✅ tự động | ❌ | Xuất Axelera yêu cầu INT8; tính năng này được bật tự động khi không thiết lập. |
| DEEPX | ❌ | ❌ | ✅ tự động | ❌ | Xuất DEEPX yêu cầu INT8; tính năng này được bật tự động khi không thiết lập. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ tự động | Xuất QNN HTP cố định ở trọng số INT8 với activation 16-bit. |
| Hailo | ❌ | ❌ | ✅ tự động | ❌ | Xuất Hailo yêu cầu INT8; tính năng này được bật tự động khi không thiết lập. |
| Huawei Ascend | ❌ | ✅ tự động | ❌ | ❌ | Các phép tích chập của Ascend AI Core chỉ nhận đầu vào FP16/INT8, vì vậy ATC biên dịch sang FP16; tính năng này được bật tự động khi không thiết lập. |
| AMD Xilinx | ❌ | ❌ | ✅ tự động | ❌ | AMD Xilinx yêu cầu Vitis AI INT8 khi export (VINT8); tùy chọn này sẽ tự động được bật nếu chưa được thiết lập. |
Đối với 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 về tích hợp mục tiêu nêu rõ hành vi mặc định hoặc tự động bật. Phương pháp "w8a32" (INT8 động) của LiteRT không cần dữ liệu hiệu chuẩn.
Huấn luyện nhận biết lượng tử hóa#
Các bản xuất INT8 ở trên sử dụng lượng tử hóa sau huấn luyện (PTQ): các khoảng giá trị được ghi nhận trong một lượt hiệu chuẩn duy nhất trên data. Thay vào đó, huấn luyện nhận biết lượng tử hóa (QAT) học các trọng số có thể chịu được INT8 bằng cách fine-tune với lượng tử hóa giả trong vòng lặp, giúp khôi phục độ chính xác bị mất chỉ với hiệu chuẩn. Truyền quantize=8 vào train để fine-tune checkpoint đã huấn luyện trước, sau đó xuất như bình thường:
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) # các khoảng giá trị được lưu cùng checkpoint, không cần dữ liệu hiệu chuẩnHãy dùng learning rate nhỏ khi fine-tune checkpoint đã huấn luyện trước. QAT ban đầu có thể làm giảm độ chính xác, và lợi ích so với lượng tử hóa sau huấn luyện phụ thuộc vào model, dataset và ngân sách huấn luyện. Xác thực model đã xuất bằng cách so sánh với cả checkpoint gốc lẫn bản xuất đã lượng tử hóa sau huấn luyện; điểm số lượng tử hóa giả trong quá trình huấn luyện không chứng minh được độ chính xác khi triển khai.
Mức độ hữu ích của QAT phụ thuộc vào khả năng hiệu chuẩn riêng của backend xuất đối với model. Các giá trị dưới đây là mAP50-95 trên COCO val2017, được đo bằng engine TensorRT 10.16 tại imgsz=640 và batch 1; mỗi checkpoint QAT được huấn luyện bằng epochs=20 patience=3:
| Model | Engine FP32 | Engine PTQ INT8 | Engine 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 |
QAT làm giảm 0.008 đến 0.017 mAP50-95 so với FP32 trong toàn dải, trong khi lượng tử hóa sau huấn luyện làm giảm 0.010 trên yolo26n và 0.038 đến 0.057 trên các model lớn hơn. Vì vậy, QAT hầu như không mang lại lợi ích trên model nhỏ nhất, nơi hiệu chuẩn đã hoạt động tốt, nhưng cải thiện 0.030 đến 0.044 trên các model còn lại. Kết quả có thể khác trên dataset, định dạng xuất hoặc phiên bản TensorRT khác; hãy tự đo lường.
Model QAT yêu cầu compile=False; các module đã 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 head được cố ý giữ ở dạng float để hạn chế suy giảm độ chính xác INT8; TensorRT bật độ chính xác hỗn hợp FP16 cho các layer chưa được lượng tử hóa. 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; cần cài đặt công cụ này để tải checkpoint tạo ra. Các khoảng giá trị đó được lưu cùng checkpoint, và các bản xuất onnx và engine xuất chúng dưới dạng node Q/DQ; các định dạng khác sử dụng dữ liệu hiệu chuẩn thay thế và từ chối 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 — có ONNX, TensorRT, CoreML và nhiều định dạng khác trong danh sách tích hợp đầy đủ — để biết cách chạy model đã xuất.
Câu hỏi thường gặp#
Việc xuất model YOLO26 sang định dạng ONNX rất đơn giản với Ultralytics. Ultralytics cung cấp cả phương thức Python và CLI để xuất model.
Ví dụfrom ultralytics import YOLO # Tải model model = YOLO("yolo26n.pt") # tải model chính thức model = YOLO("path/to/best.pt") # # Tải model được huấn luyện tùy chỉnh # # Xuất model model.export(format="onnx")Để biết thêm chi tiết về quy trình, bao gồm các tùy chọn nâng cao như xử lý nhiều 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 giúp cải thiện đáng kể hiệu năng. Model YOLO26 được xuất sang TensorRT có thể tăng tốc GPU lên đến 5 lần, rất phù hợp cho các ứng dụng suy luận thời gian thực.
- Tính linh hoạt: Tối ưu hóa model cho cấu hình phần cứng cụ thể.
- Tốc độ: Tăng tốc suy luận nhờ các phương pháp tối ưu hóa tiên tiến.
- Khả năng tương thích: Tích hợp liền mạch với phần cứng NVIDIA.
Để tìm hiểu thêm về 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 hiệu quả để nén model và tăng tốc suy luận, đặc biệt trên các thiết bị biên. Sau đây là cách bật lượng tử hóa INT8:
Ví dụfrom ultralytics import YOLO model = YOLO("yolo26n.pt") # Tải model model.export(format="onnx", quantize=8, data="coco8.yaml")Có thể áp dụng lượng tử hóa INT8 cho các format như ONNX, TensorRT, OpenVINO, CoreML, Rockchip RKNN và AMD Xilinx. Để đạt kết quả lượng tử hóa tối ưu, hãy cung cấp một dataset đại diện bằ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 format đượ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 ảnh khác nhau, mang lại tính linh hoạt và tối ưu hiệu quả xử lý cho nhiều trường hợp sử dụng. Khi xuất sang các định dạng như ONNX hoặc TensorRT, bật kích thước đầu vào động giúp model thích ứng liền mạch với các shape đầu vào khác nhau.
Để bật tính năng này, hãy sử dụng flag
dynamic=Truetrong quá trình xuất:Ví dụfrom ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)Đặt kích thước đầu vào động đặc biệt hữu ích cho các ứng dụng có thể nhận đầu vào với kích thước thay đổi, chẳng hạn như xử lý video hoặc xử lý ảnh từ các nguồn khác nhau.
Model PyTorch và các bản xuất động mặc định sử dụng padding hình chữ nhật tối thiểu, trong khi các bản xuất tĩnh đệm đến hết
imgsz, vì vậy các detection gần ngưỡng confidence có thể khác nhau. Dùngrect=Falseđể suy luận gốc nhằm khớp với bản xuất tĩnh, hoặc xuất bằngdynamic=Truenếu được hỗ trợ.Hiểu và cấu hình các tham số xuất là yếu tố then chốt để tối ưu hiệu năng model:
format:Định dạng đích của model đã xuất (ví dụ:onnx,torchscript,saved_model).imgsz:Kích thước ảnh mong muốn cho đầu vào của model (ví dụ:640hoặ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 phương pháp kết hợp trọng số/activation"w8a16"và"w8a32"(INT8 động của LiteRT) trên các định dạng được hỗ trợ. Xem Tùy chọn lượng tử hóa.dynamic:Chấp nhận kích thước đầu vào thay đổi trên các định dạng hỗ trợ dynamic shape, chẳng hạn như ONNX, OpenVINO và TensorRT.nms:Chọn đầu ra thô cho NMS bên ngoài (None), NMS tích hợp (True) hoặc head không dùng NMS (False).device:Thiết bị dùng để trace model trong quá trình xuất, chẳng hạn nhưcpuhoặc0cho GPU CUDA đầu tiên; TorchScript FP16 yêu cầu GPU.
Để 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 thiết bị Apple hoặc Edge TPU cho thiết bị Google Coral.
Khi xuấ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. Việc hiểu rõ các đầu ra này rất quan trọng khi triển khai suy luận tùy chỉnh.
Đối với model phát hiện YOLO26 (ví dụ:
yolo26n.pt) được xuất bằngnms=False, các định dạng được hỗ trợ tạo ra đầu ra không dùng 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ớimax_det=300mặc định, đầu ra 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 không hỗ trợ các toán tử end-to-end.Theo mặc định (
nms=None), các model phát hiện, bao gồm YOLO26, xuất các dự đoán thô one-to-many: đầ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 biểu thị tọa độ hộp cộng với điểm số theo từng lớp, cònnum_predictionsphụ thuộc vào độ phân giải đầu vào khi xuất (và có thể động). Hướng dẫn phát hiện end-to-end trình bày những định dạng nào giữ nguyên đầu ra end-to-end.Đối với model phân đoạn (ví dụ:
yolo26n-seg.pt), thông thường sẽ có hai đầu ra: tensor đầu tiên có hình dạng như(batch_size, 4 + num_classes + mask_dim, num_predictions)(hộp, điểm số lớp và hệ số mask), còn tensor thứ hai có hình dạng như(batch_size, mask_dim, proto_h, proto_w), chứa các prototype mask được dùng cùng với các hệ số để tạo mask cho từng instance. Kích thước phụ thuộc vào độ phân giải đầu vào khi xuất (và có thể động).Đối với model pose (ví dụ:
yolo26n-pose.pt), tensor đầu ra thường có hình dạng như(batch_size, 4 + num_classes + keypoint_dims, num_predictions), trong đókeypoint_dimsphụ thuộc vào đặc tả pose (ví dụ: số lượng keypoint và việc có bao gồm độ tin cậy hay không), cònnum_predictionsphụ thuộc vào độ phân giải đầu vào khi xuất (và có thể động).Các ví dụ trong ví dụ suy luận ONNX minh họa cách xử lý những đầu ra này cho từng loại model.
Hiện Ultralytics chưa cung cấp API suy luận C++ chuyên biệt cho các model YOLO. Để triển khai bằng C++, hãy xuất model sang định dạng runtime như ONNX, TensorRT, TorchScript hoặc MNN, sau đó nạp artifact đã xuất bằng API C++ gốc của runtime đó.
Ví dụ: xuất model phát hiện bằng
yolo export model=yolo26n.pt format=onnxrồi chạy tệp.onnxbằng ONNX Runtime C++, hoặc xuất bằngformat=enginerồi chạy engine TensorRT từ ứng dụng TensorRT C++. Khi sử dụng hậu xử lý C++ tùy chỉnh, hãy khớp bố cục tensor đầu ra với tác vụ và cài đặt xuất; các bản xuất phát hiện YOLO26 mặc định trả về tensor dự đoán thô cần NMS bên ngoài. Xuất bằngnms=Falseđể có đầu ra phát hiện không dùng NMS với hình dạng(batch, max_det, 6), hoặc dùngnms=Trueđể tích hợp NMS vào các định dạng được hỗ trợ.Khi xuất bằng
quantize=16(FP16) hoặcquantize=8(INT8), phần lớn tensor được chuyển 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 bậtnms=False, bước hậu xử lý (bao gồm chỉ số lớp) được tích hợp trực tiếp vào graph đã xuất.Tensor
output0chứa chỉ số lớp, vốn được biểu diễn nội bộ dưới dạng giá trị dấu phẩy động. Do độ chính xác phần định trị hạn chế, FP16 không thể biểu diễn đáng tin cậy các giá trị số nguyên lớn hơn 2048. Để tránh nguy cơ mất độ chính xác hoặc sai ID lớp,output0được giữ ở định dạng FP32.Nếu cần đầu ra hoàn toàn ở FP16, hãy xuất bằng
nms=Nonetrên GPU và thực hiện hậu xử lý bên ngoài. Các bản xuất ONNX FP16 trên CPU vẫn giữ đầu vào và đầu ra FP32, chỉ chuyển đổi graph nội bộ.