رؤية YOLO لعام 2026:

التعلم بنقل المعرفة مع تجميد الطبقات في 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) لفحص ترتيب الوحدات إذا كنت بحاجة إلى تأكيد الفهارس التي تتوافق مع كتلة معينة.

تجميد الـ backbone فقط#

لتجميد العمود الفقري بأكمله (الطبقات من 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 (متوسط الدقة المتوسطة) النهائي. يؤدي تدريب جميع الطبقات عمومًا إلى تحقيق أفضل دقة، بينما يوفر تجميد المزيد من الطبقات تدريبًا أسرع على حساب الأداء الأقل المحتمل.

Training mAP50 results comparing different freezing strategies مقارنة mAP50 أثناء التدريب

Training mAP50-95 results comparing different freezing strategies مقارنة mAP50-95 أثناء التدريب

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

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

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

GPU memory allocated percentage during training نسبة ذاكرة GPU المخصصة (%)

GPU memory utilization percentage during training استخدام ذاكرة GPU (%)

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

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

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

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

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

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

حالة المشروع#

YOLOv5 Continuous Integration Status

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

التعليقات