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ó vào các ứng dụng thực tế. Chế độ xuất (Export mode) trong Ultralytics YOLO26 cung cấp một loạt các 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ị. Hướng dẫn toàn diện này nhằm mục đích hướng dẫn bạn qua các sắc thái của việc xuất model, cho thấy 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ế độ Xuất 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ủ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 khác nhau.
- Dễ sử dụng: CLI và Python API đơn giản để xuất model 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ố chức 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 hàng loạt: 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 và tài liệu 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 Tham số 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")Đối số
Bảng này mô tả chi tiết các cấu hình và tùy chọn có sẵn để xuất model YOLO sang các định dạng khác nhau. Các 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 khác nhau. 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 đích cho model được 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ính tương thích với các môi trường triển khai khác nhau. |
imgsz | int hoặc tuple | 640 | Kích thước ảnh mong muốn cho đầu vào model. Có thể là một số nguyên cho các ả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 | Kích hoạt export sang định dạng Keras cho TensorFlow SavedModel, cung cấp tính tương thích với TensorFlow serving và các API. |
optimize | bool | False | Áp dụng tối ưu hóa cho các thiết bị di động khi export sang TorchScript, có khả năng giảm kích thước model và cải thiện hiệu suất inference. Không tương thích với định dạng NCNN hoặc các thiết bị CUDA. Đối với DeepX, cho phép tối ưu hóa trình biên dịch cao hơn, giúp giảm độ trễ inference và tăng thời gian biên dịch. |
half | bool | False | Kích hoạt lượng tử hóa (quantization) FP16 (nửa độ chính xác), giảm kích thước model và có khả năng tăng tốc độ inference trên các phần cứng được hỗ trợ. Không tương thích với lượng tử hóa INT8 hoặc các export chỉ dành cho CPU. Chỉ khả dụng cho một số định dạng nhất định, ví dụ: ONNX (xem bên dưới). |
int8 | bool | False | Kích hoạt lượng tử hóa INT8, nén model hơn nữa và tăng tốc độ inference với mức mất độ chính xác tối thiểu, chủ yếu dành cho các thiết bị biên. Khi được sử dụng với TensorRT, thực hiện lượng tử hóa sau huấn luyện (PTQ). |
dynamic | bool | False | Cho phép các kích thước đầu vào động cho các export TorchScript, ONNX, OpenVINO, TensorRT và CoreML, tăng cường sự linh hoạt trong việc xử lý các kích thước ảnh khác nhau. Tự động được đặt thành True khi sử dụng TensorRT với INT8. |
simplify | bool | True | Đơn giản hóa biểu đồ model cho các export ONNX bằng onnxslim, có khả năng cải thiện hiệu suất và tính tương thích với các công cụ inference (inference engines). |
opset | int | None | Chỉ định phiên bản ONNX opset cho tính tương thích với các trình phân tích cú pháp (parsers) và runtime ONNX khác nhau. Nếu không được đặt, sẽ sử dụng phiên bản hỗ trợ mới nhất. |
workspace | float hoặc None | None | Thiết lập kích thước không gian làm việc tối đa tính bằng GiB cho các tối ưu hóa TensorRT, giúp cân bằng giữa việc sử dụng bộ nhớ và hiệu năng. Sử dụng None để TensorRT tự động cấp phát 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 đã xuất khi được hỗ trợ (xem Định dạng xuất), giúp cải thiện hiệu quả xử lý hậu kỳ phát hiện. Không khả dụng cho các model end2end. |
batch | int | 1 | Chỉ định kích thước inference theo lô 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 các bản xuất Edge TPU, giá trị này được tự động đặt là 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. |
data | str | 'coco8.yaml' | Đường dẫn đến file cấu hình dataset, yếu tố cần thiết cho hiệu chuẩn lượng tử hóa INT8. Nếu không được chỉ định trong khi INT8 đã được bật, coco8.yaml sẽ được sử dụng làm tệp dự phòng cho hiệu chuẩn. |
fraction | float | 1.0 | Chỉ định phần trăm dataset cần 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 con của toàn bộ dataset, hữu ích cho các thử nghiệm hoặc khi tài nguyên bị 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ợ inference không cần NMS (YOLO26, YOLOv10). Thiết lập thành False cho phép bạn xuất các model này để tương thích với pipeline xử lý hậu kỳ truyền thống dựa trên NMS. 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 quy 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 suất. Việc 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 nằm trong bảng dưới đây. Bạn có thể xuất sang bất kỳ định dạng nào bằng cách sử dụng tham số format, ví dụ: format='onnx' hoặc format='engine'. Bạn có thể thực hiện dự đoán hoặc xác thực trực tiếp trên các model đã xuất, ví dụ: 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ạng | Đối số format | Model | Metadata | Đối số |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, half, dynamic, optimize, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, half, dynamic, simplify, opset, nms, batch, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, half, dynamic, int8, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, half, int8, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, int8, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, batch, device |
| TF Lite | tflite | yolo26n.tflite | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, int8, data, fraction, device |
| TF.js | tfjs | yolo26n_web_model/ | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, int8, half, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, half, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, int8, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, int8, data, fraction, device |
| DeepX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, int8, data, optimize, device |
Câu hỏi thường gặp (FAQ)
Làm cách nào để xuất model YOLO26 sang định dạng ONNX?
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.
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 đáng kể về hiệu suất. Các model YOLO26 được xuất sang TensorRT có thể đạt tốc độ GPU nhanh gấp 5 lần, 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 cách nào để kích hoạ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ị biên (edge devices). Đây là cách bạn có thể kích hoạt lượng tử hóa INT8:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="engine", int8=True)Lượng tử hóa INT8 có thể được áp dụng cho nhiều định dạng khác nhau, chẳng hạn như TensorRT, OpenVINO, và CoreML. Để 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.
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 hình ảnh khác nhau, mang lại sự 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 kích hoạ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.
Để kích hoạt tính năng này, hãy sử dụng flag dynamic=True trong quá trình xuất:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)Thay đổi 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 hình ảnh mong muốn cho đầu vào của model (ví dụ:640hoặc(height, width)).half:Kích hoạt lượng tử hóa FP16, giảm kích thước model và có khả năng tăng tốc độ suy luận.optimize:Áp dụng các tối ưu hóa cụ thể cho các môi trường di động hoặc bị hạn chế.int8:Kích hoạt lượng tử hóa INT8, rất có lợi cho các triển khai edge AI.
Để 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.
Các tensor đầu ra đại diện cho điều 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. Hiểu được các đầu ra này là rất quan trọng cho các triển khai suy luận tùy chỉnh.
Đối với model phát hiện (ví dụ: yolo26n.pt), đầu ra thường là một tensor đơn lẻ có hình dạng (batch_size, 4 + num_classes, num_predictions) trong đó các kênh đại diện cho tọa độ hộp (box) 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 (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 (batch_size, 4 + num_classes + mask_dim, num_predictions) (hộp, điểm số lớp và hệ số mặt nạ), và tensor thứ hai có hình dạng (batch_size, mask_dim, proto_h, proto_w) chứa các nguyên mẫu mặt nạ được sử dụ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ế (ví dụ: yolo26n-pose.pt), tensor đầu ra thường có hình dạng (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 keypoint 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 chứng minh cách xử lý các đầu ra này cho từng loại model.
Tại sao output0 lại ở định dạng FP32 khi xuất với half=True và end2end=True?
Khi xuất với half=True (hoặc int8=True), 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 suất. Tuy nhiên, khi end2end=True được kích hoạt, hậu xử lý (bao gồm cả chỉ số lớp) được nhúng trực tiếp vào đồ thị đã xuất.
Tensor output0 chứa các chỉ số lớp, được biểu diễn nội bộ dưới dạng các giá trị dấu phẩy động. FP16 không thể biểu diễn một cách đáng tin cậy các giá trị số nguyên trên 2048 do độ chính xác mantissa bị hạn chế. Để tránh mất độ chính xác hoặc sai ID lớp, output0 được giữ nguyên ở định dạng FP32 một cách có chủ đích.
Hành vi này là dự kiến và cũng áp dụng cho các tệp xuất có độ chính xác thấp hơn hoặc đã được lượng tử hóa, nơi cần bảo toàn độ trung thực của chỉ số lớp.
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ý từ bên ngoài.