Ultralytics YOLO27:

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

MNN#

MNN mobile neural network inference framework

يُعد MNN إطار عمل فعالًا للغاية وخفيف الوزن للتعلّم العميق. وهو يدعم الاستدلال وتدريب نماذج التعلّم العميق، ويقدم أداءً رائدًا في المجال للاستدلال والتدريب على الجهاز. حاليًا، دُمج MNN في أكثر من 30 تطبيقًا تابعًا لشركة Alibaba Inc، مثل Taobao وTmall وYouku وDingTalk وXianyu وغيرها، ويغطي أكثر من 70 حالة استخدام، مثل البث المباشر وتصوير مقاطع الفيديو القصيرة وتوصيات البحث والبحث عن المنتجات بالصور والتسويق التفاعلي وتوزيع الأسهم والتحكم في المخاطر الأمنية. إضافة إلى ذلك، يُستخدم MNN أيضًا على الأجهزة المضمنة، مثل أجهزة IoT.



شاهد: كيفية تصدير Ultralytics YOLO26 إلى تنسيق MNN | تسريع الاستدلال على الأجهزة المحمولة📱

المهام المدعومة#

يدعم التصدير إلى 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

# ⁨تحميل نموذج YOLO26⁩
model = YOLO("yolo26n.pt")

# ⁨تصدير النموذج إلى تنسيق MNN⁩
model.export(format="mnn")  # ⁨ينشئ 'yolo26n.mnn'⁩
التنبؤ
from ultralytics import YOLO

# ⁨تحميل نموذج MNN المُصدّر⁩
model = YOLO("yolo26n.mnn")

# ⁨تنفيذ الاستدلال⁩
results = model("https://ultralytics.com/images/bus.jpg")
تحقّق
from ultralytics import YOLO

# ⁨تحميل نموذج MNN المُصدّر⁩
model = YOLO("yolo26n.mnn")

# ⁨# التحقق من الدقة على مجموعة بيانات COCO8⁩
metrics = model.val(data="coco8.yaml")

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

المعاملالنوعالافتراضيالوصف
formatstr'mnn'التنسيق المستهدف للنموذج المُصدَّر، ويحدد مدى توافقه مع بيئات النشر المختلفة.
imgszint أو tuple640حجم الصورة المطلوب كمدخل للنموذج. يمكن تحديده كعدد صحيح للصور المربعة أو كصف (height, width) للأبعاد المحددة.
quantizeint أو strNoneدقة التكميم: يقلّل 16 (FP16) أو 8 (INT8) حجم الأوزان المُصدّرة؛ أما 32 أو عدم تعيينه فيصدّر أوزان FP32، والتي يظل MNNBackend من Ultralytics يشغّلها بدقة low بدلًا من FP32. يحل هذا محل العلامتَيْن المتوقفتَيْن half وint8.
simplifyboolTrueيبسّط رسم ONNX الوسيط باستخدام onnxslim.
opsetintNoneيحدد إصدار opset الخاص بـ 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 إلى 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: [84, 8400]؛ وتعني 84: [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)
    # ⁨الحصول على أقصى prob و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_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)
        # ⁨تقييد القيم إلى حجم الصورة الأصلية لمعالجة الحالات التي أُضيف فيها حشو⁩
        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
    
    # ⁨تحميل نموذج YOLO26⁩
    model = YOLO("yolo26n.pt")
    
    # ⁨التصدير إلى تنسيق MNN⁩
    model.export(format="mnn")  # ⁨ينشئ 'yolo26n.mnn' بأوزان fp32⁩
    model.export(format="mnn", quantize=16)  # ⁨ينشئ 'yolo26n.mnn' بأوزان fp16⁩
    model.export(format="mnn", quantize=8)  # ⁨ينشئ 'yolo26n.mnn' بأوزان int8⁩

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

  • لإجراء التنبؤ باستخدام نموذج YOLO26 MNN مُصدّر، استخدم الدالة predict من فئة YOLO.

    التنبؤ
    from ultralytics import YOLO
    
    # ⁨تحميل نموذج YOLO26 MNN⁩
    model = YOLO("yolo26n.mnn")
    
    # ⁨تنفيذ الاستدلال⁩
    results = model("https://ultralytics.com/images/bus.jpg")
    
    for result in results:
        result.show()  # ⁨العرض على الشاشة⁩
        result.save(filename="result.jpg")  # ⁨الحفظ على القرص⁩
  • يتسم 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.

التعليقات