تطوير المعلمات الفائقة لـ 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
1. تهيئة المعلمات الفائقة
يحتوي 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)
2. تحديد اللياقة
اللياقة هي القيمة التي نسعى إلى تعظيمها. في 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)
3. التطوير
يتم إجراء التطوير حول سيناريو أساسي نسعى إلى تحسينه. السيناريو الأساسي في هذا المثال هو الضبط الدقيق لـ COCO128 لعدد 10 epochs (حقبات) باستخدام 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/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.
4. التصور
evolve.csv
يتم رسمه كـ evolve.png
بواسطة utils.plots.plot_evolve()
بعد انتهاء التطور مع مخطط فرعي واحد لكل معلمة فائقة يعرض اللياقة (المحور y) مقابل قيم المعلمة الفائقة (المحور x). يشير اللون الأصفر إلى تركيزات أعلى. تشير التوزيعات الرأسية إلى أن المعلمة قد تم تعطيلها ولا تتحور. هذا قابل للاختيار من قبل المستخدم في meta
قاموس في train.py، وهو مفيد لإصلاح المعلمات ومنعها من التطور.
البيئات المدعومة
توفر 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 جديد.