تصدير MNN لنماذج YOLO26 والنشر

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: تحويل نموذج YOLO26 الخاص بك

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

التثبيت

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

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

الاستخدام

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

الاستخدام
  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")

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

المعاملالنوعالافتراضيالوصف
formatstr'mnn'التنسيق المستهدف للنموذج الذي تم تصديره، مما يحدد التوافق مع بيئات النشر المختلفة.
imgszint أو tuple640حجم الصورة المطلوب لمدخلات النموذج. يمكن أن يكون عدداً صحيحاً للصور المربعة أو صفاً (height, width) لأبعاد محددة.
halfboolFalseيُمكّن كمّية FP16 (دقة نصفية)، مما يقلل من حجم النموذج وربما يسرع الاستنتاج على الأجهزة المدعومة.
int8boolFalseيُنشط كمّية INT8، مما يزيد من ضغط النموذج وتسريع الاستنتاج بأقل قدر من فقدان الدقة، بشكل أساسي لأجهزة الحافة.
batchint1يحدد حجم استدلال دفعة النموذج المصدر أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المصدر في وقت واحد في وضع predict.
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] -> [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 أداءً ممتازاً لتطبيقات edge AI، مما يجعله مثالياً لنشر نماذج الرؤية الحاسوبية على الأجهزة ذات الموارد المحدودة.

لمزيد من الاستخدام، يرجى الرجوع إلى وثائق MNN.

الأسئلة الشائعة

كيف أقوم بتصدير نماذج Ultralytics YOLO26 إلى تنسيق MNN؟

لتصدير نموذج Ultralytics YOLO26 الخاص بك إلى تنسيق MNN، اتبع الخطوات التالية:

تصدير
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

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

كيف أقوم بالتنبؤ باستخدام نموذج YOLO26 MNN مُصدر؟

للتنبؤ باستخدام نموذج YOLO26 MNN مُصدر، استخدم الدالة predict من فئة 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 disk

ما هي المنصات المدعومة لـ MNN؟

MNN متعدد الاستخدامات ويدعم منصات متنوعة:

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

كيف يمكنني نشر نماذج Ultralytics YOLO26 MNN على الأجهزة المحمولة؟

لنشر نماذج YOLO26 الخاصة بك على الأجهزة المحمولة:

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

التعليقات