تطور المعلمات الفائقة لـ YOLOv5

📚 يشرح هذا الدليل تطور المعلمات الفائقة (hyperparameter evolution) لـ YOLOv5 🚀. يُعد تطور المعلمات الفائقة طريقة لـ تحسين المعلمات الفائقة باستخدام خوارزمية جينية (GA) لتحقيق التحسين.

تتحكم المعلمات الفائقة في تعلم الآلة في جوانب مختلفة من التدريب، وقد يمثل العثور على قيم مثالية لها تحدياً. يمكن أن تصبح الطرق التقليدية مثل البحث الشبكي (grid searches) غير عملية بسرعة بسبب:

  1. مساحة البحث عالية الأبعاد
  2. الارتباطات غير المعروفة بين الأبعاد
  3. الطبيعة المكلفة لتقييم الملاءمة في كل نقطة

هذا يجعل الخوارزميات الجينية مرشحاً مناسباً لعمليات البحث عن المعلمات الفائقة.

قبل البدء

قم باستنساخ المستودع وتثبيت 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)

تحديد الملاءمة

الملاءمة (Fitness) هي القيمة التي نسعى لتعظيمها. في 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.

المشغلات الجينية الرئيسية هي التقاطع (crossover) والطفرة (mutation). في هذا العمل، تُستخدم الطفرة باحتمالية 80% وتباين 0.04 لإنشاء نسل جديد بناءً على مزيج من أفضل الآباء من جميع الأجيال السابقة. يتم تسجيل النتائج في runs/evolve/exp/evolve.csv، ويتم حفظ النسل ذي الملاءمة الأعلى في كل جيل كـ runs/evolve/hyp_evolved.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/hyp_evolved.yaml --data your.yaml --weights yolov5s.pt.

التصور

يتم رسم evolve.csv كـ evolve.png بواسطة utils.plots.plot_evolve() بعد انتهاء التطور مع مخطط فرعي واحد لكل معلمة فائقة يوضح الملاءمة (المحور الصادي) مقابل قيم المعلمات الفائقة (المحور السيني). يشير اللون الأصفر إلى تركيزات أعلى. تشير التوزيعات الرأسية إلى أن المعلمة قد تم تعطيلها ولا تخضع للطفرة. هذا الخيار متاح للمستخدم في قاموس meta في train.py، وهو مفيد لتثبيت المعلمات ومنع تطورها.

نتائج ملاءمة تطور المعلمات الفائقة لـ YOLOv5

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

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

حالة المشروع

YOLOv5 CI

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

التعليقات