AI

تحسين YOLOv8 للسلامة الصناعية القائمة على الحافة

تشهد منظومة السلامة الصناعية تحولاً جذرياً مدفوعاً بالرؤية الحاسوبية في الوقت الفعلي. تعتمد أنظمة المراقبة التقليدية على التحليل بعد وقوع الحدث، لكن بروتوكولات السلامة الحديثة تتطلب تدخلاً فورياً. عندما يفشل عامل في ارتداء معدات الحماية الشخصية (PPE) أو يدخل منطقة محظورة، فإن أجزاء من الألف من الثانية تكون حاسمة. ومع ذلك، فإن نشر نماذج التعلم العميق المعقدة مثل YOLOv8 على أجهزة الحافة محدودة الموارد - مثل لوحات NVIDIA Jetson Orins أو Raspberry Pi - يطرح تحديات كبيرة تتعلق بالزمن الكسري (Latency) وحجم الذاكرة.

تتناول هذه المقالة الاستراتيجيات التقنية اللازمة لاستخراج أقصى أداء من YOLOv8، مما يضمن تشغيله بكفاءة على الحافة دون التضحية بالدقة المطلوبة للتطبيقات الحرجة التي تتعلق بالحياة.

هندسة النموذج والتقليم للقيود الطرفية

تم تصميم نماذج YOLOv8 القياسية، وخاصة إصدارات 'L' أو 'X'، لبطاقات الرسوميات (GPUs) في مراكز البيانات ذات قدرات المعالجة المتوازية الضخمة. يؤدي نشر هذه النماذج مباشرة على جهاز طرفي غالباً إلى معدلات إطارات أقل من 10 إطار في الثانية، وهو أمر غير مقبول لمراقبة السلامة. تتضمن الخطوة الأولى في التحديد اختيار متغير النموذج المناسب. لنشر التطبيقات على الحافة، يجب علينا استخدام إعدادات 'Nano' أو 'Small'.

بeyond اختيار الهندسة، يمكن لتقليم النموذج (Pruning) أن يقلل التعقيد بشكل أكبر. من خلال تحديد وإزالة فلاتر الالتفاف (Convolutional filters) الزائدة التي تساهم بشكل ضئيل في المخرجات النهائية، يمكننا تقليل حجم النموذج بنسبة تصل إلى 40% مع تأثير ضئيل جداً على متوسط الدقة المتوسطة (mAP). هذا أمر بالغ الأهمية لتقليل متطلبات عرض نطاق الذاكرة لجهاز الحافة.

# مثال: اختيار نموذج Nano للنشر على الحافة باستخدام PyTorch
from ultralytics import YOLO

# تحميل نموذج YOLOv8n المدرب مسبقاً (إصدار Nano المحسن للسرعة)
model = YOLO('yolov8n.pt')

# تصدير النموذج إلى تنسيق ONNX لمزيد من التحسين
model.export(format='onnx', opset=12, simplify=True)

print("تم تصدير النموذج بنجاح. تم تحقيق تقليل الحجم من خلال التقليم وتحويل ONNX.")

الكمية: من FP32 إلى INT8

حتى مع وجود بنية أصغر، فإن الحسابات العائمة (FP32) مكلفة من حيث الحوسبة على الأجهزة الطرفية. التقنية الأكثر فعالية لتسريع الاستدلال هي التكميم (Quantization). من خلال تحويل أوزان النموذج وتنشيطه من الفاصلة العائمة 32-بت إلى الأعداد الصحيحة 8-بت (INT8)، يمكننا تقليل استخدام الذاكرة بشكل كبير وزيادة الإنتاجية. تدعم بطاقات الرسوميات الطرفية الحديثة تعليمات INT8 بشكل أصلي، مما يضاعف أو يثلاث سرعات الاستدلال في كثير من الأحيان.

يمكن إجراء التكميم بعد التدريب (PTQ) باستخدام مجموعة بيانات معايرة ممثلة. بينما يكون PTQ أسرع، إلا أنه يتطلب مجموعة بيانات مشابهة لبيئة الإنتاج للحفاظ على الدقة. للتطبيقات الآمنة، حيث تكون النتائج السلبية الكاذبة خطيرة، يُنصح بمعايرة النموذج باستخدام صور تغطي تحديداً ظروف الإضاءة المنخفضة والأجسام المحجوبة الشائعة في البيئات الصناعية.

