التعلُّم بالنقل باستخدام الطبقات المجمَّدة في YOLOv5#
📚 يوضّح هذا الدليل كيفية تجميد طبقات YOLOv5 🚀 عند تنفيذ التعلُّم بالنقل. يُعدّ التعلُّم بالنقل تقنية قوية في تعلُّم الآلة (ML) تتيح لك إعادة تدريب نموذج بسرعة على بيانات جديدة دون إعادة تدريب الشبكة بأكملها من الصفر. ومن خلال تجميد أوزان الطبقات الأولية وتحديث معلمات الطبقات اللاحقة فقط، يمكنك تقليل متطلبات الموارد الحاسوبية ووقت التدريب بدرجة كبيرة. ومع ذلك، قد يؤثر هذا النهج قليلًا في دقة النموذج النهائية.
قبل البدء#
أولًا، استنسخ مستودع YOLOv5 وثبّت التبعيات اللازمة المدرجة في requirements.txt. تأكد من أن لديك بيئة Python>=3.8.0 مثبتًا فيها PyTorch>=1.8. سيُنزَّل النماذج المدربة مسبقًا ومجموعات البيانات المطلوبة تلقائيًا من الإصدار الأحدث من YOLOv5.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesكيفية عمل تجميد الطبقات#
عند تجميد الطبقات في شبكة عصبية، فإنك تمنع تحديث معلماتها (الأوزان والانحيازات) أثناء عملية التدريب. في PyTorch، يتحقق ذلك من خلال ضبط السمة requires_grad لموترات الطبقة على القيمة False. وبالتالي، لا تُحسَب التدرجات لهذه الطبقات أثناء الانتشار العكسي، مما يوفر الحساب والذاكرة.
إليك كيفية تطبيق YOLOv5 لتجميد الطبقات في برنامج التدريب النصي الخاص به:
# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)] # Define layers to freeze based on module index
for k, v in model.named_parameters():
v.requires_grad = True # Ensure all parameters are initially trainable
if any(x in k for x in freeze):
print(f"Freezing layer: {k}")
v.requires_grad = False # Disable gradient calculation for frozen layersاستكشاف بنية النموذج#
يُعد فهم بنية نموذج YOLOv5 أمرًا بالغ الأهمية لتحديد الطبقات التي ينبغي تجميدها. يمكنك فحص أسماء جميع الوحدات ومعلماتها باستخدام مقطع Python التالي:
# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
print(name)
"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""تتكوّن بنية YOLOv5 عادةً من جذع (الطبقات من 0 إلى 9 في الإعدادات القياسية مثل YOLOv5s/m/l/x) المسؤول عن استخراج السمات، ورأس (الطبقات المتبقية) ينفّذ اكتشاف الكائنات.
# Example YOLOv5 v6.0 backbone structure
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # Layer 0: Initial convolution (P1/2 stride)
- [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
- [-1, 3, C3, [128]] # Layer 2: C3 module
- [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
- [-1, 6, C3, [256]] # Layer 4: C3 module
- [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
- [-1, 9, C3, [512]] # Layer 6: C3 module
- [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
- [-1, 3, C3, [1024]] # Layer 8: C3 module
- [-1, 1, SPPF, [1024, 5]] # Layer 9: Spatial Pyramid Pooling Fast
# Example YOLOv5 v6.0 head structure
head:
- [-1, 1, Conv, [512, 1, 1]] # Layer 10
- [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
- [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
- [-1, 3, C3, [512, False]] # Layer 13: C3 module
# ... subsequent head layers for feature fusion and detectionخيارات التجميد#
يمكنك التحكم في الطبقات المجمّدة باستخدام الوسيطة --freeze في أمر التدريب. تحدد هذه الوسيطة فهرس الوحدة غير المجمّدة الأولى؛ وستُجمَّد أوزان جميع الوحدات التي تسبق هذا الفهرس. استخدم model.model (وهو nn.Sequential) لفحص ترتيب الوحدات إذا احتجت إلى التأكد من الفهارس المقابلة لكتلة معينة.
تجميد الجذع فقط#
لتجميد الجذع بأكمله (الطبقات من 0 إلى 9)، وهو أمر شائع عند تكييف النموذج مع فئات كائنات جديدة مع الاحتفاظ بقدرات استخراج السمات العامة المتعلَّمة من مجموعة بيانات كبيرة مثل COCO:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10تكون هذه الاستراتيجية فعّالة عندما تشترك مجموعة البيانات المستهدفة في سمات بصرية منخفضة المستوى متشابهة (الحواف والأنسجة) مع بيانات التدريب الأصلية (مثل COCO)، لكنها تحتوي على فئات كائنات مختلفة.
تجميد كل شيء باستثناء طبقات الكشف النهائية#
لتجميد الشبكة بأكملها تقريبًا، مع إبقاء طبقات الالتفاف الخاصة بالإخراج النهائي فقط (وهي جزء من الوحدة Detect، وعادةً ما تكون الوحدة الأخيرة، مثل الوحدة 24 في YOLOv5s) قابلة للتدريب:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24يفيد هذا النهج عندما تحتاج أساسًا إلى ضبط النموذج لعدد مختلف من فئات الإخراج مع إبقاء الغالبية العظمى من السمات المتعلَّمة سليمة. ويتطلب أقل قدر من الموارد الحاسوبية من أجل الضبط الدقيق.
مقارنة الأداء#
لتوضيح تأثيرات تجميد الطبقات، درّبنا YOLOv5m على مجموعة بيانات Pascal VOC لمدة 50 حقبة، بدءًا من الأوزان الرسمية المدربة مسبقًا على COCO (yolov5m.pt). وقارنّا بين ثلاثة سيناريوهات: تدريب جميع الطبقات (--freeze 0)، وتجميد الجذع (--freeze 10)، وتجميد كل شيء باستثناء طبقات الكشف النهائية (--freeze 24).
# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp data/hyps/hyp.VOC.yaml --freeze 10نتائج الدقة#
تُظهر النتائج أن تجميد الطبقات يمكن أن يسرّع التدريب بدرجة كبيرة، لكنه قد يؤدي إلى انخفاض طفيف في mAP (متوسط الدقة) النهائية. ويؤدي تدريب جميع الطبقات عمومًا إلى أفضل دقة، بينما يوفّر تجميد عدد أكبر من الطبقات تدريبًا أسرع على حساب احتمال انخفاض الأداء.
مقارنة mAP50 أثناء التدريب
مقارنة mAP50-95 أثناء التدريب
*Summary table of performance metrics*
استخدام الموارد#
يؤدي تجميد عدد أكبر من الطبقات إلى تقليل متطلبات ذاكرة GPU والاستخدام الإجمالي بدرجة كبيرة. وهذا يجعل التعلُّم بالنقل باستخدام الطبقات المجمّدة خيارًا جذابًا عند العمل بموارد عتادية محدودة، إذ يتيح تدريب نماذج أكبر أو استخدام أحجام صور أكبر مما قد يكون ممكنًا بخلاف ذلك.
ذاكرة GPU المخصَّصة (%)
استخدام GPU (%)
متى يُستخدم تجميد الطبقات#
يكون تجميد الطبقات أثناء التعلُّم بالنقل مفيدًا بصفة خاصة في عدة حالات:
- الموارد الحاسوبية المحدودة: إذا كانت لديك قيود على ذاكرة GPU أو قدرة المعالجة.
- مجموعات البيانات الصغيرة: عندما تكون مجموعة البيانات المستهدفة أصغر بكثير من مجموعة بيانات التدريب المسبق الأصلية، يساعد التجميد على منع فرط التكيّف.
- إنشاء النماذج الأولية بسرعة: عندما تحتاج إلى تكييف نموذج موجود بسرعة مع مهمة أو مجال جديد لإجراء تقييم أولي.
- تشابه مجالات السمات: إذا كانت السمات منخفضة المستوى في مجموعة البيانات الجديدة مشابهة جدًا للسمات الموجودة في مجموعة البيانات التي دُرّب النموذج عليها مسبقًا.
استكشف المزيد حول تفاصيل التعلُّم بالنقل في مدخل المسرد لدينا، وفكّر في تقنيات مثل ضبط المعلمات الفائقة لتحسين الأداء.
البيئات المدعومة#
توفّر Ultralytics بيئات متنوعة جاهزة للاستخدام، تتضمن تبعيات أساسية مثل CUDA وCuDNN وPython وPyTorch مثبتة مسبقًا.
- دفاتر ملاحظات GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تؤكد هذه الشارة نجاح جميع اختبارات إجراءات GitHub Actions الخاصة بـ YOLOv5 للتكامل المستمر (CI). تقيّم اختبارات CI هذه بدقة وظائف YOLOv5 وأداءه عبر العمليات الأساسية: التدريب والتحقق والاستدلال والتصدير والمعايير. وهي تضمن تشغيلًا متسقًا وموثوقًا على macOS وWindows وUbuntu، وتُشغَّل تلقائيًا كل 24 ساعة وعند كل إيداع جديد للتعليمات البرمجية.