YOLO Vision 2026:

تشذيب النماذج والتناثر في 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، أو نقطة التحقق الخاصة بك الناتجة عن تدريب مجموعة بيانات مخصصة ./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%)#

يمكننا تطبيق التشذيب على النموذج باستخدام الأمر torch_utils.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

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

التعليقات