تصدير Hailo لنماذج Ultralytics YOLO
تنسيق Hailo HEF غير مدعوم رسمياً كوجهة مباشرة لأمر تصدير Ultralytics model.export(format="hailo"). يقوم سير العمل أدناه بالتصدير إلى ONNX أولاً، ثم يستخدم سلسلة أدوات Dataflow Compiler الخارجية الخاصة بـ Hailo لإنتاج ملف .hef. للحصول على أداء أفضل لكل واط مقارنة بإصدارات Hailo HEF الأقدم، استخدم تنسيقات تصدير Ultralytics المباشرة الأحدث مثل Axelera AI أو DeepX بدلاً من ذلك.
تستخدم سلسلة أدوات Hailo ملفات HEF للمنصات المضمنة بما في ذلك Raspberry Pi AI Kit و AI HAT+، والكاميرات الصناعية، وبوابات الحافة، وأجهزة الكمبيوتر المخصصة للذكاء الاصطناعي.
يشرح هذا الدليل كيفية تصدير نماذج اكتشاف Ultralytics YOLO إلى تنسيق HEF (تنسيق Hailo القابل للتنفيذ) الخاص بـ Hailo باستخدام حزمة تطوير البرامج Hailo Dataflow Compiler (DFC). يبدأ سير العمل من نموذج YOLO بتنسيق .pt ، ويصدره إلى ONNX ، ثم يقوم بتجميعه باستخدام أدوات Hailo لإنتاج ملف .hef جاهز لمسرعات Hailo-8 و Hailo-8L و Hailo-15.
متى تستخدم Hailo HEF
HEF هو ملف ناتج مجمع يستهلكه HailoRT على أجهزة Hailo المستهدفة. استخدم هذا الدليل فقط عندما تتطلب أجهزة النشر الخاصة بك تنسيق Hailo HEF بشكل محدد. إذا كنت لا تزال تختار أجهزة الحافة أو وجهات التصدير، فابدأ بتنسيقات تصدير Ultralytics المباشرة الأحدث مثل Axelera AI أو DeepX، والتي توفر سير عمل مدعوم لـ model.export(...) وخيارات أفضل للأداء لكل واط من عمليات نشر Hailo القديمة.
يماثل HEF في دور النشر التنسيقات الخاصة بالأجهزة مثل RKNN لوحدات Rockchip NPU، و IMX500 لكاميرات Raspberry Pi AI، و Qualcomm QNN لوحدات Snapdragon NPU، ولكنه لا يتم إنتاجه حالياً بشكل مباشر بواسطة Ultralytics.
يكون سير العمل هذا مناسباً عندما تحتاج إلى:
- التوافق مع Raspberry Pi AI Kit: يُستخدم Hailo-8L في Raspberry Pi AI Kit الرسمي و AI HAT+.
- المعالجة اللاحقة لـ HailoRT: يمكن لـ HailoRT تضمين إخماد غير الحد الأقصى (NMS) الخاص بـ YOLO في خط أنابيب الاستدلال المجمع.
- تجميع INT8: تقوم Hailo DFC بتكميم النموذج باستخدام صور معايرة تمثيلية لإنتاج رسم بياني INT8 لأجهزة Hailo. تعرف على المزيد حول تكميم النموذج.
تنسيق تصدير Hailo HEF
HEF هو ملف قابل للتنفيذ خاص بالأجهزة يتم إنتاجه بواسطة Hailo Dataflow Compiler. يحتوي على رسم بياني للنموذج المكمم، وتخصيص الذاكرة، والجدولة، والمعالجة اللاحقة الاختيارية المهيأة لبنية Hailo المستهدفة. على عكس تنسيقات وضع التصدير القياسية في YOLO التي يتم إنتاجها مباشرة بواسطة model.export(format=...) ، يستخدم تجميع HEF حالياً تدفقاً من مرحلتين:
- تصدير YOLO إلى ONNX باستخدام Ultralytics.
- استخدام أدوات Hailo DFC لتحليل، وتحسين، وتكميم، وتجميع نموذج ONNX إلى ملف HEF.
يتوسع سير العمل الكامل إلى خط الأنابيب التالي:
YOLO (.pt) -> ONNX -> HAR (parse) -> HAR (optimize/quantize) -> HEF (compile)- التصدير إلى ONNX باستخدام وضع التصدير من Ultralytics
- تحليل نموذج ONNX إلى تنسيق HAR الوسيط الخاص بـ Hailo
- تحميل برنامج نصي للنموذج (
.alls) مع توجيهات التطبيع والمعالجة اللاحقة - المعايرة والتكميم باستخدام صور تمثيلية
- التجميع إلى ملف HEF قابل للنشر
المهام المدعومة
يركز هذا الدليل على نماذج اكتشاف الكائنات من Ultralytics YOLO، لأن برنامج Hailo النصي وتكوين NMS خاصان برأس الاكتشاف.
| المهمة | مدعوم |
|---|---|
| اكتشاف الكائنات | ✅ نعم |
| تجزئة النسخ | ❌ لا |
| التجزئة الدلالية | ❌ لا |
| تقدير الوضع | ❌ لا |
| اكتشاف OBB | ❌ لا |
| التصنيف | ❌ لا |
بالنسبة لعمليات نشر تجزئة المثيل، والتجزئة الدلالية، وتقدير الوضع، و OBB، والتصنيف، قارن تنسيقات الحافة الأخرى في جدول وضع التصدير أو استخدم خط أنابيب ONNX عاماً حيث يدعم وقت التشغيل المستهدف الخاص بك المهمة.
ملاحظات التوافق
يعتمد توافق تصدير Hailo على رأس النموذج، وحجم صورة الإدخال، وعدد الفئات، وبنية Hailo، وبرنامج النموذج النصي (.alls)، وتكوين NMS. تعتبر الملفات الثابتة من Hailo Model Zoo مراجع مفيدة، لكنها ليست قوالب عالمية. على سبيل المثال، ملف NMS JSON الذي تم إنشاؤه لنموذج YOLO11n المكون من 80 فئة COCO ليس صحيحاً لنموذج مخصص مكون من 3 فئات أو لـ imgsz ثابت مختلف.
| النطاق | الدعم المتوقع | ملاحظات |
|---|---|---|
| اكتشاف YOLOv8 / YOLO11، النماذج المخزنة | ✅ جيد | رأس اكتشاف مشترك ومنفصل؛ لا تزال .alls وعقد النهاية وتكوين NMS بحاجة إلى مطابقة الرسم البياني المصدر و imgsz الثابت. |
| اكتشاف YOLOv8 / YOLO11 مخصص | ✅ ممكن | يتطلب تكوين NMS لكل نموذج يتم إنشاؤه من عدد الفئات، والخطوات (strides)، وتخطيط رأس الاكتشاف؛ لن يطابق JSON الخاص بـ Model Zoo الثابت. |
| اكتشاف YOLOv9 | ⚠️ تحقق | نمط رأس اكتشاف مشابه، ولكن يجب اختبار التجميع وتحليل المخرجات قبل اعتباره مدعوماً. |
| اكتشاف YOLOv10 / YOLO26 من البداية إلى النهاية | ❌ غير مدعوم | لا تتطابق عمليات التصدير من البداية إلى النهاية / الخالية من NMS مع مسار المعالجة اللاحقة لـ NMS في Hailo؛ استخدم رأس اكتشاف تقليدي إذا كنت تختبر يدوياً. |
| أحجام صور ديناميكية أو تعسفية | ❌ غير مدعوم | يستخدم تجميع Hailo شكلاً ثابتاً للإدخال؛ يجب أن تتطابق .alls وإعدادات NMS مع imgsz المصدر. |
التثبيت
الخطوة 1: تثبيت Ultralytics
pip install ultralyticsالخطوة 2: تثبيت Hailo DFC SDK
تعتبر Hailo DFC مطلوبة للتحليل والتحسين والتجميع. قم بتنزيل ملف Python wheel من Hailo Developer Zone (يتطلب تسجيل مجاني) وقم بتثبيته:
pip install /path/to/hailo_sdk_client-*.whlتتطلب Hailo DFC SDK جهاز Linux x86_64. لا يمكن إجراء التصدير والتجميع على أجهزة ARM مثل Raspberry Pi. انسخ ملف .hef الناتج إلى جهازك الذي يعمل بنظام Hailo للنشر باستخدام HailoRT.
مثال تصدير YOLO11n HEF
يقوم البرنامج النصي أدناه بتجميع نموذج اكتشاف YOLO11n من .pt إلى .hef بحجم إدخال ثابت يبلغ 640 بكسل. يقوم بالتصدير إلى ONNX باستخدام Ultralytics، ثم يتم التجميع باستخدام Hailo DFC باستخدام COCO128 كمجموعة بيانات معايرة صغيرة.
قبل تشغيل البرنامج النصي، قم بتنزيل ملف تكوين YOLO11n NMS المطابق من Hailo Model Zoo أو قم بإنشاء Hailo NMS JSON الخاص بك للنموذج. أعد استخدام هذا البرنامج النصي كنقطة بداية معروفة لـ YOLO11n؛ تحتاج النماذج المخصصة إلى عقد نهاية مطابقة وتوجيهات .alls وإعدادات NMS.
import random
import numpy as np
from hailo_sdk_client import ClientRunner
from PIL import Image
from ultralytics import YOLO
from ultralytics.data.utils import check_det_dataset
from ultralytics.utils import DATASETS_DIR
# Configuration
MODEL = "yolo11n"
HW_ARCH = "hailo8" # hailo8 | hailo8l | hailo15h
IMGSZ = 640
CALIB_IMAGES = 128
NMS_CONFIG = "yolo11n_nms_config.json" # Download or generate for your exact model.
# YOLO11 detection head end nodes. See "Supported Models and End Nodes" for YOLOv8 and other families.
END_NODES = [
"/model.23/cv2.0/cv2.0.2/Conv",
"/model.23/cv3.0/cv3.0.2/Conv",
"/model.23/cv2.1/cv2.1.2/Conv",
"/model.23/cv3.1/cv3.1.2/Conv",
"/model.23/cv2.2/cv2.2.2/Conv",
"/model.23/cv3.2/cv3.2.2/Conv",
]
# Step 1: Export to ONNX
model = YOLO(f"{MODEL}.pt")
model.export(format="onnx", imgsz=IMGSZ, opset=11) # creates an ONNX file named after MODEL
# Step 2: Parse ONNX with Hailo DFC
# The DFC prints the detected end nodes after parsing; use them if unsure.
runner = ClientRunner(hw_arch=HW_ARCH)
runner.translate_onnx_model(f"{MODEL}.onnx", end_node_names=END_NODES)
# Step 3: Load model script (normalization + HailoRT NMS)
# The conv layer names are generated by DFC and can change for other model sizes/families.
alls = (
"normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])\n"
"change_output_activation(conv54, sigmoid)\n"
"change_output_activation(conv65, sigmoid)\n"
"change_output_activation(conv80, sigmoid)\n"
f'nms_postprocess("{NMS_CONFIG}", meta_arch=yolov8, engine=cpu)\n'
"allocator_param(width_splitter_defuse=disabled)"
)
runner.load_model_script(alls)
# Step 4: Build calibration dataset (auto-downloads COCO128)
check_det_dataset("coco128.yaml")
calib_dir = DATASETS_DIR / "coco128" / "images" / "train2017"
image_files = list(calib_dir.glob("*.jpg")) + list(calib_dir.glob("*.png"))
if not image_files:
raise FileNotFoundError(f"No calibration images found in {calib_dir}")
calibset = np.zeros((CALIB_IMAGES, IMGSZ, IMGSZ, 3), dtype=np.float32)
for i in range(CALIB_IMAGES):
img = Image.open(random.choice(image_files)).convert("RGB").resize((IMGSZ, IMGSZ))
calibset[i] = np.array(img, dtype=np.float32)
# Step 5: Optimize and quantize
runner.optimize(calibset)
runner.save_har(f"{MODEL}.o.har") # optional intermediate HAR
# Step 6: Compile to HEF
hef = runner.compile()
with open(f"{MODEL}.hef", "wb") as f:
f.write(hef)
print(f"Compiled HEF saved to: {MODEL}.hef")ملف HEF الناتج، مثل yolo11n.hef ، جاهز للنشر على جهاز Hailo متوافق. إذا كنت تقوم بالتجميع لـ Raspberry Pi AI Kit، اضبط HW_ARCH = "hailo8l" قبل تشغيل خطوة التجميع.
تفصيل خطوة بخطوة
الخطوة 1: التصدير إلى ONNX
تُصدر Ultralytics نموذجك المدرب إلى تنسيق ONNX، والذي تستقبله Hailo DFC كمدخلات. اضبط opset=11 لضمان توافق DFC واسع.
from ultralytics import YOLO
MODEL = "yolo11n"
model = YOLO(f"{MODEL}.pt")
model.export(format="onnx", imgsz=640, opset=11)الخطوة 2: تحليل نموذج ONNX
يقوم استدعاء translate_onnx_model بتحويل رسم بياني ONNX إلى تمثيل HAR الوسيط الخاص بـ Hailo. تخبر قائمة end_node_names نظام DFC بمكان قطع الرسم البياني قبل NMS حتى تتمكن Hailo من إرفاق معالجتها اللاحقة الخاصة بالأجهزة.
from hailo_sdk_client import ClientRunner
runner = ClientRunner(hw_arch="hailo8")
runner.translate_onnx_model(f"{MODEL}.onnx", end_node_names=END_NODES)تطبع DFC اقتراحاً بعد التحليل:
[info] In order to use HailoRT post-processing capabilities, these end node names should be used: ...
انسخ أسماء العقد تلك إذا كنت غير متأكد من أيها تستخدم، أو إذا كنت تعمل مع بنية مخصصة أو أقل شيوعاً.
الخطوة 3: تحميل برنامج النموذج النصي
يقوم برنامج النموذج النصي (.alls) بتهيئة تطبيع الإدخال، وتنشيط المخرجات، ومعالجة NMS اللاحقة. ينطبق إعداد meta_arch=yolov8 على كل من YOLOv8 و YOLO11 لأنهما يتشاركان نفس تخطيط رأس الاكتشاف.
MODEL = "yolo11n"
NMS_CONFIG = "yolo11n_nms_config.json"
alls = (
"normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])\n"
"change_output_activation(conv54, sigmoid)\n"
"change_output_activation(conv65, sigmoid)\n"
"change_output_activation(conv80, sigmoid)\n"
f'nms_postprocess("{NMS_CONFIG}", meta_arch=yolov8, engine=cpu)\n'
"allocator_param(width_splitter_defuse=disabled)"
)
runner.load_model_script(alls)يتم تعيين أسماء طبقات change_output_activation (conv54 ، conv65 ، conv80) بواسطة DFC أثناء التحليل وهي خاصة بالنموذج. إذا كنت تقوم بتجميع حجم أو بنية نموذج مختلفة، فتحقق من مخرجات DFC لمعرفة الأسماء الصحيحة، أو استخدم ملف .alls محدداً مسبقاً من Hailo Model Zoo.
ملف NMS_CONFIG خاص بالنموذج أيضاً. استخدم التكوين الذي يطابق نموذجك المصدر، أو ابدأ من تكوين Hailo Model Zoo لمتغير YOLO الأقرب.
يقوم engine=cpu بتشغيل NMS عبر HailoRT على وحدة المعالجة المركزية المضيفة. استخدم engine=nn_core فقط لمجموعات النماذج/البرامج النصية التي توثقها Hailo على أنها مدعومة من قبل الأجهزة المستهدفة وإصدار SDK.
احذف سطر nms_postprocess إذا كنت تفضل تشغيل NMS بالكامل في كود تطبيقك. إذا قمت بذلك، فقم بتحديث محلل الاستدلال لأن HEF سيخرج موترات رأس اكتشاف أولية بدلاً من اكتشافات NMS مجمعة.
الخطوة 4: بناء مجموعة بيانات المعايرة
يتطلب تكميم INT8 مجموعة تمثيلية من الصور. يستخدم البرنامج النصي أدناه COCO128، الذي تقوم Ultralytics بتنزيله تلقائياً عبر check_det_dataset:
from ultralytics.data.utils import check_det_dataset
from ultralytics.utils import DATASETS_DIR
check_det_dataset("coco128.yaml") # downloads to DATASETS_DIR if not present
calib_dir = DATASETS_DIR / "coco128" / "images" / "train2017"استخدم 64 صورة على الأقل للمعايرة. تعمل المزيد من الصور عموماً على تحسين جودة التكميم. للحصول على أفضل النتائج، استخدم صوراً من نطاق نشرك بدلاً من COCO128.
الخطوة 5: التحسين والتكميم
runner.optimize(calibset)
runner.save_har(f"{MODEL}.o.har") # optional intermediate checkpointتطبق هذه الخطوة الضبط الدقيق المدرك للتكميم وتحليل ضجيج الطبقة. يوصى بشدة باستخدام وحدة معالجة رسومات (GPU)؛ بدونها، قد تستغرق هذه الخطوة عدة ساعات.
الخطوة 6: التجميع إلى HEF
hef = runner.compile()
with open(f"{MODEL}.hef", "wb") as f:
f.write(hef)النماذج المدعومة وعقد النهاية
بالنسبة لنماذج الاكتشاف، تحدد end_node_names مخرجات رأس اكتشاف ONNX التي يجب أن تجمعها Hailo قبل إرفاق معالجتها اللاحقة NMS. تختلف هذه الأسماء حسب البنية ويمكن أن تتغير عند تغير الرسم البياني المصدر.
YOLO11 و YOLOv8
يتشارك YOLO11 و YOLOv8 في نفس رأس الاكتشاف المنفصل. يختلف مؤشر الطبقة بمقدار واحد بين العائلتين:
| عائلة النموذج | طبقة رأس الاكتشاف | نمط عقدة النهاية |
|---|---|---|
| YOLO11 (الكل) | model.23 | /model.23/cv2.0/cv2.0.2/Conv (6 عقد) |
| YOLOv8 (الكل) | model.22 | /model.22/cv2.0/cv2.0.2/Conv (6 عقد) |
عقد نهاية YOLO11 (جميع الأحجام: n, s, m, l, x):
END_NODES = [
"/model.23/cv2.0/cv2.0.2/Conv",
"/model.23/cv3.0/cv3.0.2/Conv",
"/model.23/cv2.1/cv2.1.2/Conv",
"/model.23/cv3.1/cv3.1.2/Conv",
"/model.23/cv2.2/cv2.2.2/Conv",
"/model.23/cv3.2/cv3.2.2/Conv",
]عقد نهاية YOLOv8 (جميع الأحجام: n, s, m, l, x):
END_NODES = [
"/model.22/cv2.0/cv2.0.2/Conv",
"/model.22/cv3.0/cv3.0.2/Conv",
"/model.22/cv2.1/cv2.1.2/Conv",
"/model.22/cv3.1/cv3.1.2/Conv",
"/model.22/cv2.2/cv2.2.2/Conv",
"/model.22/cv3.2/cv3.2.2/Conv",
]بنيات أخرى
بالنسبة لمعماريات الكشف الأخرى، قم بتشغيل خطوة التحليل (parse) بدون end_node_names أولاً، واقرأ العُقد المقترحة من مخرجات سجل DFC، ثم أعد التشغيل باستخدام تلك العُقد:
# First pass: let the DFC suggest end nodes
runner = ClientRunner(hw_arch=HW_ARCH)
runner.translate_onnx_model(f"{MODEL}.onnx")
# Check the printed log for: "[info] In order to use HailoRT post-processing..."تتوفر ملفات نصوص .alls محددة مسبقًا وملفات إعدادات NMS للعديد من إصدارات YOLO في Hailo Model Zoo.
معماريات الأجهزة المدعومة
| المعمارية | الجهاز | ذروة الأداء الحسابي (مواصفات المورد) | حالات الاستخدام الشائعة |
|---|---|---|---|
hailo8 | Hailo-8 | 26 TOPS | بطاقة تسريع Hailo |
hailo8l | Hailo-8L | 13 TOPS | Raspberry Pi AI Kit |
hailo15h | Hailo-15H | 20 TOPS | أجهزة Hailo-15 المستهدفة |
قم بتعيين HW_ARCH في البرنامج النصي ليطابق جهازك المستهدف قبل التجميع.
تشغيل الاستدلال على أجهزة Hailo
بمجرد حصولك على ملف .hef، انسخه إلى جهازك الذي يعمل بنظام Hailo وقم بتشغيل الاستدلال باستخدام واجهة برمجة تطبيقات HailoRT بلغة Python (حزمة hailo_platform). على عكس خطوات تصدير DFC، يتم تشغيل الاستدلال مباشرة على جهاز الحافة (edge device).
يعمل كود الاستدلال أدناه على الجهاز الذي يعمل بنظام Hailo (على سبيل المثال Raspberry Pi + AI Kit)، وليس على جهاز x86 المستخدم للتجميع.
الخطوة 1: تثبيت HailoRT على الجهاز
على الجهاز المستهدف، قم بتثبيت HailoRT وتوافقات Python. بالنسبة لمستخدمي Raspberry Pi AI Kit و AI HAT+، يقوم دليل برمجيات Raspberry Pi AI الرسمي بتثبيت HailoRT وبرنامج تشغيل الجهاز وتوافقات Python عبر:
sudo apt install dkms
sudo apt install hailo-allبالنسبة لأجهزة Hailo غير التابعة لـ Raspberry Pi، قم بتثبيت حزمة HailoRT التي تطابق جهازك وبرنامج التشغيل وإصدار SDK الخاص بك من Hailo Developer Zone.
تستخدم أجهزة AI HAT+ 2 حزمة Raspberry Pi مختلفة (hailo-h10-all) وسير عمل Hailo-10H. اتبع دليل برمجيات Raspberry Pi AI الخاص بذلك الجيل من الأجهزة.
الخطوة 2: فحص سريع
قبل تشغيل استدلال Python، تأكد من أن جهاز Hailo تم التعرف عليه:
hailortcli fw-control identifyيجب أن ترى نوع الجهاز وإصدار البرنامج الثابت والرقم التسلسلي مطبوعة.
الخطوة 3: تشغيل الاستدلال
يقوم البرنامج النصي أدناه بتشغيل كشف الكائنات على صورة واحدة باستخدام ملف HEF المجمع وواجهة برمجة تطبيقات Python hailo_platform. وهو يتعامل مع المعالجة المسبقة والاستدلال ورسم مربعات الإحاطة من مخرجات NMS الخاصة بـ HailoRT.
import numpy as np
from hailo_platform import (
HEF,
ConfigureParams,
FormatType,
HailoStreamInterface,
InferVStreams,
InputVStreamParams,
OutputVStreamParams,
VDevice,
)
from PIL import Image, ImageDraw
# Configuration
MODEL = "yolo11n"
HEF_PATH = f"{MODEL}.hef" # path to your compiled HEF file
SOURCE = "bus.jpg" # image path
IMGSZ = 640
CONF = 0.25
COCO_NAMES = [
"person",
"bicycle",
"car",
"motorcycle",
"airplane",
"bus",
"train",
"truck",
"boat",
"traffic light",
"fire hydrant",
"stop sign",
"parking meter",
"bench",
"bird",
"cat",
"dog",
"horse",
"sheep",
"cow",
"elephant",
"bear",
"zebra",
"giraffe",
"backpack",
"umbrella",
"handbag",
"tie",
"suitcase",
"frisbee",
"skis",
"snowboard",
"sports ball",
"kite",
"baseball bat",
"baseball glove",
"skateboard",
"surfboard",
"tennis racket",
"bottle",
"wine glass",
"cup",
"fork",
"knife",
"spoon",
"bowl",
"banana",
"apple",
"sandwich",
"orange",
"broccoli",
"carrot",
"hot dog",
"pizza",
"donut",
"cake",
"chair",
"couch",
"potted plant",
"bed",
"dining table",
"toilet",
"tv",
"laptop",
"mouse",
"remote",
"keyboard",
"cell phone",
"microwave",
"oven",
"toaster",
"sink",
"refrigerator",
"book",
"clock",
"vase",
"scissors",
"teddy bear",
"hair drier",
"toothbrush",
]
# Load HEF and connect to device
hef = HEF(HEF_PATH)
params = VDevice.create_params()
target = VDevice(params)
configure_params = ConfigureParams.create_from_hef(hef, interface=HailoStreamInterface.PCIe)
network_groups = target.configure(hef, configure_params)
network_group = network_groups[0]
network_group_params = network_group.create_params()
# Setup I/O virtual streams
input_vstreams_params = InputVStreamParams.make(network_group, quantized=False, format_type=FormatType.FLOAT32)
output_vstreams_params = OutputVStreamParams.make(network_group, quantized=False, format_type=FormatType.FLOAT32)
# Preprocess
orig = Image.open(SOURCE).convert("RGB")
ow, oh = orig.size
resized = orig.resize((IMGSZ, IMGSZ))
input_data = np.expand_dims(np.array(resized, dtype=np.float32), axis=0) # (1,640,640,3)
input_name = hef.get_input_vstream_infos()[0].name
# Inference
with InferVStreams(network_group, input_vstreams_params, output_vstreams_params) as pipeline:
with network_group.activate(network_group_params):
pipeline.send({input_name: input_data})
raw = pipeline.recv()
# Parse HailoRT NMS output and draw results
# When compiled with nms_postprocess the HEF outputs detections grouped by
# class: shape (batch, num_classes, max_dets, 5) where 5 = [y1,x1,y2,x2,score]
draw = ImageDraw.Draw(orig)
output_key = next(iter(raw.keys()))
batch_dets = raw[output_key][0] # shape: (num_classes, max_dets, 5)
for cls_idx, cls_dets in enumerate(batch_dets):
for det in cls_dets:
score = float(det[4])
if score < CONF:
continue
y1, x1, y2, x2 = det[:4]
# Scale from model coords (0-640) back to original image size
x1 = int(x1 * ow / IMGSZ)
y1 = int(y1 * oh / IMGSZ)
x2 = int(x2 * ow / IMGSZ)
y2 = int(y2 * oh / IMGSZ)
label = f"{COCO_NAMES[cls_idx]} {score:.2f}"
draw.rectangle([x1, y1, x2, y2], outline="red", width=2)
draw.text((x1 + 2, y1 + 2), label, fill="red")
orig.save("output.jpg")
print("Saved output.jpg")يفترض تنسيق مخرجات الكشف أنه تم تجميع ملف HEF مع nms_postprocess في البرنامج النصي .alls. إذا قمت بالتجميع بدون NMS، فإن المخرجات الخام هي 6 موترات لرأس الكشف ويجب عليك تشغيل NMS في تطبيقك بشكل منفصل.
Raspberry Pi AI Kit و AI HAT+
تستخدم Raspberry Pi AI Kit و 13 TOPS AI HAT+ شريحة Hailo-8L. لاستخدام أي من الجهازين:
- اضبط
HW_ARCH = "hailo8l"قبل تجميع ملف HEF على جهاز x86. - انسخ ملف
.hefإلى Raspberry Pi الخاص بك. - قم بتثبيت HailoRT باتباع دليل برمجيات Raspberry Pi AI الرسمي.
- شغل برنامج الاستدلال النصي أعلاه.
للاستدلال القائم على الكاميرا على Raspberry Pi، توفر أمثلة Hailo لـ picamera2 نصوصاً برمجية جاهزة للاستخدام للكشف المباشر باستخدام وحدة الكاميرا. يمكنك أيضاً مقارنة مسارات نشر Raspberry Pi في دليل Coral Edge TPU على Raspberry Pi و دليل تكامل Sony IMX500.
استدلال الفيديو باستخدام TAPPAS
لخطوط أنابيب الفيديو ذات الإنتاجية العالية، توفر TAPPAS عناصر GStreamer التي تبث الفيديو عبر شريحة Hailo في الوقت الفعلي:
MODEL=yolo11n
gst-launch-1.0 filesrc location=video.mp4 ! decodebin ! \
hailonet hef-path=${MODEL}.hef ! \
hailofilter function-name=yolov8 ! \
hailooverlay ! autovideosinkراجع توثيق TAPPAS للحصول على خيارات تكوين خط الأنابيب الكاملة.
ملخص
غطى هذا الدليل سير العمل الكامل لتصدير نماذج كشف Ultralytics YOLO إلى تنسيق Hailo HEF:
- التصدير إلى ONNX باستخدام Ultralytics (
model.export(format="onnx")). - تحليل نموذج ONNX باستخدام Hailo DFC وتحديد عُقد نهاية رأس الكشف.
- تكوين التطبيع و NMS عبر برنامج نصي للنموذج.
- الكمية (Quantization) باستخدام مجموعة بيانات المعايرة (COCO128 عبر Ultralytics).
- التجميع إلى ملف
.hefجاهز لـ Hailo-8 أو Hailo-8L أو Hailo-15.
لمزيد من التفاصيل، راجع Hailo Developer Zone، وتوثيق Hailo، و Hailo Model Zoo. لأهداف تصدير Ultralytics الأخرى، راجع ONNX، و OpenVINO، و TensorRT، و NCNN، و TFLite Edge TPU، و RKNN، و Sony IMX500، و Qualcomm QNN ذات الصلة. لمقارنة سرعة ودقة النموذج المصدر عبر التنسيقات، استخدم وضع المقارنة المعيارية. للحصول على القائمة الكاملة للتنسيقات والخيارات، قم بزيارة توثيق وضع التصدير و صفحة دليل التكامل.
الأسئلة الشائعة
ما هي أجهزة Hailo المدعومة؟
يدعم Hailo DFC كلاً من Hailo-8 (hailo8) و Hailo-8L (hailo8l) و Hailo-15H (hailo15h). راجع جدول معماريات الأجهزة المدعومة للحصول على قيمة HW_ARCH المطابقة.
أي نماذج Ultralytics يمكن تصديرها؟
يركز هذا الدليل على نماذج الكشف. راجع المهام المدعومة لنطاق المهام، و ملاحظات التوافق لحدود توافق النموذج، و النماذج المدعومة وعُقد النهاية للحصول على أمثلة لعُقد نهاية YOLO11 و YOLOv8.
لماذا يستخدم البرنامج النصي للنموذج meta_arch=yolov8 لـ YOLO11؟
يستخدم YOLO11 نفس معمارية رأس الكشف المنفصل مثل YOLOv8. يستخدم Hailo DFC meta_arch=yolov8 لتكوين NMS لعائلتي النماذج.
هل أحتاج إلى GPU لخطوة التحسين؟
يوصى بشدة باستخدام GPU للضبط الدقيق الواعي بالكمية في runner.optimize(). بدون GPU، تستمر العملية في العمل ولكنها تكون أبطأ بكثير (ساعات طويلة مقارنة بـ 10-20 دقيقة تقريباً مع GPU).
كيف أجد عُقد النهاية الصحيحة لنموذجي؟
قم بتشغيل runner.translate_onnx_model(...) دون تحديد end_node_names، ثم استخدم عُقد رأس الكشف المقترحة التي يطبعها DFC. راجع معماريات أخرى لمثال الأمر.
من أين يمكنني الحصول على Hailo DFC SDK وملفات إعدادات NMS؟
تتوفر عجلة Python الخاصة بـ Hailo DFC SDK من Hailo Developer Zone، بينما تتوفر ملفات نصوص .alls محددة مسبقاً وملفات إعدادات NMS من Hailo Model Zoo.