التعلم بنقل المعرفة مع تجميد الطبقات في 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 hyp.finetune.yaml --freeze 10

نتائج الدقة

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

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

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

YOLOv5 frozen layer training performance *Summary table of performance metrics*

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

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

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

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

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

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

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

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

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

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

حالة المشروع

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

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

التعليقات