YOLO Mimarisi Açıklandı: YOLOv3'ten YOLO26'ya#
Her Ultralytics YOLO modeli üç aşamadan oluşur: özellik çıkaran bir backbone (omurga), bunları ölçekler arasında birleştiren bir neck (boyun) ve kutular ile sınıfları tahmin eden bir head (başlık). Bu kılavuz, her aşamayı oluşturan modülleri ve bunların YOLOv3 sürümünden YOLO26 sürümüne nasıl değiştiğini belgeliyor; 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 takip ediyor.
Her model, bir YAML dosyasında sıralı bir katman listesi olarak bildiritsel şekilde tanımlanır; burada her katman [from, repeats, module, args] formatını takip eder: hangi katman(lar)ın beslediği, modülün kaç kez tekrar ettiği, katman sınıfı (Conv, C3k2, SPPF, Detect, …) ve kurucu (constructor) argümanları. Model YAML Yapılandırma Kılavuzu — repeats ve args değerlerinin varyantın derinlik ve genişlik çarpanlarıyla nasıl ölçeklendiği dahil olmak üzere — bu formatı ve modül çözümleme sistemini bütün ayrıntılarıyla belgeler. Bu kılavuz, modüllerin kendisine ve sürümler arasında nasıl değiştiklerine odaklanır.
Üç Aşama#
Her Ultralytics YOLO modeli, görüntüyü her birinin kendine özgü bir görevi olan üç sıralı aşamadan geçirir:
| Aşama | Görev | Çıktı |
|---|---|---|
| Backbone | Girdi görüntüsünden birden fazla çözünürlükte özellikler çıkar | 8, 16 ve 32 adımlarda (stride) özellik haritaları (P3, P4, P5) |
| Neck | Hem küçük hem de büyük nesnelerin bağlama sahip olması için özellikleri ölçekler arasında birleştir | Çok ölçekli birleştirilmiş özellik haritaları |
| Head | Birleştirilmiş özelliklerden sınırlayıcı kutuları (bounding box) ve sınıf skorlarını tahmin et | Çapa (anchor) noktası başına tespitler |
Temel birim, sıralı olarak uygulanan bir 2D evrişim, batch normalization ve bir SiLU aktivasyonundan oluşan Conv bloğudur (conv.py içinde tanımlanmıştır). Aşağıdaki her bir daha büyük modül, Conv bloklarının bir araya getirilmesiyle oluşturulmuştur.
Mimari Diyagramları#
Her versiyon aynı omurga → boyun → baş iskeletini korur ve belirli aşamaları değiştirir. Aşağıdaki sekmeler versiyona özel yapıyı göstermektedir: omurga ve boyun aşamaları ultralytics/cfg/models/ içindeki yapılandırmaları takip ederken, YOLOv3 ve YOLOv5 başlıkları, paket yapılandırmalarının gerçekten gönderdiği çapasız u varyantı başlık yerine orijinal çapa tabanlı biçimlerinde çizilmiştir. Sekmeler arasında ilerlemek, her neslin ne eklediğini gösterir. Kısacası ilerleme şöyledir: YOLOv3 yalnızca FPN içeren, çapa tabanlı bir dedektördür; YOLOv5 alttan üste PAN yolunu ve SPPF'yi ekler; YOLOv8, çapasız bir DFL başlığına sahip C2f bloğuna geçer; YOLO11, C2PSA dikkat mekanizmasını ve C3k2 bloğunu ekler; YOLO26 ise bir SPPF kalıntısı ekler ve başlığı NMS'siz ve DFL'siz hale getirir. Düğüm renkleri dokümantasyon şeması kuralını takip eder: yeşil girdi, mavi omurga, koyu gri uzamsal havuzlama ve dikkat, turuncu boyun, mor baş 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:#fffYOLOv3 ve YOLOv5 şemaları orijinal çapa tabanlı başlığı gösterir. ultralytics paketi, çapasız YOLOv3u ve YOLOv5u yapılandırmalarını — Detection Head altında açıklanan, YOLOv8'in Detect başlığına sahip aynı Darknet-53 ve C3 omurgalarını — gönderir.
Backbone Blokları: Bottleneck → C3 → C2f → C3k2#
Backbone, adım-2 (stride-2) Conv örnekleme (downsampling) katmanları arasına tekrar eden bir CSP (Cross-Stage Partial) bloğu yığılır. Sürümler arasında en çok değişen şey bu tekrar eden bloaktır. Aşağıdaki tüm bloklar block.py içinde yer alır; c1/c2 girdi/çıktı kanallarıdır ve c = 0.5 * c2 gizli genişliktir.
Bottleneck (YOLOv3)#
Temel birim Bottleneck'dır: shortcut=True ve c1 == c2 olduğunda isteğe bağlı bir kalıntı toplama özelliğine sahip iki Conv katmanı (varsayılan çekirdekler (3, 3)). YOLOv3'ün Darknet-53 omurgası, CSP bölünmesi olmadan bunları doğrudan üst üste bindirir ve üç ölçekte (8, 16, 32 adımlar) algılama yapar.
C3 (YOLOv5)#
YOLOv5 modelinin C3 bileşeni girdiyi iki 1x1 evrişimi arasında böler: cv1, n ardışık Bottleneck bloğunu besler (önce (1, 1) sonra (3, 3) çekirdekleri), cv2 ise bunları atlar. İki yol birleştirilir ve üçüncü bir 1x1 Conv tarafından harmanlanır:
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))Birleştirme evrişimine yalnızca nihai darboğaz (bottleneck) çıktısı ulaşır, bu nedenle cv3 2 özellik haritası görür.
C2f (YOLOv8)#
YOLOv8 modelinin C2f bileşeni ("2 evrişimli CSP Darboğazı, daha hızlı"), birleştirme evrişimine hangi özelliklerin ulaştığını değiştirir:
cv1 = Conv(c1, 2 * c, 1)ve ardındanchunk(2)çıktıyı ikickanallı tensöre böler.nBottleneck(c, c)blokları ((3, 3),(3, 3)çekirdekleri), her biri bir önceki bloğun çıktısıyla beslenerek sırayla çalışır.- Tüm
n + 2ara tensörleri birleştirilir vecv2 = Conv((2 + n) * c, c2, 1)tarafından harmanlanır.
C3 birleştirme evrişimine 2 özellik haritası aktarırken, C2f n + 2 aktarır; ara darboğaz çıktıların her biri yeniden kullanılır.
C3k2 (YOLO11 ve YOLO26)#
YOLO11 ve YOLO26, tekrarlayan birimi değiştiren bir C2f alt sınıfı olan C3k2'yi kullanır. n bloklarının her biri, oluşturucu bayraklarına bağlı olarak şunlara dönüşür:
- düz bir
Bottleneck(varsayılan,c3k=False), - bir
C3kbloğu (c3k=True) — yapılandırılabilir bir çekirdek boyutuna sahip birC3varyantı veya - bir
Bottleneck+PSABlockçifti (attn=True).
İkinci YAML argümanı c3k'ı ayarlar; örneğin [-1, 2, C3k2, [512, True]], dahili blokları C3k olan (c3k=True nedeniyle) 512 çıkış kanalında bir C3k2 modülü oluşturur. CSP modülleri için, ayrı modülleri üst üste bindirmek yerine, repeats alanı — burada 2, varyantın derinlik çarpanı ile ölçeklenmeden önce — bloğun dahili tekrar sayısı haline gelir.
Uzamsal Havuzlama: SPP → SPPF#
Omurganın sonunda, uzamsal piramit havuzlama bloğu alıcı alanı genişletir. YOLOv5, orijinal çok çekirdekli SPP'ın yerini SPPF (Spatial Pyramid Pooling - Fast) ile değiştirdi: girdi ve havuzlanmış üç çıktının tümü birleştirilerek bir 1x1 Conv tarafından birleştirilen ve eritilen, arka arkaya n = 3 kez uygulanan tek bir MaxPool2d(kernel_size=5, stride=1, padding=2). Bu matematiksel olarak SPP(k=(5, 9, 13)) ile eşdeğerdir ancak daha ucuzdur, çünkü zincirlenmiş 5x5 havuzları 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 bir kalıntı bağlantısı (return y + x) ekler.
Uzamsal Dikkat: C2PSA (YOLO11+)#
YOLO11, SPPF sonrasında C2PSA'i ekledi. Bu, aktif dalı bir n PSABlock (Konum Duyarlı Dikkat) modülleri yığını olan bir CSP bloğudur: cv1 = Conv(c1, 2 * c, 1) özellikleri böler, bir yarısı PSABlock yığınından geçer ve cv2 = Conv(2 * c, c1, 1) birleştirmeyi kaynaştırır. Her PSABlock, çok başlı dikkat mekanizmasını ve ardından her biri kalıntı bağlantısına sahip iki katmanlı bir ileri beslemeli ağı (Conv(c, 2 * c, 1) → Conv(2 * c, c, 1)) uygular. YOLO26 aynı C3k2 + C2PSA omurgasını korur.
Neck: FPN + PAN#
Neck, backbone'un P3/P4/P5 özellik haritalarını, yukarıdan aşağıya bir Özellik Piramit Ağı (FPN) ve ardından alttan üste bir Yol Birleştirme Ağı (PAN) ile birleştirir. YAML head bölümünde FPN, nn.Upsample + Concat (anlamsal bilgiyi daha yüksek çözünürlüklere aşağı taşır) ve PAN ise adım-2 Conv + Concat (yerelleştirme bilgisini yukarı geri taşır) birleşimidir:
# 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]] # 19Neck, kendi neslinin backbone bloğunu yeniden kullanır — YOLOv5'te C3, YOLOv8'de C2f, YOLO11 ve YOLO26'da C3k2 — böylece her birleştirme noktası backbone'un kullandığı aynı modülü çalıştırır. Birleştirilen üç çıktı head'i besler. YOLOv3 bir istisnadır: neck'i yalnızca yukarıdan aşağıya FPN'dir (YAML head'inde adım-2 downsampling yoktur) ve YOLOv5'in tanıttığı alttan üste PAN yolu bulunmaz.
Tespit Başı: Çapa Tabanlı → Çapasız → NMS-free#
Head, birleştirilen üç özellik haritasını algılama görevi (detection task) için tahminlere dönüştürür. Tasarımı, anchor tabanlıdan anchor'sız (çapasız) ve NMS'size kadar sürümler boyunca değişmiştir.
Anchor'sız, ayrıştırılmış (decoupled) Detect#
Orijinal YOLOv3 ve YOLOv5, çapa tabanlı, birleştirilmiş bir başlık kullandı: önceden tanımlanmış çapa kutuları ve kutu ile sınıf tahminleri için paylaşılan bir dal. Bağımsız ultralytics/yolov3 ve ultralytics/yolov5 depoları bu çapa tabanlı tasarımı korur. Ana ultralytics paketi bunun yerine çapasız YOLOv3u ve YOLOv5u varyantlarını — YOLOv8'in çapasız Detect başlığına sahip aynı Darknet-53 ve C3 omurgalarını — gönderir ve burada belgelenen yolov3.yaml ve yolov5.yaml yapılandırmaları, tarihi tasarım değil, bu u varyantlarıdır.
Detect head'i (head.py) anchor'sız ve ayrıştırılmıştır: her piramit seviyesinde iki paralel kol çalıştırır ve anchor kutularına karşı değil, doğrudan ızgara (grid) noktaları üzerinde tahmin yapar.
- Kutu kolu (
cv2):Conv(x, c2, 3)→Conv(c2, c2, 3)→Conv2d(c2, 4 * reg_max, 1). - Sınıf kolu (
cv3): YOLO11 ve YOLO26'da iki derinlemesine ayrılabilir blok (DWConv+1x1 Conv) →Conv2d(c3, nc, 1); YOLOv8 eski varyantı kullanır, iki3x3 Convkatmanı →Conv2d(c3, nc, 1).
Bu nedenle her anchor noktası no = nc + 4 * reg_max çıktısı üretir. Önceden tanımlanmış anchor'ların kaldırılması, ayarlanması gereken hiper parametrelerden anchor kutusu boyutlarını ve en-boy oranlarını (aspect ratios) çıkarır.
Dağılımsal Odak Kaybı (DFL)#
YOLOv8 ve YOLO11, 4 kutu koordinatının her birini tek bir skaler yerine reg_max = 16 kutuları üzerinde bir dağılım olarak regresyona tabi tutar (Generalized Focal Loss içindeki integral formu). DFL modülü, 4 * reg_max kutu kanallarını (4, reg_max) olarak yeniden şekillendirir, reg_max kutuları üzerine bir softmax uygular ve tahmin edilen koordinat olarak beklenen kutu indeksini — her kutu indeksi softmax olasılığıyla ağırlıklandırılır, ardından toplanır — alır. Bu, ağırlıkların kutu indeksleri arange(reg_max) olduğu sabit bir 1x1 evrişimi olarak uygulanır, böylece ağırlıklı toplam tek bir nokta çarpımı olur.
YOLO26: NMS-free, DFL-free#
YOLO26 head'in doğrudan okuduğu iki YAML parametresi ayarlar:
end2end: True—Detect, Non-Maximum Suppression (NMS) son işleme adımını kaldıran, nesne başına tek bir tahmin üreten bire bir başlığa (one2one_cv2/one2one_cv3) dallarını derinlemesine kopyalar. Dışa aktarma ve geçiş ayrıntıları için End-to-End Detection guide kılavuzuna bakın.reg_max: 1— tek bir kutu ileself.dfl,nn.Identity()veno = nc + 4haline gelir; head koordinatları doğrudan regresyona sokar ve dışa aktarılan ONNX grafiğinde hiçbir DFL işlemi görünmez.
Beş model boyutu (n/s/m/l/x) genelinde YOLO26, YOLO26 paper belgesinde bildirildiği üzere 1.7-11.8 ms T4 TensorRT gecikmesinde COCO üzerinde 40.9-57.5 mAP'ye ulaşır.
Sürüm Bazında Özet#
| Sürüm | Backbone bloğu | Uzamsal havuzlama | Dikkat | Tespit başı | DFL |
|---|---|---|---|---|---|
| YOLOv3 | Darknet-53 (Bottleneck) | temel yapılandırmada yok | yok | Orijinal: anchor tabanlı; u varyantı: anchor'sız | yok / var (u) |
| YOLOv5 | C3 (CSP) | SPPF | yok | Orijinal: anchor tabanlı; u varyantı: anchor'sız | yok / var (u) |
| YOLOv8 | C2f | SPPF | yok | Çapasız, ayrıştırılmış | var (reg_max=16) |
| YOLO11 | C3k2 | SPPF | C2PSA | Çapasız, ayrıştırılmış | var (reg_max=16) |
| YOLO26 | C3k2 | SPPF + kısayol (shortcut) | C2PSA | Anchor'sız, NMS'siz (end2end) | kaldırıldı (reg_max=1) |
Model ayrıntıları, performans tabloları ve kullanım örnekleri için YOLOv3, YOLOv5, YOLOv8, YOLO11 ve YOLO26 için ayrı sayfalara bakın.
Mimarisi Kendin İncele#
model.info() yöntemi bir katman, parametre ve FLOPs özeti yazdırır ve ayrıştırılmış modül listesi model.model.model üzerinde kullanılabilir.
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)Kod parçasını üç nesil boyunca çalıştırmak değişiklikleri sayısal olarak gösterir. Bunlar, her model page sayfasında yayınlanan parametre ve FLOP sayılarıyla eşleşen, ultralytics paketinden gerçek birleştirilmiş model çıktılarıdır:
| Model | Katmanlar | Parametreler | GFLOPs | reg_max | end2end | DFL katmanı |
|---|---|---|---|---|---|---|
| YOLOv8n | 72 | 3,151,904 | 8.7 | 16 | False | DFL |
| YOLO11n | 100 | 2,616,248 | 6.5 | 16 | False | DFL |
| YOLO26n | 122 | 2,408,932 | 5.4 | 1 | True | Identity |
YOLO26n; reg_max=1, end2end=True ve bir Identity DFL katmanı bildirir — bu, NMS'siz, DFL'siz head'inin mimari imzasıdır.
Parametre ve FLOP değerleri, her bir Conv ile batch normalization katmanını birleştiren birleştirilmiş model (model.fuse()) için bildirilir. Bu, yayınlanan özelliklerle eşleşir; yeni yüklenen bir kontrol noktası, birleştirmeden önce biraz daha yüksek sayılar bildirir.
Sonuç#
Sürümler arasında YOLO mimarisi bir seferde bir aşama değişti: omurga Darknet-53'ten C2PSA dikkat mekanizmasına sahip CSP tabanlı C3, C2f ve C3k2 bloklarına taşındı; boyun FPN + PAN yapısını korurken SPP, SPPF haline geldi; başlık ise çapa tabanlıdan çapasızlığa, ardından YOLO26'nın NMS'siz, DFL'siz uçtan uca tasarımına geçiş yaptı.
Özel mimariler tanımlamak için Model YAML Yapılandırma Kılavuzuna bakın veya model sayfalarındaki modelleri karşılaştırın. Sorularınız için GitHub veya Discord üzerinden ulaşın.
SSS#
Bir YOLO modeli; görüntüden 8, 16 ve 32 adımlarında özellikler çıkaran bir backbone (omurga), bu özellikleri FPN ve PAN ile ölçekler genelinde birleştiren bir neck (boyun) ve bounding box'ları (sınırlayıcı kutular) ve sınıf skorlarını tahmin eden bir head (baş) kısmına sahiptir. YOLOv3'ten YOLO26'ya kadar her Ultralytics YOLO modeli bu üç aşamalı tasarımı izler.
C2f(YOLOv8), birleştirme evrişiminden önce her bir dahiliBottleneck'in çıktıklarını —n + 2özellik haritalarını — birleştiren bir CSP bloğudur, eskiC3ise yalnızca 2 tane geçirir.C3k2(YOLO11 ve YOLO26),c3kbayrağı ayarlandığında her birBottleneck'nın yerini birC3kbloğu (yapılandırılabilir çekirdek boyutuna sahip birC3varyantı) ile alabilen birC2falt sınıfıdır. Her ikisi deblock.pyiçinde tanımlanmıştır.YOLO11, YOLOv8'de üç yapısal değişiklik yapar:
C2fomurga ve boyun bloğunuC3k2ile değiştirir,SPPFsonrasına birC2PSAöz-dikkat bloğu ekler ve başlığın sınıflandırma dalını daha hafif derinlemesine ayrılabilir evrişimlere dönüştürür. Her ikisi de aynı çapasız, ayrıştırılmışDetectbaşlığınıreg_max=16DFL regresyonuyla korur, böylece değişiklikler algılama arayüzünü yeniden tasarlamak yerine doğruluğu artırırken parametre ve FLOP sayılarını düşürür.Modern Ultralytics YOLO modelleri anchor'sızdır. YOLOv8, YOLO11 ve YOLO26; kutu regresyonu ve sınıflandırma için ayrı kollara sahip, anchor'sız ve ayrıştırılmış bir
Detecthead kullanır. Orijinal YOLOv3 ve YOLOv5 anchor tabanlıydı, ancak Ultralytics bunları yapılandırmaları YOLOv8 ile aynı anchor'sız head'i kullanan YOLOv3u ve YOLOv5u varyantları olarak sunar.Evet — YOLO26,
end2end=True'i ayarlar; bu daDetect'ye nesne başına tek bir tahmin üreten ve önceki modellerin gerektirdiği Non-Maximum Suppression son işleme adımını kaldıran bire bir başlık sağlar. Ayrıntılar için End-to-End Detection guide kılavuzuna bakın.DFL, her kutu koordinatını tek bir skaler tahmin etmek yerine
reg_maxkutuları (YOLOv8 ve YOLO11'de varsayılan olarak 16) üzerinde bir softmax dağılımı olarak regresyona sokar ve beklenen değeri koordinat olarak alır. YOLO26,reg_max=1değerini ayarlar, böylece DFL katmanı bir özdeşlik (identity) işlemine dönüşür, head koordinatları doğrudan regresyona sokar ve dışa aktarılan ONNX veya TensorRT grafiklerinde hiçbir DFL işlemi görünmez.Modeli Python'da yükleyin ve katman, parametre ve GFLOP özeti için
model.info()'ı çağırın. Ayrıştırılmış katmanlarmodel.model.modeliçindedir — örneğinmodel.model.model[-1],reg_maxveend2endgibi öznitelikleri açığa çıkaranDetectbaşlığıdır. Tam mimari, modelin YAML configuration file dosyasında tanımlanmıştır.