Xuất MNN cho các mô hình YOLO26 và Triển khai
MNN
MNN là một framework học sâu gọn nhẹ và hiệu quả cao. Nó hỗ trợ suy luận và huấn luyện các mô hình học sâu, đồng thời có hiệu suất dẫn đầu ngành cho việc 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., bao phủ hơn 70 kịch bản 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, tương tác tiếp thị, phân phối vốn chủ sở hữu, kiểm soát rủi ro bảo mật. Ngoài ra, MNN còn được sử dụng trên các thiết bị nhúng, như IoT.
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
Xuất sang MNN: Chuyển đổi mô hình YOLO26 của bạn
Bạn có thể mở rộng khả năng tương thích của mô hình và tính linh hoạt trong triển khai bằng cách chuyển đổi các mô hình Ultralytics YOLO sang định dạng MNN. Quá trình chuyển đổi này tối ưu hóa mô hình của bạn cho môi trường di động và nhúng, đảm bảo hiệu suất hiệu quả trên các thiết bị bị hạn chế về tài nguyên.
Cài đặt
Để cài đặt các gói 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ả các mô hình Ultralytics YOLO26 đều được thiết kế để hỗ trợ xuất ngay lập tức, giúp dễ dàng tích hợp chúng vào quy trình triển khai ưa thích của bạn. Bạn có thể xem danh sách đầy đủ các định dạng xuất và tùy chọn cấu hình được hỗ trợ để chọn thiết lập tốt nhất cho ứng dụng của mình.
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export the model to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn'
# Load the exported MNN model
mnn_model = YOLO("yolo26n.mnn")
# Run inference
results = mnn_model("https://ultralytics.com/images/bus.jpg")Các đối số Xuất
| Đối số | Loại | Mặc định | Mô tả |
|---|---|---|---|
format | str | 'mnn' | Định dạng mục tiêu cho model đã xuất, xác định khả năng 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 hình ảnh mong muốn cho đầu vào của model. Có thể là một số nguyên cho hình ảnh vuông hoặc một tuple (height, width) cho các kích thước cụ thể. |
half | bool | False | Kích hoạt lượng tử hóa FP16 (độ chính xác một nửa), giảm kích thước model và có khả năng tăng tốc suy luận trên phần cứng được hỗ trợ. |
int8 | bool | False | Kích hoạt lượng tử hóa INT8, nén model thêm nữa và tăng tốc suy luận với mức giảm độ chính xác tối thiểu, chủ yếu cho các thiết bị biên. |
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 xuất sẽ xử lý đồng thời ở chế độ predict. |
device | str | None | Chỉ định thiết bị để 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.
Suy luận chỉ dùng MNN
Một hàm dựa hoàn toàn vào MNN cho việc 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 bất kỳ kịch bản nào.
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] # BGR to 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 means: [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] -> [y0, x0, y1, x1]
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)
# ensure ratio is within the valid range [0.0, 1.0]
boxes = np.clip(boxes, 0, 1)
# get max prob and idx
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)
# nms result box, score, ids
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)
# clamp to the original image size to handle cases where padding was applied
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 mô hình Ultralytics YOLO26 sang MNN và sử dụng MNN để suy luận. Định dạng MNN mang lại hiệu suất tuyệt vời cho các ứng dụng edge AI, làm cho nó trở nên lý tưởng để triển khai các mô hình thị giác máy tính trên các thiết bị bị hạn chế về tài nguyên.
Để 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 (FAQ)
Làm thế nào để xuất các mô hình Ultralytics YOLO26 sang định dạng MNN?
Để xuất mô hình Ultralytics YOLO26 của bạn sang định dạng MNN, hãy làm theo các bước sau:
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn' with fp32 weight
model.export(format="mnn", half=True) # creates 'yolo26n.mnn' with fp16 weight
model.export(format="mnn", int8=True) # creates 'yolo26n.mnn' with int8 weightĐể biết các tùy chọn xuất chi tiết, hãy kiểm tra trang Export trong tài liệu.
Làm thế nào để dự đoán với một mô hình YOLO26 MNN đã xuất?
Để dự đoán với một mô hình YOLO26 MNN đã xuất, hãy sử dụng hàm predict từ lớp YOLO.
from ultralytics import YOLO
# Load the YOLO26 MNN model
model = YOLO("yolo26n.mnn")
# Export to MNN format
results = model("https://ultralytics.com/images/bus.jpg") # predict with `fp32`
results = model("https://ultralytics.com/images/bus.jpg", half=True) # predict with `fp16` if device support
for result in results:
result.show() # display to screen
result.save(filename="result.jpg") # save to diskNhững nền tảng nào được hỗ trợ cho MNN?
MNN rất linh hoạt và hỗ trợ nhiều nền tảng khác nhau:
- 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.
Làm thế nào để tôi có thể triển khai các mô hình Ultralytics YOLO26 MNN trên thiết bị di động?
Để triển khai các mô hình YOLO26 của bạn trên thiết bị di động:
- Xây dựng cho Android: Làm theo hướng dẫn MNN Android.
- Xây dựng cho iOS: Làm theo hướng dẫn MNN iOS.
- Xây dựng cho Harmony: Làm theo hướng dẫn MNN Harmony.