# مثال: تحويل YOLOv8 إلى INT8 باستخدام تكميم PyTorch
import torch
import torch.quantization as quant

# تحويل النموذج إلى وضع التقييم وتعيين الخلفية المستهدفة
model.train(False)
model.fuse()

# التحضير للتكميم
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
model = torch.quantization.prepare(model)

# تشغيل المعايرة (مكان مؤقت لبيانات المعايرة الفعلية)
# في الممارسة العملية، قم بتشغيل حلقة على مجموعة بيانات المعايرة الممثلة
for images, _ in calibration_loader:
    model(images)

# تحويل إلى نموذج مكمم
model_quantized = torch.quantization.convert(model)

print("تم تكميم النموذج بنجاح إلى تنسيق INT8.")

تحسين وقت التشغيل باستخدام TensorRT

الخطوة الأخيرة في خط أنابيب التحسين هي بناء المحرك باستخدام NVIDIA TensorRT. يحلل TensorRT الرسم البياني الحسابي ويجمع العمليات (مثل دمج الالتفاف + BatchNorm + ReLU في نواة واحدة) مصممة خصيصاً لهندسة بطاقة الرسوميات الأساسية. هذا يقلل من عبء إطلاق النواة، وهو عنق زجاجة كبير في الأجهزة الطرفية التي تشغل العديد من العمليات الصغيرة.

عند التصدير إلى TensorRT، يجب عليك تحديد ملف التعريف التحسيني. يتضمن ذلك تعيين الحد الأدنى والأفضل والأقصى للأشكال لمصفوفة الإدخال. بينما تتطلب تطبيقات السلامة غالباً حجم إدخال ثابت، فإن تعريف ملف تعريف ديناميكي يسمح لـ TensorRT بتحسين استخدام الذاكرة بشكل أفضل إذا تغيرت دقة الكاميرا.

# مثال: بناء محرك TensorRT من نموذج ONNX
from tensorrt import (
    Logger, Builder, NetworkDefinitionCreationFlag,
    IBuilderConfig, ICudaEngine, IHostMemory
)
from onnx_graphsurgeon import Graph, Constant, Tensor

# تحميل نموذج ONNX الذي تم إنشاؤه سابقاً
onnx_path = 'yolov8n.onnx'

# تهيئة بناء TensorRT والشبكة
logger = Logger()
builder = Builder(logger)
network = builder.create_network(NetworkDefinitionCreationFlag(1 << int('LOCAL_STATIC_WORKSPACE_BIT')))
parser = builder.create_onnx_parser(onnx_path, logger)

# تحليل النموذج وبناء المحرك
if not parser.parse(onnx_path):
    print("فشل تحليل نموذج ONNX")

config = builder.create_builder_config()
config.set_max_workspace_size(1 << 30) # مساحة عمل 1 جيجابايت
engine = builder.build_serialized_network(network, config)

# حفظ المحرك المصنّف
with open('yolov8n.engine', 'wb') as f:
    f.write(engine)

الخلاصة

إن تنفيذ كشف الكائنات في الوقت الفعلي على الأجهزة الطرفية للسلامة الصناعية هو تحدٍ هندسي معقد ولكن يمكن تحقيقه. من خلال اختيار هندسة YOLOv8n بشكل استراتيجي، وتطبيق تكميم INT8، والاستفادة من TensorRT لدمج النواة، يمكن للمطورين تحقيق زمن استجابة أقل من 30 مللي ثانية. هذا يضمن إنشاء تنبيهات السلامة أسرع من تطور الخطر المادي، مما يخلق نظام مراقبة قوي ومتجاوب. مع استمرار تطور الأجهزة الطرفية، ستظل هذه التقنيات التحسينية أساسية لنشر الذكاء الاصطناعي الموثوق في البيئات الصناعية الحرجة.

Share: