Xuất MNN cho model YOLO26 và triển khai#
MNN#
MNN là framework deep learning có hiệu suất cao và dung lượng nhẹ. Framework này hỗ trợ suy luận và huấn luyện model deep learning, đồng thời có hiệu năng hàng đầu trong ngành khi suy luận và huấn luyện trên thiết bị. Hiện tại, MNN đã được tích hợp vào hơn 30 ứng dụng của Alibaba Inc, chẳng hạn như Taobao, Tmall, Youku, DingTalk, Xianyu, v.v., phục vụ hơn 70 trường hợp sử dụng như phát trực tiếp, quay video ngắn, đề xuất tìm kiếm, tìm kiếm sản phẩm bằng hình ảnh, tiếp thị tương tác, phân phối quyền lợi và kiểm soát rủi ro bảo mật. Ngoài ra, MNN cũng được sử dụng trên các thiết bị nhúng như thiết bị IoT.
Xem: Cách export Ultralytics YOLO26 sang định dạng MNN | Tăng tốc inference trên thiết bị di động📱
Các tác vụ được hỗ trợ#
MNN hỗ trợ xuất cho cả bảy tác vụ của Ultralytics. Phân đoạn ngữ nghĩa và ước tính độ sâu chỉ khả dụng với YOLO26, dòng model duy nhất có các head này.
Xuất sang MNN: Chuyển đổi model YOLO26#
Bạn có thể mở rộng khả năng tương thích model và tính linh hoạt khi triển khai bằng cách chuyển đổi model Ultralytics YOLO sang định dạng MNN. Việc chuyển đổi này tối ưu hóa model cho môi trường di động và nhúng, đảm bảo hiệu năng hiệu quả trên các thiết bị có tài nguyên hạn chế.
Cài đặt#
Để cài đặt các package cần thiết, hãy chạy:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNCách sử dụng#
Tất cả model Ultralytics YOLO26 đều được thiết kế để hỗ trợ xuất ngay từ đầu, giúp bạn dễ dàng tích hợp chúng vào quy trình triển khai mong muốn. Bạn có thể xem danh sách đầy đủ các định dạng xuất được hỗ trợ và tùy chọn cấu hình để chọn thiết lập phù hợp nhất cho ứng dụng.
Định dạng MNN hỗ trợ các chế độ Export, Predict và Validate. Hãy xuất model, sau đó tải model đã xuất để chạy suy luận hoặc xác thực độ chính xác.
from ultralytics import YOLO
# Nạp model YOLO26
model = YOLO("yolo26n.pt")
# Xuất model sang định dạng MNN
model.export(format="mnn") # tạo 'yolo26n.mnn'from ultralytics import YOLO
# Tải model MNN đã xuất
model = YOLO("yolo26n.mnn")
# Chạy suy luận
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Tải model MNN đã xuất
model = YOLO("yolo26n.mnn")
# # Đánh giá độ chính xác trên bộ dữ liệu COCO8
metrics = model.val(data="coco8.yaml")Các tham số xuất model#
| Đối số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
format | str | 'mnn' | Định dạng đích của model đã xuất, xác định khả năng tương thích với nhiều môi trường triển khai. |
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 hoặc tuple (height, width) để chỉ định kích thước cụ thể. |
quantize | int hoặc str | None | Độ chính xác lượng tử hóa: 16 (FP16) hoặc 8 (INT8) giúp giảm dung lượng trọng số đã xuất; 32/để trống sẽ xuất trọng số FP32, nhưng MNNBackend của Ultralytics vẫn chạy ở độ chính xác low thay vì FP32. Thay thế các cờ half/int8 đã lỗi thời. |
simplify | bool | True | Đơn giản hóa đồ thị ONNX trung gian bằng onnxslim. |
opset | int | None | Chỉ định phiên bản opset ONNX cho đồ thị ONNX trung gian. Nếu không đặt, phiên bản được hỗ trợ mới nhất sẽ được sử dụng. |
batch | int | 1 | Chỉ định kích thước batch suy luận của model khi xuất hoặc số lượng ảnh tối đa mà model đã xuất xử lý đồng thời ở chế độ predict. |
dynamic | bool | False | Bật kích thước ảnh đầu vào động. Không thể kết hợp với nms=True. |
nms | bool, không bắt buộc | None | Chọn đầu ra thô (None, mặc định), NMS tích hợp (True) hoặc head không dùng NMS (False). NMS tích hợp hỗ trợ detect và pose với dynamic=False. |
device | str | None | Chỉ định thiết bị dùng để xuất: GPU (device=0), CPU (device=cpu), MPS cho Apple silicon (device=mps). |
Để biết thêm chi tiết về quy trình xuất, hãy truy cập trang tài liệu Ultralytics về xuất model.
Chỉ suy luận bằng MNN#
Một hàm chỉ sử dụng MNN cho quá trình suy luận và tiền xử lý YOLO26 đã được triển khai, cung cấp cả phiên bản Python và C++ để dễ dàng triển khai trong mọi tình huống.
import argparse
import MNN
import MNN.cv as cv2
import MNN.numpy as np
def inference(model, img, precision, backend, thread):
config = {}
config["precision"] = precision
config["backend"] = backend
config["numThread"] = thread
rt = MNN.nn.create_runtime_manager((config,))
# net = MNN.nn.load_module_from_file(model, ['images'], ['output0'], runtime_manager=rt)
net = MNN.nn.load_module_from_file(model, [], [], runtime_manager=rt)
original_image = cv2.imread(img)
ih, iw, _ = original_image.shape
length = max((ih, iw))
scale = length / 640
image = np.pad(original_image, [[0, length - ih], [0, length - iw], [0, 0]], "constant")
image = cv2.resize(
image, (640, 640), 0.0, 0.0, cv2.INTER_LINEAR, -1, [0.0, 0.0, 0.0], [1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0]
)
image = image[..., ::-1] # Chuyển BGR sang RGB
input_var = image[None]
input_var = MNN.expr.convert(input_var, MNN.expr.NC4HW4)
output_var = net.forward(input_var)
output_var = MNN.expr.convert(output_var, MNN.expr.NCHW)
output_var = output_var.squeeze()
# output_var shape: [84, 8400]; 84 có nghĩa là: [cx, cy, w, h, prob * 80]
cx = output_var[0]
cy = output_var[1]
w = output_var[2]
h = output_var[3]
probs = output_var[4:]
# [cx, cy, w, h] -> [x0, y0, x1, y1]
x0 = cx - w * 0.5
y0 = cy - h * 0.5
x1 = cx + w * 0.5
y1 = cy + h * 0.5
boxes = np.stack([x0, y0, x1, y1], axis=1)
# lấy prob và idx lớn nhất
scores = np.max(probs, 0)
class_ids = np.argmax(probs, 0)
result_ids = MNN.expr.nms(boxes, scores, 100, 0.45, 0.25)
print(result_ids.shape)
# box, score, ids của kết quả nms
result_boxes = boxes[result_ids]
result_scores = scores[result_ids]
result_class_ids = class_ids[result_ids]
for i in range(len(result_boxes)):
x0, y0, x1, y1 = result_boxes[i].read_as_tuple()
y0 = int(y0 * scale)
y1 = int(y1 * scale)
x0 = int(x0 * scale)
x1 = int(x1 * scale)
# giới hạn trong kích thước ảnh gốc để xử lý các trường hợp đã áp dụng padding
x1 = min(iw, x1)
y1 = min(ih, y1)
print(result_class_ids[i])
cv2.rectangle(original_image, (x0, y0), (x1, y1), (0, 0, 255), 2)
cv2.imwrite("res.jpg", original_image)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--model", type=str, required=True, help="the yolo26 model path")
parser.add_argument("--img", type=str, required=True, help="the input image path")
parser.add_argument("--precision", type=str, default="normal", help="inference precision: normal, low, high, lowBF")
parser.add_argument(
"--backend",
type=str,
default="CPU",
help="inference backend: CPU, OPENCL, OPENGL, NN, VULKAN, METAL, TRT, CUDA, HIAI",
)
parser.add_argument("--thread", type=int, default=4, help="inference using thread: int")
args = parser.parse_args()
inference(args.model, args.img, args.precision, args.backend, args.thread)Tóm tắt#
Trong hướng dẫn này, chúng tôi giới thiệu cách xuất model Ultralytics YOLO26 sang MNN và sử dụng MNN để suy luận. Định dạng MNN mang lại hiệu năng vượt trội cho các ứng dụng AI biên, rất phù hợp để triển khai model thị giác máy tính trên các thiết bị có tài nguyên hạn chế.
Để biết thêm cách sử dụng, vui lòng tham khảo tài liệu MNN.
Câu hỏi thường gặp#
Để xuất model Ultralytics YOLO26 sang định dạng MNN, hãy làm theo các bước sau:
Exportfrom ultralytics import YOLO # Nạp model YOLO26 model = YOLO("yolo26n.pt") # Xuất sang định dạng MNN model.export(format="mnn") # tạo 'yolo26n.mnn' với trọng số fp32 model.export(format="mnn", quantize=16) # tạo 'yolo26n.mnn' với trọng số fp16 model.export(format="mnn", quantize=8) # tạo 'yolo26n.mnn' với trọng số int8Để biết chi tiết các tùy chọn xuất, hãy xem trang Export trong tài liệu.
Để dự đoán bằng model YOLO26 MNN đã xuất, hãy sử dụng hàm
predicttừ lớp YOLO.Dự đoánfrom ultralytics import YOLO # Tải model YOLO26 MNN model = YOLO("yolo26n.mnn") # Chạy suy luận results = model("https://ultralytics.com/images/bus.jpg") for result in results: result.show() # hiển thị trên màn hình result.save(filename="result.jpg") # lưu vào ổ đĩaMNN linh hoạt và hỗ trợ nhiều nền tảng:
- Di động: Android, iOS, Harmony.
- Hệ thống nhúng và thiết bị IoT: Các thiết bị như Raspberry Pi và NVIDIA Jetson.
- Máy tính để bàn và máy chủ: Linux, Windows và macOS.
Để triển khai model YOLO26 trên thiết bị di động:
- Build cho Android: Làm theo hướng dẫn MNN Android.
- Build cho iOS: Làm theo hướng dẫn MNN iOS.
- Build cho Harmony: Làm theo hướng dẫn MNN Harmony.