Ultralytics YOLOv5 Mimarisi#
YOLOv5 (v6.0/6.1), Ultralytics tarafından geliştirilen güçlü bir nesne tespiti algoritmasıdır. Bu makale, YOLOv5 mimarisini, veri artırma stratejilerini, eğitim metodolojilerini ve kayıp hesaplama tekniklerini derinlemesine inceler. Bu kapsamlı kavrayış; gözetim, otonom araçlar ve görüntü tanıma dahil olmak üzere çeşitli alanlardaki nesne tespiti pratik uygulamanı geliştirmene yardımcı olacaktır.
1. Model Yapısı#
YOLOv5'in mimarisi üç ana bölümden oluşur:
- Omurga (Backbone): Bu, ağın ana gövdesidir. YOLOv5 için omurga, önceki sürümlerde kullanılan Darknet mimarisinin bir modifikasyonu olan
CSPDarknet53yapısı kullanılarak tasarlanmıştır. - Boyun (Neck): Bu kısım omurgayı ve başlığı birbirine bağlar. YOLOv5'te
SPPF(Spatial Pyramid Pooling - Fast) vePANet(Path Aggregation Network) yapıları kullanılır. - Başlık (Head): Bu kısım nihai çıktıyı üretecek kısımdır. YOLOv5 bu amaç için
YOLOv3 Headkullanır.
Modelin yapısı aşağıdaki görselde gösterilmektedir. Model yapısı detayları models/yolov5l.yaml adresinde bulunabilir.

YOLOv5, kendinden önceki sürümlere kıyasla bazı önemli iyileştirmeler sunar:
- Daha önceki sürümlerde bulunan
Focusyapısının yerini6x6 Conv2dyapısı almıştır. Bu değişiklik verimliliği artırır #4825. SPPyapısı,SPPFile değiştirilmiştir. Bu değişiklik, aynı çıktıyı korurken işleme hızını ikiden fazla katlar.
SPP ve SPPF hızını test etmek için aşağıdaki kod kullanılabilir:
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()sonuç:
True
SPP time: 0.5373051166534424
SPPF time: 0.207807064056396482. Veri Artırma Teknikleri#
YOLOv5, modelin genelleme yeteneğini geliştirmek ve aşırı öğrenmeyi (overfitting) azaltmak için çeşitli veri artırma teknikleri kullanır. Bu teknikler şunları içerir:
-
Mozaik Veri Artırma (Mosaic Augmentation): Nesne tespiti modellerinin çeşitli nesne ölçeklerini ve ötelemelerini daha iyi yönetmesini teşvik edecek şekilde dört eğitim görüntüsünü tek bir görüntüde birleştiren bir görüntü işleme tekniği.

-
Copy-Paste (Kopyala-Yapıştır) Artırma: Bir görüntüden rastgele parçaları kopyalayıp bunları başka bir rastgele seçilmiş görüntü üzerine yapıştırarak etkili bir şekilde yeni bir eğitim örneği oluşturan yenilikçi bir veri artırma yöntemidir.

-
Rastgele Afin Dönüşümler: Bu, görüntülerin rastgele döndürülmesini, ölçeklenmesini, ötelenmesini ve eğilmesini (shearing) içerir.

-
MixUp Artırma: İki görüntünün ve bunlarla ilişkili etiketlerin doğrusal bir kombinasyonunu alarak bileşik görüntüler oluşturan bir yöntemdir.

-
Albumentations: Çok çeşitli artırma tekniklerini destekleyen güçlü bir görüntü artırma kütüphanesi. Albumentations artırmalarını kullanma hakkında daha fazla bilgi edin.
-
HSV Artırma: Görüntülerin Ton (Hue), Doygunluk (Saturation) ve Değer (Value) değerlerinde rastgele değişiklikler.

-
Rastgele Yatay Çevirme (Flip): Görüntüleri rastgele olarak yatay şekilde çeviren bir artırma yöntemidir.

