بنية Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) هو خوارزمية قوية لتحديد الأهداف طورتها Ultralytics. تتعمق هذه المقالة في هيكل YOLOv5، واستراتيجيات augmenting data، ومنهجيات التدريب، وتقنيات حساب الخسارة. سيساعدك هذا الفهم الشامل على تحسين تطبيقك العملي لاكتشاف الأجسام في مجالات مختلفة، بما في ذلك المراقبة، والمركبات ذاتية القيادة، وimage recognition.
هيكل النموذج#
تتكون بنية YOLOv5 من ثلاثة أجزاء رئيسية:
- Backbone: هذا هو الجزء الرئيسي للشبكة. بالنسبة لـ YOLOv5، تم تصميم Backbone باستخدام هيكل
CSPDarknet53، وهو تعديل لهيكل Darknet المستخدم في الإصدارات السابقة. - Neck: يربط هذا الجزء بين Backbone وHead. في YOLOv5، يتم استخدام هيكلي
SPPF(Spatial Pyramid Pooling - Fast) وPANet(Path Aggregation Network). - Head: هذا الجزء مسؤول عن إنتاج النتيجة النهائية. يستخدم YOLOv5 هيكل
YOLOv3 Headلهذا الغرض.
يظهر هيكل النموذج في الصورة أدناه. يمكن العثور على تفاصيل هيكل النموذج في models/yolov5l.yaml.

