التعلّم بالنقل باستخدام الطبقات المجمّدة في 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 (freeze if len(freeze) > 1 else range(freeze[0]))] # layers to freeze
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 التالي:
# بافتراض أن 'model' هو مثيل نموذج YOLOv5 الذي حمّلته
for name, param in model.named_parameters():
print(name)
"""
Example Output:
model.0.conv.weight
model.0.bn.weight
model.0.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 في أمر التدريب. تحدد هذه الوسيطة فهرس أول وحدة غير مجمّدة؛ إذ تُجمّد أوزان جميع الوحدات التي تسبق هذا الفهرس. أما تمرير عدة فهارس بدلًا من ذلك (مثل --freeze 0 1 2) فيجمّد تلك الوحدات تحديدًا. استخدم 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 أثناء التدريب
*جدول موجز لمقاييس الأداء*
استخدام الموارد#
يؤدي تجميد مزيد من الطبقات إلى خفض متطلبات ذاكرة GPU ومعدل الاستخدام الإجمالي بدرجة كبيرة. وهذا يجعل التعلّم بالنقل باستخدام الطبقات المجمّدة خيارًا جذابًا عند التعامل مع موارد عتادية محدودة، إذ يتيح تدريب نماذج أكبر أو استخدام أحجام صور أكبر مما قد يكون ممكنًا لولا ذلك.
ذاكرة GPU المخصصة (%)
استخدام GPU (%)
متى يُستخدم تجميد الطبقات#
يكون تجميد الطبقات أثناء التعلّم بالنقل مفيدًا على وجه الخصوص في عدة حالات:
- محدودية الموارد الحاسوبية: إذا كانت لديك قيود على ذاكرة GPU أو قدرة المعالجة.
- مجموعات البيانات الصغيرة: عندما تكون مجموعة البيانات المستهدفة أصغر بكثير من مجموعة بيانات التدريب المسبق الأصلية، يساعد التجميد على منع فرط التكيّف.
- إنشاء النماذج الأولية بسرعة: عندما تحتاج إلى تكييف نموذج موجود بسرعة لمهمة أو مجال جديد بغرض التقييم الأولي.
- تشابه مجالات السمات: إذا كانت السمات منخفضة المستوى في مجموعة البيانات الجديدة شديدة التشابه مع السمات في مجموعة البيانات التي دُرّب النموذج عليها مسبقًا.
تعرّف على مزيد من التفاصيل حول جوانب التعلّم بالنقل في مدخل المسرد، وفكّر في تطوير المعلمات الفائقة لتحسين الأداء.
البيئات المدعومة#
توفر Ultralytics بيئات متنوعة جاهزة للاستخدام، تتضمن تبعيات أساسية مثبتة مسبقًا مثل CUDA وCuDNN وPython وPyTorch.
- دفاتر GPU مجانية:
- Google Cloud: دليل البدء السريع لـ GCP
- Amazon: دليل البدء السريع لـ AWS
- Azure: دليل البدء السريع لـ AzureML
- Docker: دليل البدء السريع لـ Docker
حالة المشروع#
تؤكد هذه الشارة اجتياز جميع اختبارات التكامل المستمر (CI) ضمن إجراءات GitHub الخاصة بـ YOLOv5 بنجاح. وتقيّم اختبارات CI هذه بدقة وظائف YOLOv5 وأداءه في العمليات الأساسية: التدريب والتحقق والاستدلال والتصدير واختبارات الأداء. وهي تضمن تشغيلًا متسقًا وموثوقًا على macOS وWindows وUbuntu، وتُجرى تلقائيًا كل 24 ساعة وعند كل عملية إيداع جديدة للتعليمات البرمجية.
الأسئلة الشائعة#
تجمّد أول
Nوحدات منmodel.model، بحيث تظل أوزانها ثابتة ولا تتلقى أي تدرجات. وتجمّد--freeze 10العمود الفقري، بينما تجمّد--freeze 24كل شيء باستثناء الوحدةDetectالنهائية.في تجربة VOC المذكورة أعلاه، حقق تدريب جميع الطبقات أفضل mAP، وأدى تجميد العمود الفقري إلى خسارة طفيفة في الدقة، بينما تسبب تجميد كل الطبقات عدا رأس الكشف في أكبر خسارة. وفي المقابل، تُدرّب النماذج ذات الطبقات المجمّدة بسرعة أكبر وتستخدم قدرًا أقل بكثير من ذاكرة GPU.
عندما تشترك صورك في سمات منخفضة المستوى مع بيانات التدريب المسبق، أو تكون مجموعة بياناتك صغيرة، أو تحتاج إلى خط أساس سريع على عتاد محدود. درّب جميع الطبقات عندما تكبر مجموعة البيانات أو عندما تحتاج إلى النقاط القليلة الأخيرة من mAP.
نعم. ابدأ تشغيلًا جديدًا من
best.ptالخاص بالنموذج المجمّد، من دون--freeze، لإجراء ضبط دقيق للشبكة بأكملها، وعادةً ما يكون ذلك بمعدل تعلّم أقل.