YOLO Vision 2026:

YOLO Mimarisi Açıklaması: YOLOv3'ten YOLO26'ya#

Her Ultralytics YOLO modeli üç aşamadan oluşur: özellikleri çıkaran bir omurga, bunları ölçekler arasında birleştiren bir boyun ve kutuları ve sınıfları tahmin eden bir başlık. Bu kılavuz, her aşamayı oluşturan modülleri ve bunların YOLOv3'ten YOLO26'ya nasıl değiştiğini belgeler; her bileşeni ultralytics/cfg/models/ altındaki yapılandırma dosyalarındaki tanımına ve ultralytics/nn/modules/ içindeki modül sınıflarına kadar izler.

Her model, YAML dosyasında sıralı bir katman listesi olarak bildirimsel biçimde tanımlanır ve her katman [from, repeats, module, args] biçimini izler: onu besleyen katman(lar), modülün kaç kez tekrarlandığı, katman sınıfı (Conv, C3k2, SPPF, Detect, …) ve kurucu bağımsız değişkenleri. Model YAML Yapılandırma Kılavuzu, varyantın derinlik ve genişlik katsayılarıyla repeats ve args ölçeklendirmesi de dahil olmak üzere bu biçimi ve modül çözümleme sistemini ayrıntılı olarak belgeler. Bu kılavuz, modüllerin kendisine ve sürümden sürüme nasıl değiştiklerine odaklanır.

Üç Aşama#

Her Ultralytics YOLO modeli görüntüyü, her birinin farklı bir görevi olan üç ardışık aşamadan geçirir:

AşamaGörevÇıktı
OmurgaGirdi görüntüsünden birden çok çözünürlükte özellikleri çıkarır8, 16 ve 32 stride değerlerindeki özellik haritaları (P3, P4 ve P5)
BoyunHem küçük hem de büyük nesnelerin bağlama sahip olması için özellikleri ölçekler arasında birleştirirÇok ölçekli birleştirilmiş özellik haritaları
BaşlıkBirleştirilmiş özelliklerden sınırlayıcı kutuları ve sınıf skorlarını tahmin ederBağlantı noktası başına tespitler

Temel birim, conv.py içinde tanımlanan Conv bloğudur: sıralı biçimde uygulanan bir 2B evrişim, batch normalizasyonu ve SiLU aktivasyonu. Aşağıdaki her büyük modül, Conv bloklarının birleştirilmesiyle oluşturulur.

Mimari Diyagramlar#

Her sürüm aynı omurga → boyun → başlık iskeletini korur ve belirli aşamaları değiştirir. Aşağıdaki sekmeler sürüm başına yapıyı gösterir: omurga ve boyun aşamaları ultralytics/cfg/models/ içindeki yapılandırmaları izlerken YOLOv3 ve YOLOv5 başlıkları, paket yapılandırmalarında gerçekte bulunan anchor-free u-varyant başlığı yerine özgün anchor tabanlı biçimleriyle çizilmiştir. Sekmeler arasında ilerlemek, her neslin ne eklediğini gösterir. Kısaca ilerleme şöyledir: YOLOv3 yalnızca FPN kullanan, anchor tabanlı bir dedektördür; YOLOv5 alt yönlü PAN yolunu ve SPPF öğesini ekler; YOLOv8, anchor-free ve DFL başlığına sahip C2f bloğuna geçer; YOLO11 C2PSA dikkat mekanizmasını ve C3k2 bloğunu ekler; YOLO26 ise SPPF artık bağlantısı ekleyerek başlığı NMS-free ve DFL-free hâle getirir. Düğüm renkleri dokümantasyon diyagramı kuralını izler: yeşil girdi, mavi omurga, arduvaz rengi uzamsal havuzlama ve dikkat, turuncu boyun, mor başlık ve çıktı.

flowchart TD
    IN[Input 640x640]:::start --> ST[Conv stem<br/>5x stride-2 down to P1-P5]:::proc
    ST --> BB[Darknet-53 backbone<br/>stacked Bottleneck]:::proc
    BB --> FPN[Neck FPN only<br/>top-down Upsample + Concat]:::decide
    FPN --> HD[Detect head<br/>3 scales, anchor-based]:::out
    HD --> O[Predictions + NMS]:::out
    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff

YOLOv3 ve YOLOv5 diyagramları özgün anchor tabanlı başlığı gösterir. ultralytics paketi, anchor-free YOLOv3u ve YOLOv5u yapılandırmalarını sunar — aynı Darknet-53 ve C3 omurgaları, YOLOv8'in Detect başlığıyla birlikte — bunlar Tespit Başlığı bölümünde açıklanmıştır.