يقدم YOLOv5 بعض التحسينات الملحوظة مقارنة بأسلافه:
- تم استبدال هيكل
Focus، الموجود في الإصدارات السابقة، بـ هيكل6x6 Conv2d. يعزز هذا التغيير الكفاءة #4825. - تم استبدال هيكل
SPPبـSPPF. هذا التعديل يضاعف سرعة المعالجة أكثر من مرتين مع الحفاظ على نفس النتيجة.
لاختبار سرعة SPP وSPPF، يمكن استخدام الكود التالي:
SPP vs SPPF speed profiling example (click to open)
import time
import torch
from torch import nn
class SPP(nn.Module):
def __init__(self):
"""Initializes an SPP module with three different sizes of max pooling layers."""
super().__init__()
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
def forward(self, x):
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
o1 = self.maxpool1(x)
o2 = self.maxpool2(x)
o3 = self.maxpool3(x)
return torch.cat([x, o1, o2, o3], dim=1)
class SPPF(nn.Module):
def __init__(self):
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""Applies sequential max pooling and concatenates results with input tensor."""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
input_tensor = torch.rand(8, 32, 16, 16)
spp = SPP()
sppf = SPPF()
output1 = spp(input_tensor)
output2 = sppf(input_tensor)
print(torch.equal(output1, output2))
t_start = time.time()
for _ in range(100):
spp(input_tensor)
print(f"SPP time: {time.time() - t_start}")
t_start = time.time()
for _ in range(100):
sppf(input_tensor)
print(f"SPPF time: {time.time() - t_start}")
if __name__ == "__main__":
main()النتيجة:
True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648تقنيات تعزيز البيانات#
يستخدم YOLOv5 تقنيات مختلفة لتضخيم البيانات لتحسين قدرة النموذج على التعميم وتقليل overfitting. تتضمن هذه التقنيات:
-
Mosaic Augmentation: تقنية معالجة الصور التي تجمع بين أربعة صور تدريبية في صورة واحدة بطرق تشجع نماذج object detection على التعامل بشكل أفضل مع مقاييس الأجسام والتحويلات المختلفة.

-
تعزيز النسخ واللصق (Copy-Paste Augmentation): طريقة مبتكرة لتعزيز البيانات تقوم بنسخ رقع عشوائية من صورة ولصقها فوق صورة أخرى مختارة عشوائياً، مما يولد بشكل فعال عينة تدريب جديدة.

-
تحويلات أفين العشوائية (Random Affine Transformations): تشمل هذه التحويلات التدوير العشوائي، والقياس، والترجمة، والقص للصور.

-
تعزيز المزيج (MixUp Augmentation): طريقة تنشئ صوراً مركبة عن طريق أخذ مزيج خطي من صورتين وتسمياتهما المرتبطة.

-
Albumentations: مكتبة قوية لتضخيم الصور تدعم مجموعة واسعة من تقنيات التضخيم. تعرف على المزيد حول using Albumentations augmentations.
-
تعزيز HSV: تغييرات عشوائية على تدرج اللون (Hue)، والتشبع (Saturation)، والقيمة (Value) للصور.

-
القلب الأفقي العشوائي (Random Horizontal Flip): طريقة تعزيز تقلب الصور أفقياً بشكل عشوائي.

استراتيجيات التدريب#
يطبق YOLOv5 العديد من استراتيجيات التدريب المتطورة لتحسين أداء النموذج. وتشمل:
- التدريب متعدد المقاييس (Multiscale Training): يتم تغيير حجم صور الإدخال عشوائياً ضمن نطاق من 0.5 إلى 1.5 مرة من حجمها الأصلي أثناء عملية التدريب.
- AutoAnchor: تعمل هذه الاستراتيجية على تحسين صناديق الارتساء (anchor boxes) الأولية لتطابق الخصائص الإحصائية لصناديق الحقيقة الأرضية (ground truth boxes) في بياناتك المخصصة.
- Warmup and Cosine LR Scheduler: طريقة لضبط learning rate لتحسين أداء النموذج.
- المتوسط المتحرك الأسي (EMA): استراتيجية تستخدم متوسط المعلمات عبر الخطوات السابقة لتحقيق الاستقرار في عملية التدريب وتقليل خطأ التعميم.
- Mixed Precision Training: طريقة لتنفيذ العمليات بتنسيق نصف precision، مما يقلل من استخدام الذاكرة ويعزز سرعة الحوسبة.
- Hyperparameter Evolution: استراتيجية لضبط المعلمات الفائقة تلقائياً لتحقيق الأداء الأمثل. تعرف على المزيد حول hyperparameter tuning.
ميزات إضافية#
4.1 حساب الخسائر#
يتم حساب الخسارة في YOLOv5 كمزيج من ثلاثة مكونات خسارة فردية:
- خسارة الفئات (BCE Loss): خسارة الإنتروبيا المتقاطعة الثنائية (Binary Cross-Entropy)، تقيس الخطأ في مهمة التصنيف.
- خسارة الوجود (Objectness Loss - BCE Loss): خسارة أخرى للإنتروبيا المتقاطعة الثنائية، تحسب الخطأ في اكتشاف ما إذا كان هناك كائن موجود في خلية شبكة معينة أم لا.
- خسارة الموقع (CIoU Loss): خسارة IoU الكاملة، تقيس الخطأ في تحديد موقع الكائن داخل خلية الشبكة.
يتم تمثيل loss function الإجمالي بواسطة:
4.2 موازنة الخسائر#
يتم ترجيح خسائر الموضوعية لطبقات التنبؤ الثلاث (P3، وP4، وP5) بشكل مختلف. أوزان التوازن هي [4.0, 1.0, 0.4] على التوالي. يضمن هذا النهج أن تساهم التنبؤات بمقاييس مختلفة بشكل مناسب في إجمالي الخسارة.
4.3 القضاء على حساسية الشبكة#
تجري بنية YOLOv5 بعض التغييرات المهمة على استراتيجية التنبؤ بالصناديق مقارنة بالإصدارات السابقة من YOLO. في YOLOv2 و YOLOv3، تم التنبؤ بإحداثيات الصندوق مباشرة باستخدام تنشيط الطبقة الأخيرة.
ومع ذلك، في YOLOv5، تم تحديث صيغة التنبؤ بإحداثيات الصندوق لتقليل حساسية الشبكة ومنع النموذج من التنبؤ بأبعاد صناديق غير مقيدة.
الصيغ المعدلة لحساب bounding box المتوقع هي كما يلي:
قارن بين إزاحة نقطة المركز قبل وبعد القياس. تم تعديل نطاق إزاحة نقطة المركز من (0, 1) إلى (-0.5, 1.5). لذلك، يمكن للإزاحة بسهولة الحصول على قيمة 0 أو 1.
قارن نسبة قياس الارتفاع والعرض (بالنسبة لـ anchor) قبل وبعد التعديل. معادلات صندوق yolo/darknet الأصلية بها عيب خطير. العرض والارتفاع غير محدودين تماماً حيث إنهما ببساطة out=exp(in)، وهو أمر خطير، لأنه قد يؤدي إلى تدرجات جامحة، وعدم استقرار، وخسائر NaN وفي النهاية فقدان تام للتدريب. Refer to this issue لمزيد من التفاصيل.
4.4 بناء الأهداف#
عملية بناء الهدف في YOLOv5 بالغة الأهمية لكفاءة التدريب وaccuracy النموذج. وهي تتضمن تعيين مربعات الحقيقة الأرضية إلى خلايا الشبكة المناسبة في خريطة الإخراج ومطابقتها مع مربعات anchor المناسبة.
تتبع هذه العملية هذه الخطوات:
- حساب نسبة أبعاد صندوق الحقيقة الأرضية وأبعاد كل قالب ارتساء.
- إذا كانت النسبة المحسوبة ضمن العتبة، فقم بمطابقة صندوق الحقيقة الأرضية مع الارتساء المقابل.
- قم بتعيين الارتساء المطابق إلى الخلايا المناسبة، مع الأخذ في الاعتبار أنه بسبب إزاحة نقطة المركز المنقحة، يمكن تعيين صندوق حقيقة أرضية لأكثر من ارتساء واحد لأن نطاق إزاحة نقطة المركز تم تعديله من (0, 1) إلى (-0.5, 1.5)، مما يجعل المطابقات الإضافية ممكنة.
بهذه الطريقة، تضمن عملية بناء الأهداف تعيين ومطابقة كل كائن حقيقة أرضية بشكل صحيح أثناء عملية التدريب، مما يسمح لـ YOLOv5 بتعلم مهمة الكشف عن الكائنات بشكل أكثر فعالية.
الخلاصة#
يمثل YOLOv5 خطوة ذات مغزى في تطور الكشف عن الكائنات في الوقت الفعلي. تقدم خياراته الهيكلية، واستراتيجيات التدريب، والتحسينات الهندسية أداءً قوياً وكفاءة مقارنة بإصدارات YOLO السابقة.
تشمل التحسينات الأساسية في YOLOv5 استخدام بنية ديناميكية، ومجموعة واسعة من تقنيات تعزيز البيانات، واستراتيجيات تدريب مبتكرة، بالإضافة إلى تعديلات مهمة في حساب الخسائر وعملية بناء الأهداف. كل هذه الابتكارات تحسن بشكل كبير دقة وكفاءة الكشف عن الكائنات مع الاحتفاظ بدرجة عالية من السرعة، وهو ما يمثل العلامة التجارية لنماذج YOLO.