Ultralytics YOLO27:

تصدير نماذج YOLO26 ونشرها باستخدام MNN#

MNN#

MNN mobile neural network inference framework

يُعد 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، وهي العائلة الوحيدة التي تأتي مع رأسي المهام هذين.

المهمةYOLOv8YOLO11YOLO26
الكشف
التجزئة
الدلالي
العمق
التصنيف
الوضعية
OBB

التصدير إلى MNN: تحويل نموذج YOLO26#

يمكنك توسيع توافق النماذج ومرونة النشر من خلال تحويل نماذج Ultralytics YOLO إلى تنسيق MNN. يعمل هذا التحويل على تحسين نماذجك لتناسب بيئات الأجهزة المحمولة والمضمنة، بما يضمن أداءً فعالًا على الأجهزة محدودة الموارد.

التثبيت#

لتثبيت الحزم المطلوبة، شغّل:

التثبيت
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNN

الاستخدام#

صُممت جميع نماذج Ultralytics YOLO26 لدعم التصدير مباشرةً، مما يسهّل دمجها في سير عمل النشر المفضل لديك. يمكنك عرض القائمة الكاملة لتنسيقات التصدير المدعومة وخيارات الإعداد لاختيار الإعداد الأنسب لتطبيقك.

يدعم تنسيق MNN أوضاع التصدير والتنبؤ والتحقق. صدّر نموذجك، ثم حمّل النموذج المُصدَّر لإجراء الاستدلال أو التحقق من دقته.

التصدير
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")

وسائط التصدير#

الوسيطةالنوعالافتراضيالوصف
formatstr'mnn'التنسيق المستهدف للنموذج المُصدَّر، والذي يحدد التوافق مع بيئات النشر المختلفة.
imgszint أو tuple640حجم الصورة المطلوب لإدخال النموذج. يمكن أن يكون عددًا صحيحًا للصور المربعة أو صفًا (height, width) لأبعاد محددة.
quantizeint أو strNoneدقة التكميم: تعمل 16 (FP16) أو 8 (INT8) على تقليل الأوزان المُصدَّرة؛ بينما تُصدِّر 32/غير المُعيَّنة أوزان FP32، التي لا يزال وقت تشغيل MNN على CPU يحسبها بدقة low الافتراضية لديه بدلًا من FP32. وتحل هذه الخيارات محل العلامتَي half/int8 المتقادمتين.
simplifyboolTrueيبسّط الرسم البياني الوسيط لـ ONNX باستخدام onnxslim.
opsetintNoneيحدد إصدار مجموعة عمليات ONNX للرسم البياني الوسيط لـ ONNX. وإذا لم يُحدَّد، فسيُستخدم أحدث إصدار مدعوم.
batchint1يحدد حجم الدفعة للاستدلال في نموذج التصدير أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المُصدَّر بالتزامن في وضع predict.
dynamicboolFalseيُمكّن من استخدام أبعاد ديناميكية لصور الإدخال. ولا يمكن دمجه مع nms=True.
nmsbool، اختياريNoneحدد النتيجة الخام (None، الافتراضية)، أو NMS المضمنة (True)، أو رأس الخلو من NMS (False). تدعم NMS المضمنة الاكتشاف وتحديد الوضع باستخدام dynamic=False.
devicestrNoneيحدد الجهاز المستخدم للتصدير: GPU ‏(device=0)، أو CPU ‏(device=cpu)، أو MPS لشرائح Apple silicon ‏(device=mps).

لمزيد من التفاصيل حول عملية التصدير، تفضل بزيارة صفحة توثيق Ultralytics حول التصدير.

الاستدلال باستخدام MNN فقط#

تم تنفيذ دالة تعتمد حصريًا على MNN لإجراء الاستدلال والمعالجة المسبقة لـ YOLO26، مع توفير إصدارَي Python وC++ لسهولة النشر في أي سيناريو.

MNN
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] -> [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)
    # 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

    للاطلاع على خيارات التصدير التفصيلية، راجع صفحة التصدير في الوثائق.

  • لإجراء التنبؤ باستخدام نموذج 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")
    
    for result in results:
        result.show()  # display to screen
        result.save(filename="result.jpg")  # save to disk
  • يتميز MNN بالمرونة ويدعم منصات متنوعة:

    • الأجهزة المحمولة: Android وiOS وHarmony.
    • الأنظمة المضمنة وأجهزة IoT: أجهزة مثل Raspberry Pi وNVIDIA Jetson.
    • أجهزة سطح المكتب والخوادم: Linux وWindows وmacOS.
  • لنشر نماذج YOLO26 على الأجهزة المحمولة:

    1. البناء لنظام Android: اتبع دليل MNN Android.
    2. البناء لنظام iOS: اتبع دليل MNN iOS.
    3. البناء لنظام Harmony: اتبع دليل MNN Harmony.

التعليقات