Omurga Blokları: Bottleneck → C3 → C2f → C3k2#

Omurga, stride-2 Conv alt örnekleme katmanları arasında tekrarlanan bir CSP (Aşamalar Arası Kısmi (CSP)) bloğunu art arda dizer. Sürümler arasında en çok değişen bileşen bu tekrarlanan bloktur. Aşağıdaki tüm bloklar block.py içinde bulunur; c1/c2 girdi/çıktı kanallarıdır ve c = 0.5 * c2 gizli genişliktir.

Bottleneck (YOLOv3)#

Temel birim Bottleneck'dır: iki Conv katmanı (varsayılan çekirdekler (3, 3)) ve shortcut=True ile c1 == c2 olduğunda isteğe bağlı bir artık toplama işlemi. YOLOv3'ün Darknet-53 omurgası bunları doğrudan, CSP bölmesi olmadan art arda dizer ve üç ölçekte (stride değerleri 8, 16 ve 32) tespit yapar.

C3 (YOLOv5)#

YOLOv5'in C3 öğesi, girdiyi iki 1x1 evrişimi arasında böler: cv1, ardışık Bottleneck bloklarından oluşan n öğesini besler (önce (1, 1), ardından (3, 3) çekirdekleri); cv2 ise bunları atlar. İki yol birleştirilir ve üçüncü bir 1x1 Conv tarafından birleştirilir:

def forward(self, x):
    # C3: bottleneck path m(cv1(x)) concatenated with bypass cv2(x), then fused by cv3
    return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

Yalnızca son bottleneck çıktısı birleştirme evrişimine ulaşır; bu nedenle cv3 iki özellik haritası görür.

C2f (YOLOv8)#

YOLOv8'in C2f öğesi ("2 evrişimli, daha hızlı CSP Bottleneck"), birleştirme evrişimine ulaşan özellikleri değiştirir:

  1. cv1 = Conv(c1, 2 * c, 1), ardından chunk(2), çıktıyı c kanallı iki tensöre böler.
  2. n Bottleneck(c, c) blokları ((3, 3), (3, 3) çekirdekleri) ardışık olarak çalışır ve her biri önceki bloğun çıktısıyla beslenir.
  3. Tüm n + 2 ara tensörleri birleştirilir ve cv2 = Conv((2 + n) * c, c2, 1) tarafından birleştirilir.

C3 birleştirme evrişimine 2 özellik haritası aktarırken C2f, n + 2 aktarır; her ara bottleneck çıktısı yeniden kullanılır.

C3k2 (YOLO11 ve YOLO26)#

YOLO11 ve YOLO26, tekrarlanan birimi değiştiren C2f alt sınıfı C3k2 öğesini kullanır. n bloklarının her biri, kurucu bayraklarına bağlı olarak şunlardan birine dönüşür:

  • düz bir Bottleneck (varsayılan, c3k=False),
  • bir C3k bloğu (c3k=True) — yapılandırılabilir çekirdek boyutuna sahip bir C3 varyantı veya
  • bir Bottleneck + PSABlock çifti (attn=True).

İkinci YAML bağımsız değişkeni, ölçek m, l veya x olmadıkça c3k değerini belirler; bu ölçekler değeri True olarak zorlar. Böylece tek bir yolo11.yaml tüm beş varyanta hizmet eder. Bu nedenle [-1, 2, C3k2, [512, False]], n ve s konumlarında Bottleneck iç yapılarını; m, l ve x konumlarında ise C3k iç yapılarını oluşturur. 512, ön ölçeklendirme kanal sayısıdır; varyantın genişlik katsayısı bunu n konumunda 128'e ve x konumunda 768'e dönüştürür. CSP modüllerinde, varyantın derinlik katsayısıyla ölçeklendirilmeden önce burada 2 olan repeats alanı, ayrı modülleri art arda dizmek yerine bloğun iç tekrar sayısına dönüşür.

Uzamsal Havuzlama: SPP → SPPF#

Omurganın sonunda, bir uzamsal piramit havuzlama bloğu alıcı alanı genişletir. YOLOv5, özgün çok çekirdekli SPP öğesini SPPF (Hızlı Uzamsal Piramit Havuzlama) ile değiştirdi: tek bir MaxPool2d(kernel_size=5, stride=1, padding=2), n = 3 kez ardışık olarak uygulanır; girdi ve havuzlanmış üç çıktı birleştirilir ve bir 1x1 Conv tarafından birleştirilir. Bu, SPP(k=(5, 9, 13)) ile matematiksel olarak eşdeğerdir ancak daha ucuzdur; çünkü zincirlenmiş 5x5 havuzlama işlemleri daha büyük çekirdeklerin alıcı alanlarını kapsar.

