Ultralytics YOLO27:
Get Started

تقليم النماذج والتخلخل في YOLOv5#

📚 يشرح هذا الدليل كيفية تطبيق التقليم على نماذج YOLOv5 🚀 لإنشاء شبكات أكثر كفاءة مع الحفاظ على الأداء.

ما تقليم النماذج؟#

تقليم النماذج تقنية تُستخدم لتقليل حجم الشبكات العصبية وتعقيدها عبر إزالة المعاملات الأقل أهمية (الأوزان والوصلات). وتنتج عن هذه العملية نماذج أكثر كفاءة تحقق عدة فوائد:

  • تقليل حجم النموذج لتسهيل نشره على الأجهزة محدودة الموارد
  • زيادة سرعة الاستدلال بأدنى تأثير في الدقة
  • خفض استخدام الذاكرة واستهلاك الطاقة
  • تحسين الكفاءة الإجمالية للتطبيقات الفورية

يعمل التقليم على تحديد المعاملات التي لا تسهم إلا قليلًا في أداء النموذج وإزالتها، ما ينتج نموذجًا أخف وزنًا بدقة مماثلة.

قبل البدء#

استنسخ المستودع وثبّت requirements.txt في بيئة Python>=3.8.0، بما في ذلك PyTorch>=1.8. تُنزّل النماذج ومجموعات البيانات تلقائيًا من إصدار YOLOv5 الأحدث.

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

اختبار الأداء الأساسي#

قبل التقليم، حدّد أداءً أساسيًا للمقارنة به. يختبر هذا الأمر YOLOv5x على COCO val2017 بحجم صورة يبلغ 640 بكسلًا. يُعد yolov5x.pt أكبر النماذج المتاحة وأكثرها دقة. وتشمل الخيارات الأخرى yolov5s.pt وyolov5m.pt وyolov5l.pt، أو نقطة التحقق الخاصة بك الناتجة عن تدريب مجموعة بيانات مخصصة، أي runs/train/exp/weights/best.pt. للاطلاع على تفاصيل جميع النماذج المتاحة، انظر الجدول في README.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

المخرجات:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00,  2.16it/s]
                 all       5000      36335      0.732      0.628      0.683      0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- base speed

Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.507  # <--- base mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.689
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.381
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.630
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.682
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.731
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp2

تطبيق التقليم على YOLOv5x (تخلخل بنسبة 30%)#

يمكننا تطبيق التقليم على النموذج باستخدام الدالة prune() المحددة في utils/torch_utils.py. لاختبار نموذج مُقلَّم، نحدّث val.py لتقليم YOLOv5x إلى تخلخل بقيمة 0.3 (أي ضبط 30% من الأوزان على الصفر):

YOLOv5 model pruning to 30% sparsity code

مخرجات التقليم بنسبة 30%:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model...  0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00,  2.19it/s]
                 all       5000      36335      0.724      0.614      0.671      0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- prune speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.489  # <--- prune mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.677
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.370
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.612
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.664
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3

تحليل النتائج#

يمكننا ملاحظة ما يلي من النتائج:

  • تحقق تخلخل بنسبة 30%: أصبحت 30% من معاملات أوزان النموذج في طبقات nn.Conv2d تساوي صفرًا الآن
  • لم يتغير زمن الاستدلال: على الرغم من التقليم، بقيت سرعة المعالجة كما هي تقريبًا
  • تأثير محدود في الأداء: انخفض mAP قليلًا من 0.507 إلى 0.489 (أي بتراجع قدره 3.6% فقط)
  • لم يتغير حجم النموذج: لا تزال الأوزان التي ضُبطت على الصفر مخزنة بكثافة، لذا لا يتقلص حجم الملف إلا باستخدام صيغ تراعي التخلخل أو الضغط

يوضح ذلك أن التقليم يمكن أن يقلل تعقيد النموذج بدرجة كبيرة مع تأثير طفيف في الأداء، ما يجعله تقنية تحسين فعالة للنشر في البيئات محدودة الموارد.

الضبط الدقيق للنماذج المُقلَّمة#

للحصول على أفضل النتائج، ينبغي إجراء ضبط دقيق للنماذج المُقلَّمة بعد التقليم لاستعادة الدقة. ويمكن تنفيذ ذلك على النحو التالي:

  1. تطبيق التقليم بمستوى التخلخل المطلوب
  2. تدريب النموذج المُقلَّم لبضع حقب بمعدل تعلم أقل
  3. تقييم النموذج المُقلَّم بعد الضبط الدقيق ومقارنته بالأداء الأساسي

تساعد هذه العملية المعاملات المتبقية على التكيف لتعويض الوصلات التي أُزيلت، وغالبًا ما تستعيد معظم الدقة الأصلية أو كلها.

البيئات المدعومة#

توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقًا به التبعيات الأساسية مثل CUDA وCUDNN وPython وPyTorch، لتتمكن من بدء مشاريعك.

حالة المشروع#

YOLOv5 CI

تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI) الخاصة بـ إجراءات YOLOv5 على GitHub بنجاح. وتتحقق اختبارات CI بدقة من وظائف YOLOv5 وأدائه في جوانب رئيسية متعددة: التدريب والتحقق والاستدلال والتصدير واختبارات الأداء. وهي تضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل إيداع جديد.

الأسئلة الشائعة#

  • يضبط التقليم غير المنظم الأوزان على الصفر لكنه يُبقي أشكال الموترات دون تغيير، لذا تنفّذ نوى PyTorch الكثيفة المقدار نفسه من العمل. ويتطلب تسريع التنفيذ بيئة تشغيل تراعي التخلخل، مثل DeepSparse، أو تقليمًا منظمًا يزيل قنوات كاملة.

  • استدعِ الدالة المساعدة من utils/torch_utils.py قبل التحقق أو التصدير:

    from utils.torch_utils import prune
    
    prune(model, amount=0.3)  # ⁨تخلخل عام بنسبة 30% لأوزان nn.Conv2d⁩
  • ابدأ بقيمة 0.3 وقِس mAP. فقد YOLOv5x نحو 3.6% من mAP عند تخلخل بنسبة 30% من دون ضبط دقيق؛ وعادةً ما تتطلب مستويات التخلخل الأعلى بضع حقب من إعادة التدريب بمعدل تعلم منخفض لاستعادة الدقة.

  • نعم. تُحفَظ الأوزان المضبوطة على الصفر كغيرها، لذا يعمل export.py دون تغيير. ولا يتقلص حجم الملف إلا إذا ضغطت الصيغة المستهدفة أو بيئة التشغيل الموترات المتخلخلة.

التعليقات