تطور المعاملات الفائقة لـ YOLOv5#
📚 يشرح هذا الدليل تطور المعلمات الفائقة لـ YOLOv5 🚀. تطور المعلمات الفائقة هو طريقة لـ تحسين المعلمات الفائقة باستخدام خوارزمية جينية (GA) للتحسين.
تتحكم المعلمات الفائقة في التعلم الآلي في جوانب مختلفة من التدريب، ويمكن أن يمثل العثور على قيم مثالية لها تحدياً. الطرق التقليدية مثل البحث الشبكي يمكن أن تصبح غير مجدية بسرعة بسبب:
- فضاء البحث عالي الأبعاد
- الارتباطات غير المعروفة بين الأبعاد
- الطبيعة المكلفة لتقييم اللياقة عند كل نقطة
هذا يجعل الخوارزميات الجينية مرشحاً مناسباً لعمليات بحث المعاملات الفائقة.
قبل البدء#
استنسخ المستودع وقم بتثبيت 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تهيئة المعاملات الفائقة#
يحتوي YOLOv5 على حوالي 30 معلمة فائقة تُستخدم لإعدادات التدريب المختلفة. يتم تعريف هذه في ملفات *.yaml في دليل /data/hyps. التخمينات الأولية الأفضل ستنتج نتائج نهائية أفضل، لذا من المهم تهيئة هذه القيم بشكل صحيح قبل التطور. إذا كان لديك شك، فما عليك سوى استخدام القيم الافتراضية، والتي تم تحسينها لتدريب YOLOv5 COCO من الصفر.
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)تعريف اللياقة#
اللياقة البدنية هي القيمة التي نسعى لتعظيمها. في YOLOv5 نعرف دالة لياقة افتراضية كمزيج مرجح من المقاييس: يساهم mAP@0.5 بنسبة 10% من الوزن ويساهم mAP@0.5:0.95 بالباقي 90%، مع غياب الدقة (P) والاسترجاع (R). يمكنك ضبط هذه كما ترى مناسباً أو استخدام تعريف اللياقة الافتراضي في utils/metrics.py (موصى به).
def fitness(x):
"""Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
w = [0.0, 0.0, 0.1, 0.9] # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
return (x[:, :4] * w).sum(1)التطور#
يتم إجراء التطور حول سيناريو أساسي نسعى للتحسين بناءً عليه. السيناريو الأساسي في هذا المثال هو الضبط الدقيق لـ COCO128 لمدة 10 عصور باستخدام YOLOv5s المدرب مسبقاً. أمر تدريب السيناريو الأساسي هو:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cacheلتطوير المعلمات الفائقة الخاصة بهذا السيناريو، بدءاً من قيمنا الأولية المعرفة في القسم 1.، وتعظيم اللياقة المعرفة في القسم 2.، ألحق --evolve:
# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve
# Multi-GPU with delay
for i in {0..7}; do
sleep $((30 * i)) # 30-second delay (optional)
echo "Starting GPU $i..."
nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log" &
done
# Continuous training (use with caution)
# for i in {0..7}; do
# sleep $((30 * i)) # 30-second delay (optional)
# echo "Starting continuous training on GPU $i..."
# (
# while true; do
# python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
# done
# ) &
# doneستقوم إعدادات التطور الافتراضية بتشغيل السيناريو الأساسي 300 مرة، أي لـ 300 جيل. يمكنك تعديل الأجيال عبر وسطة --evolve، أي python train.py --evolve 1000.
المشغلات الجينية الرئيسية هي التقاطع والطفرة. في هذا العمل يتم استخدام الطفرة، باحتمالية 80% وتباين 0.04 لإنشاء نسْل جديد بناءً على مزيج من أفضل الآباء من جميع الأجيال السابقة. يتم تسجيل النتائج في runs/evolve/exp/evolve.csv، ويتم حفظ النسل ذو اللياقة الأعلى كل جيل كـ runs/evolve/exp/hyp_evolve.yaml:
# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
# metrics/precision, metrics/recall, metrics/mAP_0.5, metrics/mAP_0.5:0.95, val/box_loss, val/obj_loss, val/cls_loss
# 0.54634, 0.55625, 0.58201, 0.33665, 0.056451, 0.042892, 0.013441
lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4
warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr
box: 0.05 # box loss gain
cls: 0.5 # cls loss gain
cls_pw: 1.0 # cls BCELoss positive_weight
obj: 1.0 # obj loss gain (scale with pixels)
obj_pw: 1.0 # obj BCELoss positive_weight
iou_t: 0.20 # IoU training threshold
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3 # anchors per output layer (0 to ignore)
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)
degrees: 0.0 # image rotation (+/- deg)
translate: 0.1 # image translation (+/- fraction)
scale: 0.5 # image scale (+/- gain)
shear: 0.0 # image shear (+/- deg)
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # image flip up-down (probability)
fliplr: 0.5 # image flip left-right (probability)
mosaic: 1.0 # image mosaic (probability)
mixup: 0.0 # image mixup (probability)
copy_paste: 0.0 # segment copy-paste (probability)نوصي بحد أدنى 300 جيل من التطور للحصول على أفضل النتائج. لاحظ أن التطور مكلف ومستهلك للوقت بشكل عام، حيث يتم تدريب السيناريو الأساسي مئات المرات، مما قد يتطلب مئات أو آلاف الساعات من استخدام GPU.
عندما ينتهي التطور، أعد استخدام الإعدادات المكتشفة عن طريق توجيه التدريب إلى الملف المحفوظ، على سبيل المثال python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
تصور#
يتم رسم بياني لـ evolve.csv كـ evolve.png بواسطة utils.plots.plot_evolve() بعد انتهاء التطور مع مخطط فرعي واحد لكل معلمة فائقة يظهر اللياقة (محور ص) مقابل قيم المعلمات الفائقة (محور س). يشير اللون الأصفر إلى تركيزات أعلى. تشير التوزيعات الرأسية إلى أن المعلمة قد تم تعطيلها ولا تتحور. هذا قابل للاختيار من قبل المستخدم في قاموس meta في train.py، وهو مفيد لتثبيت المعلمات ومنعها من التطور.

البيئات المدعومة#
توفر Ultralytics مجموعة من البيئات الجاهزة للاستخدام، وكل منها مثبت مسبقاً بالتبعيات الأساسية مثل CUDA، وCUDNN، وPython، وPyTorch، لبدء مشاريعك بسرعة.
- دفاتر ملاحظات مجانية لوحدات معالجة الرسومات:
- Google Cloud: GCP Quickstart Guide
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: Docker Quickstart Guide
حالة المشروع#
تشير هذه الشارة إلى أن جميع اختبارات التكامل المستمر (CI) لـ YOLOv5 GitHub Actions تمر بنجاح. تتحقق اختبارات CI هذه بدقة من وظائف وأداء YOLOv5 عبر جوانب رئيسية مختلفة: training، وvalidation، وinference، وexport، وbenchmarks. وهي تضمن تشغيلاً متسقاً وموثوقاً على أنظمة macOS وWindows وUbuntu، مع إجراء اختبارات كل 24 ساعة ومع كل عملية commit جديدة.