Link to this sectionبنية Ultralytics YOLOv5#
YOLOv5 (الإصدار 6.0/6.1) هو خوارزمية قوية للكشف عن الكائنات طورتها Ultralytics. تتعمق هذه المقالة في بنية YOLOv5، واستراتيجيات تعزيز البيانات، ومنهجيات التدريب، وتقنيات حساب الخسارة. سيساعد هذا الفهم الشامل في تحسين تطبيقك العملي للكشف عن الكائنات في مجالات مختلفة، بما في ذلك المراقبة، والمركبات ذاتية القيادة، والتعرف على الصور.
Link to this sectionهيكل النموذج#
تتكون بنية YOLOv5 من ثلاثة أجزاء رئيسية:
- العمود الفقري (Backbone): هذا هو الجزء الرئيسي للشبكة. بالنسبة لـ YOLOv5، تم تصميم العمود الفقري باستخدام هيكل
CSPDarknet53، وهو تعديل لبنية Darknet المستخدمة في الإصدارات السابقة. - العنق (Neck): يربط هذا الجزء بين العمود الفقري والرأس. في 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
import torch.nn as 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.20780706405639648Link to this sectionتقنيات تعزيز البيانات#
يستخدم YOLOv5 تقنيات مختلفة لتعزيز البيانات لتحسين قدرة النموذج على التعميم وتقليل الإفراط في التخصيص. تشمل هذه التقنيات:
-
تعزيز الفسيفساء (Mosaic Augmentation): تقنية معالجة صور تجمع أربع صور تدريب في صورة واحدة بطرق تشجع نماذج الكشف عن الكائنات على التعامل بشكل أفضل مع مختلف أحجام الكائنات وتحولاتها.

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

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

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

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

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

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