تصدير MNN لنماذج YOLO26 ونشرها#
MNN#
يُعد MNN إطار عمل فعالًا للغاية وخفيف الوزن للتعلّم العميق. وهو يدعم الاستدلال وتدريب نماذج التعلّم العميق، ويقدم أداءً رائدًا في المجال للاستدلال والتدريب على الجهاز. حاليًا، دُمج MNN في أكثر من 30 تطبيقًا تابعًا لشركة Alibaba Inc، مثل Taobao وTmall وYouku وDingTalk وXianyu وغيرها، ويغطي أكثر من 70 حالة استخدام، مثل البث المباشر وتصوير مقاطع الفيديو القصيرة وتوصيات البحث والبحث عن المنتجات بالصور والتسويق التفاعلي وتوزيع الأسهم والتحكم في المخاطر الأمنية. إضافة إلى ذلك، يُستخدم MNN أيضًا على الأجهزة المضمنة، مثل أجهزة IoT.
شاهد: كيفية تصدير Ultralytics YOLO26 إلى تنسيق MNN | تسريع الاستدلال على الأجهزة المحمولة📱
المهام المدعومة#
يدعم التصدير إلى 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 أوضاع التصدير والتنبؤ والتحقق. صدّر نموذجك، ثم حمّل النموذج المُصدّر لإجراء الاستدلال أو التحقق من دقته.
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")وسيطات التصدير#
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
format | str | 'mnn' | التنسيق المستهدف للنموذج المُصدَّر، ويحدد مدى توافقه مع بيئات النشر المختلفة. |
imgsz | int أو tuple | 640 | حجم الصورة المطلوب كمدخل للنموذج. يمكن تحديده كعدد صحيح للصور المربعة أو كصف (height, width) للأبعاد المحددة. |
quantize | int أو str | None | دقة التكميم: يقلّل 16 (FP16) أو 8 (INT8) حجم الأوزان المُصدّرة؛ أما 32 أو عدم تعيينه فيصدّر أوزان FP32، والتي يظل MNNBackend من Ultralytics يشغّلها بدقة low بدلًا من FP32. يحل هذا محل العلامتَيْن المتوقفتَيْن half وint8. |
simplify | bool | True | يبسّط رسم ONNX الوسيط باستخدام onnxslim. |
opset | int | None | يحدد إصدار opset الخاص بـ ONNX لرسم ONNX الوسيط. وإذا لم يُحدَّد، فسيُستخدم أحدث إصدار مدعوم. |
batch | int | 1 | يحدد حجم الدفعة للاستدلال بنموذج التصدير، أو الحد الأقصى لعدد الصور التي سيعالجها النموذج المُصدّر بالتزامن في وضع predict. |
dynamic | bool | False | يتيح أبعادًا ديناميكية لصور الإدخال. ولا يمكن دمجه مع nms=True. |
nms | bool، اختياري | None | حدد المخرجات الخام (None، الافتراضي)، أو NMS المضمن (True)، أو الرأس الخالي من NMS (False). يدعم NMS المضمن مهام الكشف وتقدير الوضعية مع dynamic=False. |
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 إلى 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 على الأجهزة المحمولة:
- الإنشاء لنظام Android: اتبع دليل MNN لنظام Android.
- الإنشاء لنظام iOS: اتبع دليل MNN لنظام iOS.
- الإنشاء لنظام Harmony: اتبع دليل MNN لنظام Harmony.