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

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

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

قبل أن تبدأ

أولاً، استنسخ مستودع YOLOv5 وقم بتثبيت التبعيات الضرورية المدرجة في requirements.txt. تأكد من أن لديك بايثون >=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 سمة tensors للطبقة إلى 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 في أمر التدريب. تحدد هذه الوسيطة فهرس أول غير مجمدة الوحدة النمطية (module)؛ سيتم تجميد أوزان جميع الوحدات النمطية قبل هذا الفهرس.

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

لتجميد العمود الفقري بأكمله (الطبقات من 0 إلى 9)، وهو أمر شائع عند تكييف النموذج مع فئات كائنات جديدة مع الاحتفاظ بقدرات استخراج الميزات العامة المستفادة من مجموعة بيانات كبيرة مثل COCO:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

تكون هذه الإستراتيجية فعالة عندما تشترك مجموعة البيانات المستهدفة الخاصة بك في ميزات بصرية منخفضة المستوى مماثلة (حواف، أنسجة) مع بيانات التدريب الأصلية (مثل COCO) ولكنها تحتوي على فئات كائنات مختلفة.

تجميد الكل باستثناء طبقات الكشف النهائية

لتجميد الشبكة بأكملها تقريبًا، مع ترك طبقات الالتفاف النهائية للإخراج فقط (جزء من Detect الوحدة النمطية (module)، عادةً الوحدة النمطية الأخيرة، على سبيل المثال، الوحدة النمطية 24 في YOLOv5s) قابلة للتدريب:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

يكون هذا الأسلوب مفيدًا عندما تحتاج في المقام الأول إلى تعديل النموذج لعدد مختلف من فئات الإخراج مع الحفاظ على الغالبية العظمى من الميزات التي تم تعلمها سليمة. يتطلب أقل قدر من الموارد الحسابية لـ الضبط الدقيق.

مقارنة الأداء

لتوضيح آثار تجميد الطبقات، قمنا بتدريب YOLOv5m على مجموعة بيانات Pascal VOC لمدة 50 حقبة، بدءًا من COCO الرسمي المدرب مسبقًا الأوزان (yolov5m.pt). لقد قارنا ثلاثة سيناريوهات: تدريب جميع الطبقات (--freeze 0)، وتجميد العمود الفقري (backbone) (--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 أثناء التدريب

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

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

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

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

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

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

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

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

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

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

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

حالة المشروع

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

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



📅 أُنشئ منذ سنة واحدة ✏️ تم التحديث منذ 3 أشهر

تعليقات