تصدير نماذج YOLO26 ونشرها باستخدام MNN#
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 أوضاع التصدير والتنبؤ والتحقق. صدّر نموذجك، ثم حمّل النموذج المُصدَّر لإجراء الاستدلال أو التحقق من دقته.
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 | حجم الصورة المطلوب لإدخال النموذج. يمكن أن يكون عددًا صحيحًا للصور المربعة أو صفًا (height, width) لأبعاد محددة. |
quantize | int أو str | None | دقة التكميم: تعمل 16 (FP16) أو 8 (INT8) على تقليل الأوزان المُصدَّرة؛ بينما تُصدِّر 32/غير المُعيَّنة أوزان FP32، التي لا يزال وقت تشغيل MNN على CPU يحسبها بدقة low الافتراضية لديه بدلًا من FP32. وتحل هذه الخيارات محل العلامتَي half/int8 المتقادمتين. |
simplify | bool | True | يبسّط الرسم البياني الوسيط لـ ONNX باستخدام onnxslim. |
opset | int | None | يحدد إصدار مجموعة عمليات 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 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 على الأجهزة المحمولة:
- البناء لنظام Android: اتبع دليل MNN Android.
- البناء لنظام iOS: اتبع دليل MNN iOS.
- البناء لنظام Harmony: اتبع دليل MNN Harmony.