Xuất Model với Ultralytics YOLO#
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ế độ Export trong Ultralytics YOLO26 cung cấp hàng loạt 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 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 giới thiệu cho bạn các sắc thái của việc xuất model, minh họa cách đạt được khả năng tương thích và hiệu suất tối đa.
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Tại sao nên chọn chế độ Export của YOLO26?#
- Tính linh hoạt: Xuất ra nhiều định dạng khác nhau bao gồm ONNX, TensorRT, CoreML và nhiều định dạng khác.
- Hiệu năng: Đạt được tốc độ xử lý GPU nhanh hơn tới 5 lần với TensorRT và nhanh hơn tới 3 lần trên CPU 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 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 việc xuất model nhanh chóng và trực diện.
Các tính năng chính của chế độ Export#
Dưới đây là một số chức năng nổi bật:
- Xuất một lần bấm: 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ô (batch inference).
- 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 chuyên sâu để có trải nghiệm xuất model mượt mà.
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 Arguments bên dưới để có danh sách đầy đủ các tham số xuất.
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")Tham số#
Bảng này trình bà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. Những cài đặt này rất quan trọng để tối ưu hóa 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 đúng cách đả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ố | Loại | Mặc định | Mô tả |
|---|---|---|---|
format | str | 'torchscript' | Định dạng mục tiêu cho model được xuất, chẳng hạn như 'onnx', 'torchscript', 'engine' (TensorRT) hoặc các định dạng khác. Mỗi định dạng mang lại khả năng tương thích với các môi trường triển khai khác nhau. |
name | str | None | Tên đích phần cứng cho các định dạng yêu cầu: kiến trúc Hailo ('hailo8', 'hailo8l', 'hailo10h', 'hailo15h', 'hailo15l'; mặc định là 'hailo8l'), chip Rockchip RKNN (mặc định là 'rk3588'), Huawei Ascend SoC (một --soc_version CANN; mặc định là 'Ascend310B4'), hoặc đích Qualcomm QNN HTP (mặc định là '73'). Khác biệt với cặp đặt tên chạy project/name được sử dụng bởi các chế độ khác. |
imgsz | int hoặc tuple | 640 | Kích thước ảnh mong muốn cho đầu vào của model. Có thể là một số nguyên cho ảnh vuông (ví dụ: 640 cho 640×640) hoặc một tuple (height, width) cho các kích thước cụ thể. |
keras | bool | False | Bật xuất 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. |
optimize | bool | False | Cho phép tối ưu hóa trình biên dịch cao hơn cho DEEPX, giúp giảm độ trễ inference trong khi 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 hơn nữa với mức suy giảm độ chính xác tối thiểu, chủ yếu cho thiết bị biên (edge device); cần hiệu chuẩn data/fraction); 32/bỏ trống là FP32. Các định dạng xuất 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 đã lỗi thời (half=True → 16, int8=True → 8, vẫn được chấp nhận kèm theo cảnh báo lỗi thời). Chỉ cho phép các mức độ chính xác được hỗ trợ bởi định dạng mục tiêu (xem bên dưới). |
dynamic | bool | False | Cho phép kích thước đầu vào động đối với các định dạng xuất TorchScript, ONNX, OpenVINO, TensorRT và CoreML, giúp tăng tính linh hoạt khi xử lý các kích thước ảnh khác nhau. |
simplify | bool | True | Đơn giản hóa đồ thị ONNX trung gian với onnxslim đối với các bản xuất có tạo đồ thị này (xem Định dạng Xuất), có khả năng cải thiện hiệu suất và khả năng tương thích với các công cụ suy luận. |
opset | int | None | Chỉ định phiên bản ONNX opset cho các bản xuất tạo đồ thị ONNX (xem Định dạng Xuất), nhằm tương thích với các bộ phân tích cú pháp và runtime ONNX khác nhau. Nếu không được đặt, sử dụng phiên bản được hỗ trợ mới nhất. |
workspace | float hoặc None | None | Đặt kích thước vùng làm việc tối đa tính bằng GiB cho các tối ưu hóa TensorRT, cân bằng giữa việc sử dụng bộ nhớ và hiệu suất. Sử dụng None để TensorRT tự động phân bổ lên đến mức tối đa của thiết bị. |
nms | bool | False | Thêm Non-Maximum Suppression (NMS) vào model được xuất khi được hỗ trợ (xem Định dạng Xuất), giúp cải thiện hiệu quả hậu xử lý phát hiện. Không khả dụng cho các model end2end. Đối với CoreML, chỉ được hỗ trợ cho các model phát hiện. |
conf | float | None | Ngưỡng confidence được sử dụng bất cứ khi nào NMS tại thời điểm export được tạo: export nms=True; export phát hiện không phải end-to-end của Hailo; và export phát hiện, pose và segment của IMX (các tính năng này ép buộc nms=True ở bên trong). Mặc định là 0.25 khi không được thiết lập, ngoại trừ export của IMX có mặc định là 0.001. |
iou | float | 0.7 | Ngưỡng IoU được sử dụng bất cứ khi nào NMS tại thời điểm export được tạo: export nms=True; export phát hiện không phải end-to-end của Hailo; và export phát hiện, pose và segment của IMX (các tính năng này ép buộc nms=True ở bên trong). |
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 export nms=True trên mọi định dạng ngoại trừ CoreML, vì pipeline NMS của CoreML không có giới hạn detection, cùng với các export 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 export phát hiện, pose, segment của IMX. |
agnostic_nms | bool | False | Bật NMS bất chấp lớp ở bất cứ đâu NMS thời điểm xuất được tạo thông qua chuỗi nms=True chuẩn, bao gồm cả giai đoạn NMS của riêng CoreML, triệt tiêu các hộp chồng chéo có điểm số thấp hơn trên các lớp khác nhau thay vì chỉ trong cùng một lớp. Không được hỗ trợ bởi các cấu hình NMS do Hailo hoặc IMX tự tạo, vốn không có tùy chọn bất chấp lớp và vẫn nhận thức lớp bất kể cờ này. Cũng được tích hợp sẵn trong các bản xuất đầu cuối không có NMS (YOLO26, YOLOv10), nơi tính năng này chỉ ngăn chặn cùng một kết quả phát hiện xuất hiện dưới nhiều nhãn lớp (các bản sao có IoU=1.0), chứ không phải triệt tiêu theo ngưỡng IoU giữa các hộp riêng biệt. |
batch | int | 1 | Chỉ định kích thước suy luận batch của model xuất hoặc số lượng ảnh tối đa mà model được xuất sẽ xử lý đồng thời ở chế độ predict. Đối với các bản xuất Edge TPU, giá trị này được tự động đặt thành 1. |
device | str | None | Chỉ định thiết bị để 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). Các bản xuất TensorRT tự động sử dụng GPU, nhưng TensorRT 11.0 không hỗ trợ DLA. |
verbose | bool | True | Nâng mức nhật ký trình xây dựng TensorRT lên mức độ nghiêm trọng VERBOSE trong quá trình xuất format='engine'. Các định dạng xuất khác sẽ bỏ qua điều này. |
data | str | None | Đường dẫn đến YAML của tập dữ liệu, rất cần thiết cho việc hiệu chuẩn lượng tử hóa INT8; tác vụ phân loại thay vào đó sẽ nhận một thư mục tập dữ liệu hoặc tên tập dữ liệu có sẵn. Nếu không được chỉ định khi bật INT8, Ultralytics sẽ chọn một tập dữ liệu hiệu chuẩn cụ thể cho tác vụ nếu cần, hoặc quay lại tập dữ liệu mặc định cho tác vụ mô hình. |
split | str | 'val' | Phân chia tập dữ liệu ('train', 'val', hoặc 'test') được sử dụng để xây dựng trình nạp dữ liệu hiệu chuẩn lượng tử hóa INT8 từ data. |
fraction | float | 1.0 | Chỉ định phân đoạn của dataset để sử dụng cho hiệu chuẩn lượng tử hóa INT8. Cho phép hiệu chuẩn trên một tập hợp con của toàn bộ dataset, hữu ích cho các thử nghiệm hoặc khi tài nguyên hạn chế. Nếu không được chỉ định trong khi INT8 đã được bật, toàn bộ dataset sẽ được sử dụng. |
end2end | bool | None | Ghi đè chế độ end-to-end trong các model YOLO hỗ trợ suy luận không cần NMS (YOLO26, YOLOv10). Đặt giá trị thành False cho phép bạn xuất các model này để tương thích với pipeline hậu xử lý dựa trên NMS truyền thống. Xem Hướng dẫn Phát hiện End-to-End để biết chi tiết. |
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à điều cần thiết để đạt được sự cân bằng tốt nhất giữa kích thước model, tốc độ và độ chính xác.
Các định dạng xuất#
Các định dạng xuất YOLO26 khả dụng đượ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 cách sử dụng đối số format, tức là format='onnx' hoặc format='engine'. Bạn có thể thực hiện predict hoặc validate 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. 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 thiết lập cục bộ.
| Định dạng | Đối số format | Mô hình | Metadata | Tham 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 |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, 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 |
| 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 |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
Các 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 sẽ chuẩn hóa các bí danh được chấp nhận trước khi xuất:
| Giá trị yêu cầu | Giá trị chuẩn hóa | Ý nghĩa |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | Trọng số và kích hoạt INT8 |
16, "16", "fp16", "w16a16" | 16 | Trọng số và kích hoạt 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 là FP16 |
"w8a16" | "w8a16" | Trọng số INT8 với kích hoạt 16-bit (FP16; INT16 trên LiteRT) |
"w8a32" | "w8a32" | Trọng số INT8 với kích hoạt FP32 (LiteRT dynamic INT8, không cần hiệu chuẩn) |
Các cờ cũ half=True và int8=True vẫn được chấp nhận kèm theo cảnh báo không khuyến khích sử dụng và được chuyển tiếp sang quantize=16 và quantize=8.
Không phải mọi định dạng xuất đều hỗ trợ mọi mức độ chính xác. Các yêu cầu quantize rõ ràng sẽ tạo ra đúng mức độ chính xác đó hoặc thất bại trước khi xuất:
| Định dạng | FP32 (32/chưa thiết lập) | FP16 (16) | INT8 (8) | W8A16 ("w8a16") | Lưu ý |
|---|---|---|---|---|---|
| PyTorch | ✅ | N/A | N/A | N/A | Định dạng huấn luyện/checkpoint gốc. |
| TorchScript | ✅ | ✅ Chỉ dành cho GPU | ❌ | ❌ | Việc xuất TorchScript FP16 yêu cầu device=0; quá trình xuất trên CPU là FP32. |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 sử dụng phương pháp lượng tử hóa tĩnh và dữ liệu hiệu chuẩn của ONNX Runtime. |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 sử dụng phương pháp lượng tử hóa hậu huấn luyện NNCF. |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 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 các trọng số INT8 với các kích hoạt FP16. ¹Các NMS ML Programs không thiết lập sẽ mặc định là FP16. |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | Xuất INT8 sử dụng phương pháp hiệu chuẩn của TensorFlow. |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | Không thực hiện chuyển đổi độ chính xác tại thời điểm xuất. |
| Edge TPU | ❌ | ❌ | ✅ tự động | ❌ | Edge TPU yêu cầu INT8; nó sẽ tự động được kích hoạt khi không được thiết lập. |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | Không thực hiện chuyển đổi độ chính xác tại thời điểm xuất. |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 là lượng tử hóa trọng số thông qua chuyển đổi MNN. |
| NCNN | ✅ | ✅ | ❌ | ❌ | Định dạng runtime dành cho thiết bị di động/nhúng. |
| IMX500 | ❌ | ❌ | ✅ tự động | ✅ | IMX500 yêu cầu lượng tử hóa; INT8 sẽ tự động được kích hoạt khi không được thiết lập. |
| RKNN | ❌ | ✅ phụ 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 thực hiện chuyển đổi độ chính xác tại thời điểm xuất. |
| Axelera | ❌ | ❌ | ✅ tự động | ❌ | Xuất Axelera yêu cầu INT8; nó sẽ tự động được kích hoạt khi không được thiết lập. |
| DEEPX | ❌ | ❌ | ✅ tự động | ❌ | Xuất DEEPX yêu cầu INT8; nó sẽ tự động được kích hoạt khi không được thiết lập. |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ tự động | Xuất QNN HTP được cố định ở trọng số INT8 với activation 16-bit. |
| LiteRT | ✅ | ❌ | ✅ | ✅ | INT8 tĩnh (8) và "w8a16" (trọng số int8 + phần kích hoạt int16) sử dụng dữ liệu hiệu chuẩn; ngoài ra còn hỗ trợ INT8 động "w8a32" (không cần hiệu chuẩn). quantize=16 không phải là một kiểu xuất riêng biệt; một model FP32 sẽ chạy ở định dạng FP16 khi thực thi thông qua GPU delegate. |
| Huawei Ascend | ❌ | ✅ tự động | ❌ | ❌ | Các phép chập của 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 chưa được thiết lập. |
Đố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 của mục tiêu quy định 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.
Các bước tiếp theo#
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 định dạng khác có trên 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#
Làm thế nào để xuất model YOLO26 sang định dạng ONNX?#
Việc xuất model YOLO26 sang định dạng ONNX rất đơn giản với Ultralytics. Nó cung cấp cả phương pháp Python và CLI để xuất model.
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ề quy trình, 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.
Lợi ích của việc sử dụng TensorRT để xuất model là gì?#
Sử dụng TensorRT để xuất model mang lại những cải thiện hiệu suất đáng kể. 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 model cho một thiết lập phần cứng cụ thể.
- Tốc độ: Đạt được suy luận nhanh hơn thông qua các 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àm thế nào để bật lượng tử hóa INT8 khi xuất model YOLO26 của tôi?#
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ị edge. Dưới đây là cách bạn có thể bật lượng tử hóa INT8:
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, CoreML và Rockchip 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ợ.
Tại sao kích thước đầu vào động lại quan trọng khi xuất model?#
Kích thước đầu vào động cho phép model đã xuất xử lý các kích thước ảnh thay đổi, mang lại tính linh hoạt và tối ưu hóa hiệu quả 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 giúp đảm bảo model có thể thích ứng mượt mà với các hình dạng đầu vào khác nhau.
Để bật tính năng này, hãy sử dụng cờ dynamic=True trong quá trình xuất:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)Việc đặt 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.
Các tham số xuất chính cần cân nhắc để tối ưu hóa hiệu suất model là gì?#
Việc hiểu và cấu hình các tham số xuất là rất quan trọng để tối ưu hóa hiệu suất model:
format:Định dạng đích cho model đã xuất (ví dụ:onnx,torchscript,tensorflow).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 cơ chế trọng số/kích hoạt kết hợp"w8a16"và"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:Cho phép tối ưu hóa trình biên dịch cao hơn cho các bản xuất DEEPX.
Đối với việc 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.
Các tensor đầu ra đại diện cho cái gì trong các model YOLO đã xuất?#
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. Việc hiểu các đầu ra này là rất quan trọng cho việc triển khai suy luận tùy chỉnh.
Đối với model phát hiện YOLO26 (ví dụ: yolo26n.pt), việc xuất đầu cuối (end-to-end) được bật mặc định ở các định dạng hỗ trợ tính năng này, do đó đầu ra có hình dạng giố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, cấu trúc này thường là (batch_size, 300, 6). Một số định dạng bị giới hạn sẽ tự động quay trở lại bố cục đầu ra truyền thống khi không hỗ trợ các toán tử đầu cuối.
Đối với các model phát hiện không phải đầu cuối hoặc các model YOLO26 được xuất với end2end=False, đầ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 từng lớp, và num_predictions phụ thuộc vào độ phân giải đầu vào khi xuất (và có thể là động).
Đối với model phân đoạn (segmentation) (ví dụ: yolo26n-seg.pt), bạn thường sẽ nhận được hai đầu ra: tensor đầu tiên có hình dạ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 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 mặt nạ thực thể. Kích thước phụ thuộc vào độ phân giải đầu vào khi xuất (và có thể là động).
Đối với model tư thế (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_dims phụ thuộc vào thông số kỹ thuật của tư thế (ví dụ: số lượng điểm mốc 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 khi 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 có API suy luận C++ chính thức không?#
Ultralytics hiện chưa cung cấp API suy luận C++ chuyên dụng cho các model YOLO. Đối với các triển khai bằng C++, hãy xuất model sang một định dạng runtime chẳng hạn như ONNX, TensorRT, TorchScript hoặc MNN, sau đó tải tệp đã xuất bằng API C++ gốc của runtime đó.
Ví dụ: xuất model 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 engine TensorRT từ ứng dụng TensorRT C++. Khi bạn sử dụng tính nă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 đầu cuối YOLO26 thường trả về (batch, max_det, 6), trong khi các bản xuất không phải đầu cuối trả về các tensor dự đoán thô cần xử lý hậu kỳ bên ngoài.
Tại sao output0 lại ở định dạng FP32 khi xuất các model đã lượng tử hóa với end2end=True?#
Khi xuất với 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 end2end=True đượ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 lớn hơn 2048 do giới hạn độ chính xác phần định trị của nó. Để tránh khả năng mất độ chính xác hoặc ID lớp không chính xác, output0 được chủ ý giữ nguyên ở định dạng FP32.
Hành vi này là 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ỉ số 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 end2end=False và thực hiện hậu xử lý ở bên ngoài.