YOLO26 bir kısayol bayrağı (SPPF, [1024, 5, 3, True]) geçirir; en derin katmandaki c1 == c2 == 1024 nedeniyle SPPF, artık bağlantısı (return y + x) ekler.

Uzamsal Dikkat: C2PSA (YOLO11+)#

YOLO11, SPPF sonrasına C2PSA ekledi. Bu, etkin dalı PSABlock n (Konuma Duyarlı Dikkat (PSA)) modüllerinden oluşan bir yığın olan CSP bloğudur: cv1 = Conv(c1, 2 * c, 1) özellikleri böler, bir yarı PSABlock yığınından geçer ve cv2 = Conv(2 * c, c1, 1) birleştirilmiş çıktıyı birleştirir. Her PSABlock, iki katmanlı ileri beslemeli ağın (Conv(c, 2 * c, 1)Conv(2 * c, c, 1)) ardından çok başlı dikkat uygular; her birinde artık bağlantısı bulunur. YOLO26 aynı C3k2 + C2PSA omurgasını korur.

Boyun: FPN + PAN#

Boyun, omurganın P3/P4/P5 özellik haritalarını, üstten alta bir Özellik Piramidi Ağı (FPN) ve ardından alttan üste bir Yol Birleştirme Ağı (PAN) ile birleştirir. YAML başlık bölümünde FPN, anlamsal bilgiyi daha yüksek çözünürlüklere taşıyan nn.Upsample + Concat; PAN ise yerelleştirme bilgisini yukarı taşıyan stride-2 Conv + Concat biçimindedir:

# YOLO11 head (FPN top-down, then PAN bottom-up)
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
# ... second upsample + concat to P3 ...
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4 (PAN)
- [-1, 2, C3k2, [512, False]] # 19

Boyun, kendi neslindeki omurga bloğunu yeniden kullanır — YOLOv5'te C3, YOLOv8'de C2f, YOLO11 ve YOLO26'da C3k2 — böylece her birleştirme noktası omurganın kullandığı modülün aynısını çalıştırır. Birleştirilen üç çıktı başlığı besler. YOLOv3 bir istisnadır: boynu yalnızca üstten alta FPN kullanır (YAML başlığında stride-2 alt örnekleme yoktur); dolayısıyla YOLOv5'in eklediği alttan üste PAN yolu bulunmaz.

Tespit Başlığı: Anchor Tabanlı → Anchor-Free → NMS-Free#

Başlık, birleştirilmiş üç özellik haritasını tespit görevi için tahminlere dönüştürür. Tasarımı sürümler boyunca anchor tabanlıdan anchor-free'a ve NMS-free'a değişmiştir.

Anchor-free, ayrıştırılmış Detect#

Özgün YOLOv3 ve YOLOv5, önceden tanımlanmış anchor kutuları ve kutu ile sınıf tahminleri için ortak bir dal kullanan anchor tabanlı, birleştirilmiş bir başlığa sahipti. Bağımsız ultralytics/yolov3 ve ultralytics/yolov5 depoları bu anchor tabanlı tasarımı korur. Ana ultralytics paketi ise anchor-free YOLOv3u ve YOLOv5u varyantlarını sunar — aynı Darknet-53 ve C3 omurgaları, YOLOv8'in anchor-free Detect başlığıyla birlikte — ve burada belgelenen yolov3.yaml ile yolov5.yaml yapılandırmaları, geçmişteki tasarım değil, bu u varyantlarıdır.

Detect başlığı (head.py) anchor-free ve ayrıştırılmıştır: piramit seviyelerinin her birinde iki paralel dal çalıştırır ve anchor kutularına göre değil, doğrudan ızgara noktaları üzerinde tahmin yapar.

  • Kutu dalı (cv2): Conv(x, c2, 3)Conv(c2, c2, 3)Conv2d(c2, 4 * reg_max, 1).
  • Sınıf dalı (cv3): YOLO11 ve YOLO26'da iki depthwise-separable blok (DWConv + 1x1 Conv) → Conv2d(c3, nc, 1); YOLOv8 ise eski varyantı kullanır: iki 3x3 Conv katmanı → Conv2d(c3, nc, 1).