3. Eğitim Stratejileri#
YOLOv5, modelin performansını artırmak için çeşitli gelişmiş eğitim stratejileri uygular. Bunlar şunları içerir:
- Çok Ölçekli (Multiscale) Eğitim: Eğitim sürecinde girdi görüntüleri, orijinal boyutlarının 0,5 ile 1,5 katı aralığında rastgele ölçeklendirilir.
- AutoAnchor: Bu strateji, önceden tanımlanmış anchor kutularını, özel verilerindeki ground truth kutularının istatistiksel özellikleriyle eşleşecek şekilde optimize eder.
- Isınma ve Kosinüs LR Zamanlayıcısı (Warmup and Cosine LR Scheduler): Model performansını artırmak için öğrenme oranını (learning rate) ayarlama yöntemi.
- Üstel Hareketli Ortalama (EMA): Eğitim sürecini stabilize etmek ve genelleme hatasını azaltmak için geçmiş adımlardaki parametrelerin ortalamasını kullanan bir stratejidir.
- Karma Hassasiyetli (Mixed Precision) Eğitim: İşlemleri yarı hassasiyet formatında gerçekleştirerek bellek kullanımını azaltan ve hesaplama hızını artıran bir yöntem.
- Hiperparametre Evrimi: Optimal performansa ulaşmak için hiperparametreleri otomatik olarak ayarlayan bir strateji. Hiperparametre ayarı hakkında daha fazla bilgi edin.
4. Ek Özellikler#
4.1 Kayıpları Hesapla#
YOLOv5'teki kayıp, üç ayrı kayıp bileşeninin birleşimi olarak hesaplanır:
- Sınıf Kaybı (BCE Loss): İkili Çapraz Entropi (Binary Cross-Entropy) kaybı, sınıflandırma görevi için hatayı ölçer.
- Nesnellik Kaybı (BCE Loss): Başka bir İkili Çapraz Entropi kaybı, belirli bir ızgara hücresinde bir nesnenin bulunup bulunmadığını algılamadaki hatayı hesaplar.
- Konum Kaybı (CIoU Loss): Tam IoU kaybı, nesnenin ızgara hücresi içinde konumlandırılmasındaki hatayı ölçer.
Genel kayıp fonksiyonu şununla gösterilir:
4.2 Kayıpları Dengele#
Üç tahmin katmanının (P3, P4, P5) nesnesellik kayıpları farklı şekilde ağırlıklandırılır. Denge ağırlıkları sırasıyla [4.0, 1.0, 0.4] kadardır. Bu yaklaşım, farklı ölçeklerdeki tahminlerin toplam kayba uygun şekilde katkıda bulunmasını sağlar.
4.3 Izgara Duyarlılığını Ortadan Kaldır#
YOLOv5 mimarisi, önceki YOLO sürümlerine kıyasla kutu tahmin stratejisinde bazı önemli değişiklikler yapar. YOLOv2 ve YOLOv3'te, kutu koordinatları son katmanın aktivasyonu kullanılarak doğrudan tahmin ediliyordu.
Ancak YOLOv5'te, ızgara duyarlılığını azaltmak ve modelin sınırsız kutu boyutları tahmin etmesini önlemek için kutu koordinatlarını tahmin etme formülü güncellenmiştir.
Tahmin edilen sınırlayıcı kutuyu (bounding box) hesaplamak için revize edilen formüller şunlardır:
Ölçeklendirme öncesi ve sonrası merkez nokta ofsetini karşılaştır. Merkez nokta ofset aralığı (0, 1)'den (-0,5, 1,5)'e ayarlanmıştır. Bu nedenle, ofset kolayca 0 veya 1 değerini alabilir.
Ayarlamadan önce ve sonra yükseklik ve genişlik ölçeklendirme oranını (çapa/anchor'a göre) karşılaştır. Orijinal yolo/darknet kutu denklemlerinin ciddi bir kusuru vardır. Genişlik ve Yükseklik tamamen sınırsızdır çünkü basitçe out=exp(in) şeklindedir; bu tehlikelidir çünkü kontrolden çıkan gradyanlara, kararsızlıklara, NaN kayıplarına ve nihayetinde eğitimin tamamen kaybolmasına yol açabilir. Daha fazla detay için bu soruna göz at.
4.4 Hedefleri Oluştur#
YOLOv5'teki hedef oluşturma süreci, eğitim verimliliği ve model doğruluğu için kritik önem taşır. Zemin gerçekliği (ground truth) kutularının çıktı haritasındaki uygun ızgara hücrelerine atanmasını ve uygun çapa kutularıyla eşleştirilmesini içerir.
Bu süreç şu adımları izler:
- Ground truth kutusu boyutlarının ve her bir anchor şablonunun boyutlarının oranını hesapla.
- Hesaplanan oran eşik içindeyse, ground truth kutusunu karşılık gelen anchor ile eşleştir.
- Eşleşen anchor'ı uygun hücrelere ata. Revize edilen merkez nokta ofseti nedeniyle, bir ground truth kutusunun birden fazla anchor'a atanabileceğini unutma, çünkü merkez nokta ofset aralığı (0, 1)'den (-0,5, 1,5)'e ayarlanmıştır ve bu da ek eşleşmeleri mümkün kılar.
Bu şekilde, hedef oluşturma süreci, her ground truth nesnesinin eğitim sürecinde düzgün bir şekilde atanmasını ve eşleştirilmesini sağlar, böylece YOLOv5'in nesne algılama görevini daha etkili bir şekilde öğrenmesine olanak tanır.
Sonuç#
YOLOv5, gerçek zamanlı nesne algılamanın evriminde anlamlı bir adımı temsil eder. Mimari tercihleri, eğitim stratejileri ve mühendislik iyileştirmeleri, önceki YOLO sürümlerine göre güçlü performans ve verimlilik sağlar.
YOLOv5'teki temel geliştirmeler; dinamik bir mimarinin kullanımını, çok çeşitli veri artırma tekniklerini, yenilikçi eğitim stratejilerini ve ayrıca kayıpların hesaplanması ve hedef oluşturma sürecindeki önemli ayarlamaları içerir. Tüm bu yenilikler, YOLO modellerinin alametifarikası olan yüksek hızı korurken, nesne algılamanın doğruluğunu ve verimliliğini önemli ölçüde artırır.