بنية Ultralytics YOLOv5
YOLOv5 (v6.0/6.1) هي خوارزمية قوية للكشف عن الأجسام طورتها Ultralytics. تتعمق هذه المقالة في بنية YOLOv5، واستراتيجيات توسيع البيانات، ومنهجيات التدريب، وتقنيات حساب الخسارة. سيساعد هذا الفهم الشامل في تحسين تطبيقك العملي للكشف عن الأجسام في مختلف المجالات، بما في ذلك المراقبة والمركبات ذاتية القيادة و التعرف على الصور.
1. هيكل النموذج
يتكون هيكل YOLOv5 من ثلاثة أجزاء رئيسية:
- العمود الفقري: هذا هو الجزء الرئيسي من الشبكة. بالنسبة إلى YOLOv5، تم تصميم العمود الفقري باستخدام
CSPDarknet53
هيكل، وهو تعديل لهيكل Darknet المستخدم في الإصدارات السابقة. - الرقبة (Neck): يربط هذا الجزء بين العمود الفقري والرأس. في YOLOv5،
SPPF
(تجميع الهرم المكاني - السريع) وPANet
(شبكة تجميع المسار) يتم استخدام الهياكل. - الرأس: هذا الجزء مسؤول عن إنشاء المخرجات النهائية. يستخدم YOLOv5
YOLOv3 Head
لهذا الغرض.
تم تصوير هيكل النموذج في الصورة أدناه. يمكن العثور على تفاصيل هيكل النموذج في yolov5l.yaml
.
يقدم YOLOv5 بعض التحسينات الملحوظة مقارنة بالإصدارات السابقة:
- في
Focus
تم استبدال الهيكل الموجود في الإصدارات السابقة بـ6x6 Conv2d
هيكل. هذا التغيير يعزز الكفاءة #4825. - في
SPP
تم استبدال الهيكل بـSPPF
. هذا التعديل يضاعف سرعة المعالجة مع الحفاظ على نفس الإخراج.
لاختبار سرعة SPP
و SPPF
، يمكن استخدام الكود التالي:
مثال على تحديد سرعة SPP مقابل SPPF (انقر لفتح)
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.20780706405639648
2. تقنيات زيادة البيانات
تستخدم YOLOv5 تقنيات مختلفة لتوسيع البيانات لتحسين قدرة النموذج على التعميم وتقليل التجاوز. وتشمل هذه التقنيات:
-
زيادة الفسيفساء: تقنية معالجة الصور التي تجمع بين أربع صور تدريبية في صورة واحدة بطرق تشجع نماذج اكتشاف الكائنات على التعامل بشكل أفضل مع مقاييس وترجمات الكائنات المختلفة.
-
زيادة النسخ واللصق: طريقة مبتكرة لزيادة البيانات تقوم بنسخ رقع عشوائية من صورة ولصقها على صورة أخرى مختارة عشوائيًا، مما يؤدي بشكل فعال إلى إنشاء عينة تدريب جديدة.
-
تحويلات Affine عشوائية: يتضمن ذلك الدوران العشوائي والتحجيم والترجمة وقص الصور.
-
زيادة بيانات MixUp: طريقة لإنشاء صور مركبة عن طريق أخذ توليفة خطية من صورتين والتسميات المرتبطة بهما.
-
Albumentations: مكتبة قوية لزيادة الصور تدعم مجموعة واسعة من تقنيات الزيادة. تعرف على المزيد حول استخدام زيادات Albumentations.
-
زيادة HSV: تغييرات عشوائية في درجة اللون والتشبع والقيمة للصور.
-
قلب أفقي عشوائي: طريقة لزيادة البيانات تقوم بقلب الصور أفقيًا بشكل عشوائي.
3. استراتيجيات التدريب
تطبق YOLOv5 العديد من استراتيجيات التدريب المتطورة لتحسين أداء النموذج. وتشمل هذه:
- التدريب متعدد المقاييس: يتم تغيير حجم الصور المدخلة عشوائيًا ضمن نطاق يتراوح من 0.5 إلى 1.5 ضعف حجمها الأصلي أثناء عملية التدريب.
- AutoAnchor: تعمل هذه الإستراتيجية على تحسين مربعات الارتساء المسبقة لتتوافق مع الخصائص الإحصائية لمربعات الحقيقة الأرضية في بياناتك المخصصة.
- التهيئة التدريجية وجدول Cosine LR: طريقة لضبط معدل التعلم لتحسين أداء النموذج.
- المتوسط المتحرك الأسي (EMA): إستراتيجية تستخدم متوسط المعلمات عبر الخطوات السابقة لتحقيق الاستقرار في عملية التدريب وتقليل خطأ التعميم.
- تدريب الدقة المختلطة (Mixed Precision): طريقة لتنفيذ العمليات بتنسيق نصف الدقة (precision)، مما يقلل من استخدام الذاكرة ويعزز السرعة الحسابية.
- تطوير المعلمات الفائقة: استراتيجية لضبط المعلمات الفائقة تلقائيًا لتحقيق الأداء الأمثل. تعرف على المزيد حول ضبط المعلمات الفائقة.
4. ميزات إضافية
4.1 حساب الخسائر
يتم حساب الخسارة في YOLOv5 كمزيج من ثلاثة مكونات خسارة فردية:
- فقدان الفئات (فقدان BCE): فقدان Binary Cross-Entropy، يقيس الخطأ لمهمة التصنيف.
- Objectness Loss (BCE Loss): خسارة أخرى للإنتروبيا المتقاطعة الثنائية، تحسب الخطأ في الكشف عما إذا كان هناك كائن موجود في خلية شبكة معينة أم لا.
- فقدان الموقع (فقدان CIoU): فقدان IoU الكامل، يقيس الخطأ في تحديد موقع الكائن داخل خلية الشبكة.
يتم تصوير دالة الخسارة الإجمالية بواسطة:
4.2 موازنة الخسائر
خسائر الموضوعية لطبقات التنبؤ الثلاث (P3
, P4
, P5
) يتم ترجيحها بشكل مختلف. أوزان الموازنة هي [4.0, 1.0, 0.4]
على التوالي. يضمن هذا النهج أن المساهمة تكون مناسبة للتنبؤات بمقاييس مختلفة للخسارة الكلية.
4.3 التخلص من حساسية الشبكة
يجري هيكل YOLOv5 بعض التغييرات المهمة على إستراتيجية التنبؤ بالمربعات مقارنة بالإصدارات السابقة من YOLO. في YOLOv2 و YOLOv3، تم التنبؤ بإحداثيات المربع مباشرةً باستخدام تنشيط الطبقة الأخيرة.
ومع ذلك، في YOLOv5، تم تحديث صيغة التنبؤ بإحداثيات المربع لتقليل حساسية الشبكة ومنع النموذج من التنبؤ بأبعاد مربع غير محدودة.
الصيغ المنقحة لحساب المربع المحيط المتوقع هي كما يلي:
قارن إزاحة النقطة المركزية قبل وبعد التحجيم. يتم تعديل نطاق إزاحة النقطة المركزية من (0، 1) إلى (-0.5، 1.5). لذلك، يمكن أن تحصل الإزاحة بسهولة على 0 أو 1.
قارن بين نسبة مقياس الارتفاع والعرض (بالنسبة إلى المرساة) قبل وبعد التعديل. معادلات الصندوق الأصلية في yolo/darknet لديها عيب خطير. العرض والارتفاع غير محدودين تمامًا لأن ببساطة out=exp(in)، وهو أمر خطير، لأنه يمكن أن يؤدي إلى تدرجات جامحة، وعدم استقرار، وخسائر NaN، وفي النهاية فقدان كامل للتدريب. راجع هذه المشكلة لمزيد من التفاصيل.
4.4 بناء الأهداف
تعتبر عملية بناء الهدف في YOLOv5 ضرورية لكفاءة التدريب ودقة النموذج. وهي تنطوي على تعيين مربعات الحقيقة الأساسية لخلايا الشبكة المناسبة في خريطة الإخراج ومطابقتها مع مربعات الارتكاز المناسبة.
تتبع هذه العملية الخطوات التالية:
- احسب نسبة أبعاد مربع الحقيقة الأساسية وأبعاد كل قالب مرساة.
- إذا كانت النسبة المحسوبة ضمن العتبة، فقم بمطابقة مربع الحقيقة الأساسية مع المرساة المقابلة.
- قم بتعيين المرساة المطابقة للخلايا المناسبة، مع الأخذ في الاعتبار أنه نظرًا للإزاحة المنقحة للنقطة المركزية، يمكن تعيين مربع الحقيقة الأرضية لأكثر من مرساة واحدة. نظرًا لتعديل نطاق إزاحة النقطة المركزية من (0، 1) إلى (-0.5، 1.5). يمكن تعيين مربع GT لمزيد من المراسي.
بهذه الطريقة، تضمن عملية أهداف الإنشاء تعيين كل كائن حقيقة أساسية ومطابقته بشكل صحيح أثناء عملية التدريب، مما يسمح لـ YOLOv5 بتعلم مهمة الكشف عن الكائنات بشكل أكثر فعالية.
الخلاصة
في الختام، يمثل YOLOv5 خطوة كبيرة إلى الأمام في تطوير نماذج الكشف عن الكائنات في الوقت الفعلي. من خلال دمج العديد من الميزات الجديدة والتحسينات واستراتيجيات التدريب، فإنه يتفوق على الإصدارات السابقة من عائلة YOLO في الأداء والكفاءة.
تشمل التحسينات الأساسية في YOLOv5 استخدام بنية ديناميكية، ومجموعة واسعة من تقنيات زيادة البيانات، واستراتيجيات تدريب مبتكرة، بالإضافة إلى تعديلات مهمة في حساب خسائر وعملية بناء الأهداف. تعمل كل هذه الابتكارات على تحسين دقة وكفاءة اكتشاف الكائنات بشكل كبير مع الحفاظ على درجة عالية من السرعة، وهي العلامة التجارية لنماذج YOLO.