تجميع نماذج YOLOv5
📚 يشرح هذا الدليل كيفية استخدام تجميع النماذج Ultralytics YOLOv5 🚀 أثناء الاختبار والاستدلال لتحسين mAP و الاسترجاع.
من التعلم الجماعي:
النمذجة الجماعية هي عملية يتم فيها إنشاء نماذج متنوعة متعددة للتنبؤ بنتيجة، إما باستخدام العديد من خوارزميات النمذجة المختلفة أو باستخدام مجموعات بيانات التدريب المختلفة. ثم يجمع النموذج الجماعي توقع كل نموذج أساسي وينتج عنه تنبؤ نهائي واحد للبيانات غير المرئية. الدافع وراء استخدام النماذج الجماعية هو تقليل خطأ التعميم للتنبؤ. طالما أن النماذج الأساسية متنوعة ومستقلة، فإن خطأ التنبؤ بالنموذج ينخفض عند استخدام النهج الجماعي. يسعى النهج إلى حكمة الجماهير في تقديم التنبؤات. على الرغم من أن النموذج الجماعي يحتوي على نماذج أساسية متعددة داخل النموذج، إلا أنه يعمل ويؤدي وظيفته كنموذج واحد.
قبل أن تبدأ
استنساخ المستودع وتثبيت 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
. للحصول على تفاصيل حول جميع النماذج المتاحة، راجع جدول نقاط التفتيش المدربة مسبقًا.
python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half
الناتج:
val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, 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
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00, 1.05it/s]
all 5000 36335 0.746 0.626 0.68 0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640) # <--- baseline speed
Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.504 # <--- baseline mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.688
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.546
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.382
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.628
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.681 # <--- baseline mAR
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826
اختبار المجموعة
يمكن تجميع نماذج مُدرَّبة مسبقًا متعددة معًا في وقت الاختبار والاستدلال ببساطة عن طريق إلحاق نماذج إضافية بـ --weights
وسيطة في أي أمر val.py أو detect.py موجود. يختبر هذا المثال مجموعة من نموذجين معًا:
- YOLOv5x
- YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half
الناتج:
val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, 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
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt'] # Ensemble notice
val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00, 1.52s/it]
all 5000 36335 0.747 0.637 0.692 0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640) # <--- ensemble speed
Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.515 # <--- ensemble mAP
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.699
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.557
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.638
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.689 # <--- ensemble mAR
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.743
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844
الاستدلال الجماعي
إلحاق نماذج إضافية بـ --weights
وسيطة لتشغيل الاستدلال الجماعي:
python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images
الناتج:
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)
Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']
image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
فوائد تجميع النماذج
يوفر تجميع النماذج مع YOLOv5 العديد من المزايا:
- دقة محسنة: كما هو موضح في الأمثلة أعلاه، فإن تجميع نماذج متعددة يزيد من mAP من 0.504 إلى 0.515 و mAR من 0.681 إلى 0.689.
- تعميم أفضل: يساعد الجمع بين النماذج المتنوعة على تقليل التجاوز في التوفيق ويحسن الأداء على البيانات المتنوعة.
- متانة محسّنة: عادةً ما تكون التجميعات أكثر متانة للضوضاء والقيم المتطرفة في البيانات.
- نقاط قوة متكاملة: قد تتفوق النماذج المختلفة في اكتشاف أنواع مختلفة من الكائنات أو في ظروف بيئية مختلفة.
المفاضلة الأساسية هي زيادة وقت الاستدلال، كما هو موضح في مقاييس السرعة (22.4 مللي ثانية للنموذج الفردي مقابل 39.5 مللي ثانية للمجموعة).
متى يتم استخدام تجميع النماذج
ضع في اعتبارك استخدام تجميع النماذج في هذه السيناريوهات:
- عندما تكون الدقة أكثر أهمية من سرعة الاستدلال
- بالنسبة للتطبيقات الهامة حيث يجب تقليل النتائج السلبية الكاذبة
- عند معالجة الصور الصعبة ذات الإضاءة المتغيرة أو الانسداد أو المقياس
- خلال المسابقات أو القياسات المعيارية حيث تكون هناك حاجة إلى أقصى أداء.
بالنسبة للتطبيقات في الوقت الفعلي ذات متطلبات زمن الوصول الصارمة، قد يكون استنتاج النموذج الفردي أكثر ملاءمة.
البيئات المدعومة
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، كل منها مثبت مسبقًا بالتبعيات الأساسية مثل CUDA و CUDNN و Python و PyTorch، لبدء مشاريعك.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع في GCP
- Amazon: دليل البدء السريع في AWS
- Azure: دليل البدء السريع في AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions قد اجتازت بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر مختلف الجوانب الرئيسية: التدريب، التحقق، الاستدلال، التصدير، و المعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على أنظمة macOS و Windows و Ubuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل commit جديد.