تشذيب النماذج والتناثر في 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% من الأوزان على الصفر):
المخرجات بعد التشذيب بنسبة 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% فقط)
- تقليل حجم النموذج: يتطلب النموذج المشذّب ذاكرة أقل للتخزين
يوضح هذا أن التشذيب يمكن أن يقلل تعقيد النموذج بدرجة كبيرة مع تأثير طفيف فقط في الأداء، ما يجعله تقنية تحسين فعالة للنشر في البيئات محدودة الموارد.
الضبط الدقيق للنماذج المشذّبة#
للحصول على أفضل النتائج، ينبغي ضبط النماذج المشذّبة بدقة بعد التشذيب لاستعادة الدقة. ويمكن إجراء ذلك من خلال:
- تطبيق التشذيب بمستوى التناثر المطلوب
- تدريب النموذج المشذّب لعدد قليل من العصور باستخدام معدل تعلم أقل
- تقييم النموذج المشذّب والمضبوط بدقة مقارنةً بالأداء الأساسي
تساعد هذه العملية المعلمات المتبقية على التكيف للتعويض عن الوصلات التي أُزيلت، وغالبًا ما تستعيد معظم الدقة الأصلية أو كلها.
البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقًا مع التبعيات الأساسية مثل CUDA وCUDNN وPython وPyTorch، لبدء مشاريعك.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تشير هذه الشارة إلى اجتياز جميع اختبارات إجراءات YOLOv5 على GitHub الخاصة بـالتكامل المستمر (CI) بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف YOLOv5 وأدائه عبر جوانب رئيسية متنوعة: التدريب والتحقق والاستدلال والتصدير والمعايير. وتضمن التشغيل المتسق والموثوق على macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.