Bu nedenle her anchor noktası no = nc + 4 * reg_max çıktı üretir. Önceden tanımlanmış anchor'ların kaldırılması, ayarlanması gereken hiperparametrelerden anchor kutusu boyutlarını ve en-boy oranlarını çıkarır.

Dağılımsal Fokal Kayıp (DFL)#

YOLOv8 ve YOLO11, 4 kutu koordinatının her birini tek bir skaler yerine reg_max = 16 bölmesi üzerinde bir dağılım olarak geriletir (Genelleştirilmiş Fokal Kayıp'ın integral biçimi). DFL modülü, 4 * reg_max kutu kanallarını (4, reg_max) biçimine yeniden şekillendirir, reg_max bölmeleri üzerinde softmax uygular ve beklenen bölme indeksini — softmax olasılığıyla ağırlıklandırılan her bölme indeksinin toplanmasıyla — tahmin edilen koordinat olarak alır. Bu işlem, ağırlıkları arange(reg_max) bölme indeksleri olan sabit bir 1x1 evrişimiyle uygulanır; böylece ağırlıklı toplam tek bir noktasal çarpım olur.

YOLO26: NMS-free, DFL-free#

YOLO26, başlığın doğrudan okuduğu iki YAML parametresi belirler:

  • end2end: TrueDetect, dallarını bire bir başlığa (one2one_cv2/one2one_cv3) derin kopyalar; bu başlık nesne başına tek tahmin üretir ve Maksimum Olmayan Bastırma (NMS) son işleme adımını kaldırır. Dışa aktarma ve geçiş ayrıntıları için Uçtan Uca Tespit kılavuzuna bak.
  • reg_max: 1 — tek bölmeyle self.dfl, nn.Identity() ve no = nc + 4 hâline gelir; başlık koordinatları doğrudan geriletir ve dışa aktarılan ONNX grafiğinde hiçbir DFL işlemi görünmez.

Beş model boyutu (n/s/m/l/x) boyunca YOLO26, YOLO26 makalesinde bildirildiği üzere 1,7-11,8 ms T4 TensorRT gecikmesiyle COCO üzerinde 40,9-57,5 mAP değerine ulaşır.

Sürüm Sürüm Özet#

SürümOmurga bloğuUzamsal havuzlamaDikkatTespit başlığıDFL
YOLOv3Darknet-53 (Bottleneck)Temel yapılandırmada yokyokÖzgün: anchor tabanlı; u varyantı: anchor-freehayır / evet (u)
YOLOv5C3 (CSP)SPPFyokÖzgün: anchor tabanlı; u varyantı: anchor-freehayır / evet (u)
YOLOv8C2fSPPFyokAnchor-free, ayrıştırılmışevet (reg_max=16)
YOLO11C3k2SPPFC2PSAAnchor-free, ayrıştırılmışevet (reg_max=16)
YOLO26C3k2SPPF + kısayolC2PSAAnchor-free, NMS-free (end2end)kaldırıldı (reg_max=1)

Model başına ayrıntılar, performans tabloları ve kullanım örnekleri için YOLOv3, YOLOv5, YOLOv8, YOLO11 ve YOLO26 sayfalarına bak.

Mimarini Kendin İncele#

model.info() yöntemi, bir katman, parametre ve FLOPs özeti yazdırır; ayrıştırılmış modül listesine model.model.model üzerinden erişilebilir.

Bir YOLO modelinin mimarisini incele
from ultralytics import YOLO

# Load a pretrained model
model = YOLO("yolo11n.pt")

# Fuse Conv + BatchNorm layers so counts match the published specs
model.fuse()

# Print a summary: layers, parameters, gradients, GFLOPs
model.info()

# Inspect the detection head (the last module in the network)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| end2end:", head.end2end)

Parçacığı üç nesil üzerinde çalıştırmak, değişiklikleri sayısal olarak gösterir. Bunlar, her model sayfasında yayımlanan parametre ve FLOPs sayılarını karşılayan, ultralytics paketinden alınmış gerçek birleştirilmiş model çıktılarıdır:

ModelKatmanlarParametrelerGFLOPsreg_maxend2endDFL katmanı
YOLOv8n723,151,9048.716FalseDFL
YOLO11n1002,616,2486.516FalseDFL
YOLO26n1222,408,9325.51TrueIdentity

YOLO26n, reg_max=1, end2end=True ve bir Identity DFL katmanı bildirir; bu, NMS-free ve DFL-free başlığının mimari imzasıdır.

Birleştirilmiş ve birleştirilmemiş sayılar

Parametre ve FLOPs değerleri, her Conv ile onun batch normalizasyonu katmanını birleştiren birleştirilmiş model (model.fuse()) için bildirilir. Bu, yayımlanan teknik özelliklerle eşleşir; yeni yüklenen bir checkpoint, birleştirme işleminden önce biraz daha yüksek sayılar bildirir.

Sonuç#

Sürümler boyunca YOLO mimarisi her seferinde bir aşama değişti: omurga Darknet-53'ten, C2PSA dikkat mekanizmasına sahip CSP tabanlı C3, C2f ve C3k2 bloklarına geçti; boyun FPN + PAN yapısını korurken SPP, SPPF hâline geldi; başlık ise anchor tabanlıdan anchor-free'a, ardından YOLO26'nın NMS-free ve DFL-free uçtan uca tasarımına geçti.

Özel mimariler tanımlamak için Model YAML Yapılandırma Kılavuzu'na bakabilir veya modelleri model sayfalarında karşılaştırabilirsin. Soruların için GitHub veya Discord üzerinden ulaşabilirsin.

SSS#

  • Bir YOLO modelinde görüntüden 8, 16 ve 32 stride değerlerinde özellikleri çıkaran bir omurga, bu özellikleri FPN ve PAN ile ölçekler arasında birleştiren bir boyun ve sınırlayıcı kutuları ile sınıf skorlarını tahmin eden bir başlık bulunur. YOLOv3'ten YOLO26'ya kadar her Ultralytics YOLO modeli bu üç aşamalı tasarımı izler.

  • C2f (YOLOv8), füzyon evrişiminden önce her dahili Bottleneckn + 2 özellik haritasının çıktılarını birleştiren bir CSP bloğudur; eski C3 ise yalnızca 2 tanesini geçirir. C3k2 (YOLO11 ve YOLO26), C2f sınıfının bir alt sınıfıdır ve c3k bayrağı etkin olduğunda her Bottleneck öğesini bir C3k bloğuyla (C3 varyantı ve yapılandırılabilir çekirdek boyutu) değiştirebilir. Her ikisi de block.py içinde tanımlanır.

  • YOLO11, YOLOv8'de üç yapısal değişiklik yapar: omurga ve boyun bloğu olarak C2f yerine C3k2 kullanır, SPPF sonrasına bir C2PSA öz-dikkat bloğu ekler ve başlığın sınıflandırma dalını daha hafif derinlikçe ayrılabilir evrişimlere geçirir. Her ikisi de reg_max=16 DFL regresyonuna sahip, bağlantısız ve anchorsız aynı Detect başlığını korur; böylece bu değişiklikler algılama arayüzünü yeniden tasarlamak yerine parametre ve FLOPs sayılarını azaltırken doğruluğu artırır.

  • Modern Ultralytics YOLO modelleri anchorsızdır. YOLOv8, YOLO11 ve YOLO26; kutu regresyonu ve sınıflandırma için ayrı dallara sahip, anchorsız ve bağlantısız bir Detect başlığı kullanır. Özgün YOLOv3 ve YOLOv5 anchor tabanlıydı; ancak Ultralytics bunları, yapılandırmaları YOLOv8 ile aynı anchorsız başlığı kullanan YOLOv3u ve YOLOv5u varyantları olarak sunar.

  • Evet — YOLO26, end2end=True değerini ayarlar; bu da Detect için nesne başına tek bir tahmin üreten bire bir başlık sağlar ve önceki modellerin gerektirdiği Maksimum Olmayan Bastırma (Non-Maximum Suppression) son işleme adımını ortadan kaldırır. Ayrıntılar için Uçtan Uca Algılama kılavuzuna bak.

  • DFL, her kutu koordinatını reg_max bölmesi üzerinde bir softmax dağılımı olarak (YOLOv8 ve YOLO11'de varsayılan olarak 16) tahmin eder ve tek bir skaler tahmin etmek yerine beklenen değeri koordinat olarak alır. YOLO26, reg_max=1 değerini ayarlar; böylece DFL katmanı özdeşlik işlemine dönüşür, başlık koordinatları doğrudan tahmin eder ve dışa aktarılan ONNX veya TensorRT grafiklerinde hiçbir DFL işlemi görünmez.

  • Modeli Python ile yükle ve katman, parametre ve GFLOPs özetini almak için katmanlar için model.info() çağrısını yap. Ayrıştırılan katmanlar model.model.model içinde bulunur — örneğin, model.model.model[-1], reg_max ve end2end gibi öznitelikleri sunan Detect başlığıdır. Mimarinin tamamı modelin YAML yapılandırma dosyasında tanımlanır.

Katkıda Bulunanlar

Yorumlar