Chuyển đến nội dung

Cách xuất khẩu phi- YOLO PyTorch Các mô hình với Ultralytics

Triển khai PyTorch Việc chuyển đổi từ mô hình sang sản phẩm thường đòi hỏi phải sử dụng nhiều trình xuất khác nhau cho mỗi nền tảng mục tiêu: torch.onnx.export vì ONNX , coremltools dành cho các thiết bị của Apple, onnx2tf vì TensorFlow , pnnx vì NCNN và cứ thế tiếp tục. Mỗi công cụ đều có API riêng, những đặc điểm riêng về phụ thuộc và quy ước đầu ra.

Ultralytics Các tiện ích xuất khẩu độc lập này tích hợp nhiều hệ thống phụ trợ đằng sau một giao diện nhất quán. Bạn có thể xuất bất kỳ dữ liệu nào. torch.nn.Module, bao gồm timm mô hình hình ảnh, tầm nhìn đèn pin các bộ phân loại và bộ phát hiện, hoặc các kiến ​​trúc tùy chỉnh của riêng bạn, để ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch, và TensorFlow SavedModel mà không cần phải học từng hệ thống phụ trợ riêng lẻ.

Tại sao nên sử dụng Ultralytics Dành cho người không phải- YOLO Xuất khẩu?

  • Một API duy nhất cho 10 định dạng: chỉ cần học một quy ước gọi hàm duy nhất thay vì hàng tá quy ước khác nhau.
  • Bề mặt tiện ích dùng chung: những người hỗ trợ xuất khẩu sống dưới ultralytics.utils.exportVì vậy, sau khi các gói phụ trợ được cài đặt, bạn có thể giữ nguyên mô hình gọi hàm trên các định dạng khác nhau.
  • Cùng một đường dẫn mã như các hàm xuất của YOLO : cùng một hàm hỗ trợ cho mọi thứ. Ultralytics YOLO xuất khẩu.
  • Đã tích hợp sẵn tính năng lượng tử hóa FP16 và INT8 cho các định dạng hỗ trợ tính năng này. OpenVINO , CoreML , MNN, NCNN ).
  • Hoạt động trên CPU : không GPU Cần thiết cho chính bước xuất dữ liệu, vì vậy bạn có thể chạy nó cục bộ trên bất kỳ máy tính xách tay nào.

Bắt đầu nhanh

Cách nhanh nhất là xuất dữ liệu thành hai dòng. ONNX không có YOLO mã lệnh và không cần thiết lập gì thêm pip install ultralytics onnx timm:

import timm
import torch

from ultralytics.utils.export import torch2onnx

model = timm.create_model("resnet18", pretrained=True).eval()
torch2onnx(model, torch.randn(1, 3, 224, 224), output_file="resnet18.onnx")

Các Định dạng Xuất được Hỗ trợ

Hàm torch2* các hàm lấy một tiêu chuẩn torch.nn.Module và một ví dụ đầu vào tensor . MNN, TF SavedModel , Và TF Đồ thị đóng băng trải qua một giai đoạn trung gian. ONNX hoặc lỗi Keras. Không YOLO - Các thuộc tính cụ thể là bắt buộc trong cả hai trường hợp.

Định dạngChức năngCài đặtĐầu ra
ONNXtorch2onnx()pip install onnx.onnx tệp
TorchScripttorch2torchscript()bao gồm với PyTorch.torchscript tệp
OpenVINOtorch2openvino()pip install openvino_openvino_model/ thư mục
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()Xem các yêu cầu chi tiết bên dưới_saved_model/ thư mục
TF Đồ thị đóng băngkeras2pb()Xem các yêu cầu chi tiết bên dưới.pb tệp
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/ thư mục
MNNonnx2mnn()pip install MNN.mnn tệp
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/ thư mục
ExecuTorchtorch2executorch()pip install executorch_executorch_model/ thư mục

ONNX như một định dạng trung gian

