تطور البارامتر الفائق
📚 يشرح هذا الدليل تطور المعامل الفائق YOLOv5 🚀. تطور المعلمة الفائقة هو طريقة لتحسين المعلمة الفائقة باستخدام خوارزمية جينية (GA) للتحسين.
تتحكم المعلمات الفائقة في التعلم الآلي في جوانب مختلفة من التدريب، ويمكن أن يمثل إيجاد القيم المثلى لها تحديًا. يمكن أن تصبح الطرق التقليدية مثل عمليات البحث الشبكية مستعصية على الحل بسرعة بسبب 1) مساحة البحث عالية الأبعاد 2) الارتباطات غير المعروفة بين الأبعاد، و3) الطبيعة المكلفة لتقييم اللياقة في كل نقطة، مما يجعل GA مرشحًا مناسبًا لعمليات البحث عن المعلمات الفائقة.
قبل أن تبدأ
استنساخ الريبو وتثبيت المتطلبات.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 حلقات باستخدام YOLOv5s المُدرَّب مسبقًا. أمر تدريب السيناريو الأساسي هو:
لتطوير المعلمات الفائقة خاص بهذا السيناريوبدءًا من القيم الابتدائية المحدَّدة في القسم 1.وتعظيم اللياقة المحددة في القسم 2.إلحاق --evolve
:
# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve
# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
sleep $(expr 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
# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
sleep $(expr 30 \* $i) && # 30-second delay (optional)
echo 'Starting GPU '$i'...' &&
"$(while true; do nohup python train.py... --device $i --evolve 1 > 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()
بعد انتهاء التطور مع مؤامرة فرعية واحدة لكل معيار تشعبي تُظهر اللياقة (المحور ص) مقابل قيم المعامل التشعبي (المحور س). يشير اللون الأصفر إلى تركيزات أعلى. تشير التوزيعات الرأسية إلى تعطيل أحد المتغيرات وعدم تحوره. يمكن للمستخدم تحديد ذلك في meta
في قاموس train.py، وهو مفيد لتثبيت المعلمات ومنعها من التطور.
البيئات المدعومة
Ultralytics مجموعة من البيئات الجاهزة للاستخدام، كل منها مثبت مسبقًا مع التبعيات الأساسية مثل CUDA، CUDNN, Pythonو PyTorchلبدء مشاريعك.
- GPU دفاتر مجاناً:
- Google السحابة: دليل البدء السريع لـ GCP
- أمازون دليل AWS للبدء السريع
- Azure: دليل البدء السريع لـ AzureML
- دوكر: دليل البدء السريع لـ Docker
حالة المشروع
تشير هذه الشارة إلى اجتياز جميع اختبارات التكامل المستمر (CI) لإجراءات GitHub YOLOv5 بنجاح. تتحقق اختبارات التكامل المستمر هذه بدقة من وظائف وأداء YOLOv5 عبر مختلف الجوانب الرئيسية: التدريب والتحقق من الصحة والاستدلال والتصدير والمعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على أنظمة macOS وWindows وUbuntu، مع إجراء الاختبارات كل 24 ساعة وعند كل التزام جديد.