تصدير MNN لنماذج YOLO26 والنشر#
MNN#
MNN هو إطار عمل للتعلم العميق عالي الكفاءة وخفيف الوزن. يدعم الاستدلال والتدريب لنماذج التعلم العميق ويتمتع بأداء رائد في الصناعة للاستدلال والتدريب على الأجهزة المحلية. في الوقت الحالي، تم دمج MNN في أكثر من 30 تطبيقاً لشركة Alibaba Inc، مثل Taobao وTmall وYouku وDingTalk وXianyu وغيرها، مما يغطي أكثر من 70 سيناريو للاستخدام مثل البث المباشر، والتقاط الفيديو القصير، وتوصيات البحث، والبحث عن المنتجات بالصورة، والتسويق التفاعلي، وتوزيع الأسهم، والتحكم في مخاطر الأمان. بالإضافة إلى ذلك، يتم استخدام MNN أيضاً على الأجهزة المضمنة، مثل إنترنت الأشياء (IoT).
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
المهام المدعومة#
يدعم تصصدير MNN جميع مهام Ultralytics السبع. تتوفّر التجزئة الدلالية وتقدير العمق حصرياً مع YOLO26، وهي عائلة النماذج الوحيدة التي تشتمل على تلك الرؤوس.
التصدير إلى MNN: تحويل نموذج YOLO26 الخاص بك#
يمكنك توسيع توافق النماذج ومرونة النشر عن طريق تحويل نماذج Ultralytics YOLO إلى تنسيق MNN. يعمل هذا التحويل على تحسين نماذجك للبيئات المحمولة والمضمنة، مما يضمن أداءً فعالاً على الأجهزة ذات الموارد المحدودة.
التثبيت#
لتثبيت الحزم المطلوبة، قم بتشغيل:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNالاستخدام#
تم تصميم جميع نماذج Ultralytics YOLO26 لدعم التصدير خارج الصندوق، مما يسهل دمجها في سيرงาน النشر المفضل لديك. يمكنك عرض القائمة الكاملة لتنسيقات التصدير المدعومة وخيارات التكوين لاختيار الإعداد الأفضل لتطبيقك.
يدعم تنسيق MNN أوضاع Export وPredict وValidate. قم بتصدير نموذجك، ثم قم بتحميل النموذج المصدر لتشغيل الاستدلال أو التحقق من دقته.
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Export the model to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn'from ultralytics import YOLO
# Load the exported MNN model
model = YOLO("yolo26n.mnn")
# Run inference
results = model("https://ultralytics.com/images/bus.jpg")from ultralytics import YOLO
# Load the exported MNN model
model = YOLO("yolo26n.mnn")
# Validate accuracy on the COCO8 dataset
metrics = model.val(data="coco8.yaml")وسائط التصدير#
| الوسيط | النوع | الافتراضي | الوصف |
|---|---|---|---|
format | str | 'mnn' | التنسيق المستهدف للنموذج المصدر، والذي يحدد التوافق مع بيئات النشر المختلفة. |
imgsz | int أو tuple | 640 | حجم الصورة المطلوب لإدخال النموذج. يمكن أن يكون رقماً صحيحاً للصور المربعة أو صفاً (tuple) (height, width) لأبعاد محددة. |
quantize | int أو str | None | دقة التكميم: 16 (FP16)، أو 8 (تكميم وزن INT8)، أو 32/غير محدد (FP32). يحل محل الأعلام المهملة half/int8. |
simplify | bool | True | يبسط رسم ONNX الوسيط باستخدام onnxslim. |
opset | int | None | يحدد إصدار ONNX opset للرسم البياني الوسيط ONNX. في حال عدم تحديده، يتم استخدام أحدث إصدار مدعوم. |
batch | int | 1 | يحدد حجم الاستدلال المفعلي لنموذج التصدير أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المُصدّر في نفس الوقت في وضع predict. |
dynamic | bool | False | يمكّن أبعاد صورة الإدخال الديناميكية. لا يمكن دمجه مع nms=True. |
nms | bool | False | يضيف NMS لنماذج الاكتشاف والتوضضع. لا يمكن دمجه مع dynamic=True. |
device | str | None | يحدد الجهاز المراد التصدير إليه: وحدة معالجة الرسومات GPU (device=0)، وحدة المعالجة المركزية CPU (device=cpu)، MPS لشريحة Apple silicon (device=mps). |
لمزيد من التفاصيل حول عملية التصدير، تفضل بزيارة صفحة وثائق Ultralytics حول التصدير.
استدلال MNN فقط#
تم تنفيذ وظيفة تعتمد فقط على MNN لاستدلال ومعالجة YOLO26، مما يوفر إصدارات Python وC++ للنشر السهل في أي سيناريو.
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)ملخص#
في هذا الدليل، نقدم كيفية تصدير نموذج Ultralytics YOLO26 إلى MNN واستخدام MNN للاستدلال. يوفر تنسيق MNN أداءً ممتازاً لتطبيقات الذكاء الاصطناعي على الحافة، مما يجعله مثلياً لنشر نماذج رؤية الكمبيوتر على الأجهزة ذات الموارد المحدودة.
لمزيد من الاستخدام، يرجى الرجوع إلى توثيق MNN.
الأسئلة الشائعة#
لتصدير نموذج Ultralytics YOLO26 الخاص بك إلى تنسيق MNN، اتبع الخطوات التالية:
التصديرfrom ultralytics import YOLO # Load a YOLO26 model model = YOLO("yolo26n.pt") # Export to MNN format model.export(format="mnn") # creates 'yolo26n.mnn' with fp32 weight model.export(format="mnn", quantize=16) # creates 'yolo26n.mnn' with fp16 weight model.export(format="mnn", quantize=8) # creates 'yolo26n.mnn' with int8 weightللاطلاع على خيارات التصدير التفصيلية، تحقق من صفحة Export في التوثيق.
للتنبؤ باستخدام نموذج YOLO26 MNN مصدّر، استخدم دالة
predictمن فئة YOLO.التنبؤfrom ultralytics import YOLO # Load the YOLO26 MNN model model = YOLO("yolo26n.mnn") # Run inference results = model("https://ultralytics.com/images/bus.jpg") # predict with `fp32` results = model("https://ultralytics.com/images/bus.jpg", quantize=16) # predict with `fp16` if device support for result in results: result.show() # display to screen result.save(filename="result.jpg") # save to diskيتميز MNN بتعدد الاستخدامات ويدعم منصات متنوعة:
- الهاتف المحمول: Android وiOS وHarmony.
- An-Nudhum al-Mudammana wa Ajhizat Inayat al-Ashya': الأجهزة مثل Raspberry Pi وNVIDIA Jetson.
- سطح المكتب والخوادم: Linux و Windows و macOS.
لنشر نماذج YOLO26 الخاصة بك على الأجهزة المحمولة:
- البناء لنظام Android: اتبع دليل MNN Android.
- البناء لنظام iOS: اتبع دليل MNN iOS.
- البناء لنظام Harmony: اتبع دليل MNN Harmony.