MNN , TF SavedModel và TF Quá trình xuất Frozen Graph diễn ra thông qua... ONNX như một bước trung gian. Xuất sang ONNX Trước tiên, hãy chuyển đổi.

Nhúng siêu dữ liệu

Một số chức năng xuất khẩu chấp nhận một tùy chọn metadata từ điển (ví dụ, torch2torchscript(..., metadata={"author": "me"})) cho phép nhúng các cặp khóa-giá trị tùy chỉnh vào sản phẩm xuất ra nếu định dạng đó hỗ trợ.

Ví dụ từng bước

Mỗi ví dụ dưới đây đều sử dụng cùng một thiết lập, một mạng ResNet-18 được huấn luyện trước từ timm ở chế độ đánh giá:

import timm
import torch

model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)

Luôn gọi model.eval() trước khi xuất khẩu

Bỏ học, chuẩn hóa hàng loạtvà các lớp chỉ dùng để huấn luyện khác hoạt động khác nhau trong quá trình suy luận. Bỏ qua .eval() Xuất khẩu với kết quả không chính xác.

Xuất sang ONNX

from ultralytics.utils.export import torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")

Đối với kích thước lô động, hãy truyền vào một tham số. dynamic từ điển:

torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})

opset mặc định là 14 và tên đầu vào mặc định là "images"Ghi đè bằng opset, input_names, hoặc output_names lập luận.

Xuất sang TorchScript

Không cần thêm bất kỳ phụ thuộc nào. Sử dụng torch.jit.trace Bên trong nắp ca-pô.

from ultralytics.utils.export import torch2torchscript

torch2torchscript(model, im, output_file="resnet18.torchscript")

Xuất sang OpenVINO

from ultralytics.utils.export import torch2openvino

ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")

Thư mục này chứa một tên cố định. model.xmlmodel.bin đôi:

resnet18_openvino_model/
├── model.xml
└── model.bin

Vượt qua dynamic=True đối với các hình dạng đầu vào động, half=True cho FP16, hoặc int8=True Đối với lượng tử hóa INT8. Ngoài ra, INT8 còn yêu cầu một calibration_dataset đối số.

Yêu cầu openvino>=2024.0.0 (hoặc >=2025.2.0 trên macOS 15.4 trở lên) và torch>=2.1.

Xuất sang CoreML

import coremltools as ct

from ultralytics.utils.export import torch2coreml

inputs = [ct.TensorType("input", shape=(1, 3, 224, 224))]
ct_model = torch2coreml(model, inputs, im, output_file="resnet18.mlpackage")

Cho phân loại các mô hình, truyền một danh sách tên lớp đến classifier_names để thêm một đầu phân loại vào CoreML người mẫu.

Yêu cầu coremltools>=9.0, torch>=1.11, và numpy<=2.3.5Không được hỗ trợ trên Windows.

BlobWriter not loaded lỗi

coremltools>=9.0 bánh lái tàu cho Python 3.10–3.13 trên macOS và Linux. Trên các phiên bản mới hơn Python các phiên bản mà phần mở rộng C gốc không tải được. Sử dụng Python 3.10–3.13 cho CoreML xuất khẩu.

Xuất sang TensorFlow SavedModel

TF SavedModel xuất khẩu được thực hiện ONNX như một bước trung gian:

from ultralytics.utils.export import onnx2saved_model, torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")
keras_model = onnx2saved_model("resnet18.onnx", output_dir="resnet18_saved_model")

Hàm này trả về một mô hình Keras và cũng tạo ra... TFLite tệp (.tflite) bên trong thư mục đầu ra:

resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite

Yêu cầu:

  • tensorflow>=2.0.0,<=2.19.0
  • onnx2tf>=1.26.3,<1.29.0
  • tf_keras<=2.19.0
  • sng4onnx>=1.0.1
  • onnx_graphsurgeon>=0.3.26 (cài đặt bằng) --extra-index-url https://pypi.ngc.nvidia.com)
  • ai-edge-litert>=1.2.0,<1.4.0 trên macOS (ai-edge-litert>=1.2.0 (trên các nền tảng khác)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=5

Xuất sang TensorFlow Đồ thị đóng băng

Tiếp theo từ SavedModel Sau khi xuất ra kết quả trên, hãy chuyển đổi mô hình Keras trả về thành mô hình đã được đóng băng. .pb đồ thị:

from pathlib import Path

from ultralytics.utils.export import keras2pb

keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))

