تخطي إلى المحتوى

نقل التعلم باستخدام الطبقات المجمدة في YOLOv5

📚 يشرح هذا الدليل كيفية تجميد YOLOv5 🚀 الطبقات عند تطبيق التعلّم التحويلي. التعلّم التحوّلي هو تقنية قوية للتعلّم الآلي (ML) تتيح لك إعادة تدريب نموذج بسرعة على بيانات جديدة دون إعادة تدريب الشبكة بأكملها من الصفر. من خلال تجميد أوزان الطبقات الأولية وتحديث معلمات الطبقات اللاحقة فقط، يمكنك تقليل متطلبات الموارد الحاسوبية ووقت التدريب بشكل كبير. ومع ذلك، قد يؤثر هذا النهج بشكل طفيف على دقة النموذج النهائي.

قبل أن تبدأ

أولاً، استنساخ مستودع YOLOv5 وتثبيت التبعيات الضرورية المدرجة في requirements.txt. تأكد من أن لديك Python.8.0 البيئة مع PyTorch.8 مثبتة. مدرب مسبقاً الموديلات والمطلوب مجموعات البيانات سيتم تنزيله تلقائيًا من أحدث إصدار YOLOv5 الإصدار.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

كيفية عمل تجميد الطبقات

عند تجميد الطبقات في الشبكة العصبية، فإنك تمنع تحديث معلماتهاweights and biases) أثناء عملية التدريب. في 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 في التكوينات القياسية مثل YOLOv5/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 في أمر التدريب. تحدد هذه الوسيطة فهرس أول غير مجمدة الوحدة النمطية؛ جميع الوحدات النمطية قبل هذا الفهرس سيتم تجميد أوزانها.

تجميد العمود الفقري فقط

لتجميد العمود الفقري بأكمله (الطبقات من 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 على مجموعة بيانات باسكال للمركبات العضوية المتطايرة ل 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 hyp.finetune.yaml --freeze 10

نتائج الدقة

تُظهر النتائج أن تجميد الطبقات يمكن أن يسرّع التدريب بشكل كبير ولكنه قد يؤدي إلى انخفاض طفيف في متوسط الدقة النهائية (متوسط متوسط الدقة). ينتج عن تدريب جميع الطبقات عمومًا أفضل دقة، في حين أن تجميد المزيد من الطبقات يوفر تدريبًا أسرع على حساب أداء أقل محتمل.

نتائج تدريب MAP50 مقارنة استراتيجيات التجميد المختلفة مقارنة mAP50 أثناء التدريب

نتائج تدريب mAP50-95 التي تقارن بين استراتيجيات التجميد المختلفة مقارنة mAP50-95 أثناء التدريب

جدول يلخص نتائج الأداء جدول ملخص لمقاييس الأداء

استخدام الموارد

تجميد المزيد من الطبقات يقلل بشكل كبير من GPU من متطلبات الذاكرة والاستخدام الكلي. وهذا يجعل من التعلّم بالنقل مع الطبقات المجمّدة خيارًا جذابًا عند العمل بموارد محدودة من الأجهزة، مما يسمح بتدريب نماذج أكبر أو استخدام أحجام صور أكبر مما قد يكون ممكنًا.

النسبة المئوية لذاكرة GPU المخصصة أثناء التدريب ذاكرة GPU المخصصة (%)

نسبة استخدام ذاكرة GPU أثناء التدريب استخدام GPU (%)

متى يتم استخدام التجميد الطبقي

يكون تجميد الطبقات أثناء التعلّم التحويلي مفيدًا بشكل خاص في عدة حالات:

  1. موارد حسابية محدودة: إذا كانت لديك قيود على ذاكرة GPU أو قوة المعالجة.
  2. مجموعات البيانات الصغيرة: عندما تكون مجموعة البيانات المستهدفة أصغر بكثير من مجموعة البيانات الأصلية قبل التدريب، يساعد التجميد على منع الإفراط في التركيب.
  3. النماذج الأولية السريعة: عندما تحتاج إلى تكييف نموذج موجود بسرعة مع مهمة أو مجال جديد للتقييم الأولي.
  4. مجالات الميزات المتشابهة: إذا كانت الميزات منخفضة المستوى في مجموعة البيانات الجديدة مشابهة جدًا لتلك الموجودة في مجموعة البيانات التي تم تدريب النموذج عليها مسبقًا.

استكشف المزيد حول الفروق الدقيقة في التعلُّم التحويلي في مدخل مسرد المصطلحات الخاص بنا وفكر في تقنيات مثل ضبط المعلمة الفائقة لتحسين الأداء.

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

تقدم Ultralytics العديد من البيئات الجاهزة للاستخدام مع التبعيات الأساسية مثل CUDAو CuDNN, Pythonو PyTorch مثبتة مسبقًا.

حالة المشروع

حالة التكامل المستمر YOLOv5

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



📅 تم إنشاؤها منذ 1 سنة مضت ✏️ تم التحديث منذ 2 شهر

التعليقات