Xuất sang NCNN

from ultralytics.utils.export import torch2ncnn

torch2ncnn(model, im, output_dir="resnet18_ncnn_model")

Thư mục này chứa các tệp tham số và tệp nhị phân có tên cố định cùng với một tệp khác. Python bao bọc:

resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py

torch2ncnn() kiểm tra cho ncnnpnnx khi sử dụng lần đầu.

Xuất sang MNN

Việc xuất MNN yêu cầu ONNX Tệp đầu vào. Xuất sang ONNX Đầu tiên, sau đó chuyển đổi:

from ultralytics.utils.export import onnx2mnn, torch2onnx

torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")

Hỗ trợ half=True cho FP16 và int8=True Dành cho lượng tử hóa INT8. Yêu cầu MNN>=2.9.6torch>=1.10.

Xuất sang PaddlePaddle

from ultralytics.utils.export import torch2paddle

torch2paddle(model, im, output_dir="resnet18_paddle_model")

Thư mục này chứa PaddlePaddle Các tệp mô hình và tham số:

resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams

Yêu cầu x2paddle và điều đúng đắn PaddlePaddle Phân phối cho nền tảng của bạn:

  • paddlepaddle-gpu>=3.0.0,<3.3.0 TRÊN CUDA
  • paddlepaddle==3.0.0 trên ARM64 CPU
  • paddlepaddle>=3.0.0,<3.3.0 trên các CPU khác

Không được hỗ trợ trên NVIDIA Jetson.

Xuất sang ExecuTorch

from ultralytics.utils.export import torch2executorch

torch2executorch(model, im, output_dir="resnet18_executorch_model")

Hàng xuất khẩu .pte Tệp được lưu trong thư mục đầu ra:

resnet18_executorch_model/
└── model.pte

Yêu cầu torch>=2.9.0 và một runtime ExecuTorch tương ứng (pip install executorchĐể biết cách sử dụng trong quá trình chạy, vui lòng xem phần... Tích hợp ExecuTorch.

Xác minh mô hình đã xuất của bạn

Sau khi xuất, hãy kiểm tra tính chẵn lẻ số học với bản gốc. PyTorch mô hình trước khi vận chuyển. Kiểm tra khói nhanh với ONNXBackend từ ultralytics.nn.backends So sánh các kết quả đầu ra và phát hiện sớm các lỗi theo dõi hoặc lượng tử hóa:

import numpy as np
import timm
import torch

from ultralytics.nn.backends import ONNXBackend

model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
with torch.no_grad():
    pytorch_output = model(im).numpy()

onnx_model = ONNXBackend("resnet18.onnx", device=torch.device("cpu"))
onnx_output = onnx_model.forward(im)[0]

diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}")  # should be < 1e-5

Sự khác biệt dự kiến

Đối với xuất khẩu FP32, chênh lệch tuyệt đối tối đa phải nhỏ hơn 1e-5Sự khác biệt lớn hơn cho thấy các phép toán không được hỗ trợ, hình dạng đầu vào không chính xác hoặc mô hình không ở chế độ đánh giá. Xuất FP16 và INT8 có dung sai lỏng hơn. Hãy xác thực trên dữ liệu thực thay vì các tensor ngẫu nhiên.

Đối với các môi trường chạy khác, đầu vào tensor Tên có thể khác. OpenVINO Ví dụ, nó sử dụng tên đối số chuyển tiếp của mô hình (thường là x (đối với các mô hình chung), trong khi torch2onnx mặc định là "images".

Các hạn chế đã biết

  • Khả năng hỗ trợ nhiều thiết bị đầu vào không đồng đều: torch2onnxtorch2openvino Chấp nhận một bộ hoặc danh sách các tensor ví dụ cho các mô hình có nhiều đầu vào. torch2torchscript, torch2coreml, torch2ncnn, torch2paddle, và torch2executorch giả sử một đầu vào duy nhất tensor .
  • ExecuTorch cần flatc: Môi trường chạy ExecuTorch yêu cầu trình biên dịch FlatBuffers. Cài đặt bằng lệnh sau: brew install flatbuffers trên macOS hoặc apt install flatbuffers-compiler trên Ubuntu.
  • Không có suy luận nào thông qua Ultralytics: Xuất khẩu không- YOLO Các mô hình không thể được tải lại thông qua YOLO() để suy luận. Sử dụng môi trường chạy gốc cho từng định dạng (ONNX Thời gian chạy, OpenVINO Thời gian chạy, v.v.).
  • Chỉ dành cho định dạng YOLO : Các bản xuất từ ​​AxeleraSony IMX500 yêu cầu YOLO - Các thuộc tính dành riêng cho từng mô hình và không khả dụng cho các mô hình chung.
  • Định dạng dành riêng cho nền tảng: TensorRT yêu cầu một NVIDIA GPU . RKNN yêu cầu rknn-toolkit2 Bộ công cụ phát triển phần mềm (chỉ dành cho Linux). Edge TPU yêu cầu edgetpu_compiler Tệp nhị phân (chỉ dành cho Linux).

Câu hỏi thường gặp

Tôi có thể xuất những mô hình nào? Ultralytics ?

Bất kì torch.nn.ModuleĐiều này bao gồm các mẫu từ timm, torchvision, hoặc bất kỳ sản phẩm tùy chỉnh nào. PyTorch mô hình. Mô hình phải ở chế độ đánh giá (model.eval()trước khi xuất khẩu. ONNX Và OpenVINO Ngoài ra, hệ thống cũng chấp nhận một bộ giá trị gồm các tensor ví dụ cho các mô hình đa đầu vào.

Những định dạng xuất nào hoạt động mà không cần GPU ?

Tất cả các định dạng được hỗ trợ ( TorchScript , ONNX , OpenVINO , CoreML , TF SavedModel , TF Đồ thị đóng băng, NCNN , PaddlePaddle (MNN, ExecuTorch) có thể xuất ra. CPU . KHÔNG GPU Điều này là cần thiết cho chính quá trình xuất khẩu. TensorRT là định dạng duy nhất yêu cầu NVIDIA GPU .

Cái gì Ultralytics Tôi cần phiên bản nào?

Sử dụng Ultralytics >=8.4.38, bao gồm ultralytics.utils.export mô-đun và tiêu chuẩn hóa output_file/output_dir lập luận.

Tôi có thể xuất mô hình torchvision sang...? CoreML vì iOS triển khai?

Có. Các bộ phân loại, bộ dò và mô hình phân đoạn của torchvision có thể xuất sang... .mlpackage thông qua torch2coremlĐối với các mô hình phân loại hình ảnh, hãy truyền vào một danh sách tên lớp. classifier_names Để nhúng tiêu đề phân loại. Chạy quá trình xuất trên macOS hoặc Linux. CoreML Tính năng này không được hỗ trợ trên Windows. Xem thêm CoreML tích hợp vì iOS Chi tiết triển khai.

Tôi có thể lượng tử hóa mô hình đã xuất sang định dạng INT8 hoặc FP16 được không?

Vâng, đối với một số định dạng. Pass half=True cho FP16 hoặc int8=True đối với INT8 khi xuất sang OpenVINO , CoreML , MNN, hoặc NCNN . INT8 trong OpenVINO ngoài ra còn yêu cầu một calibration_dataset đối số cho lượng tử hóa sau huấn luyệnXem trang tích hợp của từng định dạng để biết các sự đánh đổi về lượng tử hóa.



📅 Được tạo 0 ngày trước ✏️ Cập nhật 0 ngày trước
raimbekovm

Bình luận