Ultralytics YOLO27:
Get Started

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 kutularla sınıfları tahmin eden bir başlık. Bu kılavuz, her aşamayı oluşturan modülleri ve YOLOv3'ten YOLO26'ya nasıl değiştiklerini açıklar; her bileşenin tanımını ultralytics/cfg/models/ altındaki yapılandırma dosyalarında ve ultralytics/nn/modules/ içindeki modül sınıflarında izler.

Her model, YAML dosyasında sıralı katman listesi olarak bildirimsel biçimde tanımlanır. Her katman [from, repeats, module, args] biçimini izler: katmanı 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, bu biçimi — repeats ve args öğelerinin varyantın derinlik ve genişlik çarpanlarına göre nasıl ölçeklendiği de dahil olmak üzere — ve modül çözümleme sisteminin tamamını açıklar. Bu kılavuz modüllerin kendilerine 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 farklı bir görevi olan üç ardışık aşamadan geçirir:

AşamaGörevÇıktı
OmurgaGirdi görüntüsünden birden fazla çözünürlükte özellikler çıkarır8, 16 ve 32 adım değerlerinde özellik haritaları (P3, P4 ve P5)
BoyunHem küçük hem de büyük nesnelerin bağlamı görebilmesi 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 puanlarını tahmin ederHer bağlantı noktası için algılamalar

Temel yapı taşı, conv.py içinde tanımlanan Conv bloğudur: sırasıyla uygulanan bir 2B evrişim, yığın normalizasyonu ve SiLU aktivasyonu. Aşağıdaki tüm büyük modüller, Conv bloklarının birleştirilmesiyle oluşturulur.

Mimari Diyagramları#

Her sürüm aynı backbone → neck → head iskeletini korur ve belirli aşamaları değiştirir. Aşağıdaki sekmeler, sürümlere göre yapıyı gösterir: backbone ve neck aşamaları ultralytics/cfg/models/ içindeki yapılandırmaları izlerken YOLOv3 ve YOLOv5 head'leri, paket yapılandırmalarında kullanılan anchor-free u-variant head yerine özgün anchor-based biçimleriyle çizilmiştir. Sekmeler arasında ilerleyerek her neslin neler eklediğini görebilirsin. Özetle gelişim şöyledir: YOLOv3, yalnızca FPN kullanan anchor-based bir dedektördür; YOLOv5, bottom-up PAN yolunu ve SPPF öğesini ekler; YOLOv8, anchor-free bir DFL head içeren C2f bloğuna geçer; YOLO11, C2PSA attention'ı ve C3k2 bloğunu ekler; YOLO26 ise SPPF residual'ını ekler, DFL'yi kaldırır ve isteğe bağlı, NMS gerektirmeyen bir head ekler.

YOLOv3 ve YOLOv5 diyagramlarında özgün çapa tabanlı başlık gösterilir. ultralytics paketi, çapa tabanlı olmayan YOLOv8'in Detect başlığıyla aynı Darknet-53 ve C3 omurgalarını kullanan çapasız YOLOv3u ve YOLOv5u yapılandırmalarını sunar. Bu yapılandırmalar Algılama Başlığı bölümünde açıklanmıştır.

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

Omurga, adım değeri 2 olan Conv alt örnekleme katmanları arasında yinelenen bir CSP (Aşamalar Arası Kısmi) bloğu istifler. Sürümler arasında en çok değişen, yinelenen bu bloktur. Aşağıdaki tüm bloklar block.py içinde bulunur; c1/c2 girdi/çıktı kanalları, c = 0.5 * c2 ise 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ı artık toplama. YOLOv3'ün Darknet-53 omurgası, CSP bölmesi olmadan bu birimleri doğrudan istifler ve üç ölçekte algılama yapar (adım değerleri 8, 16, 32).

C3 (YOLOv5)#

YOLOv5'in C3 bloğu, girdiyi iki 1x1 evrişimine ayırır: cv1, sıralı Bottleneck bloklarından oluşan n yolunu besler (çekirdekler sırasıyla (1, 1) ve (3, 3)); cv2 ise bu blokları atlar. İki yol birleştirilir ve üçüncü bir 1x1 Conv ile kaynaştırılır:

def forward(self, x):
    # C3: dar boğaz yolu m(cv1(x)), atlama yolu cv2(x) ile birleştirilir ve ardından cv3 ile kaynaştırılır
    return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

Yalnızca dar boğazın son çıktısı birleştirme evrişimine ulaşır; bu nedenle cv3 2 özellik haritası görür.

C2f (YOLOv8)#

YOLOv8'in C2f bloğu ("2 evrişimli CSP dar boğazı, daha hızlı"), hangi özelliklerin birleştirme evrişimine ulaştığını değiştirir:

  1. cv1 = Conv(c1, 2 * c, 1), ardından chunk(2) çıktıyı iki c kanallı tensöre ayırır.
  2. n Bottleneck(c, c) blokları (çekirdekler (3, 3), (3, 3)) sırayla çalışır ve her blok bir öncekinin çıktısıyla beslenir.
  3. Tüm n + 2 ara tensörleri birleştirilir ve cv2 = Conv((2 + n) * c, c2, 1) ile kaynaştırılır.

C3, birleştirme evrişimine 2 özellik haritası aktarırken C2f, n + 2 aktarır — her ara dar boğaz çıktısı yeniden kullanılır.

C3k2 (YOLO11 ve YOLO26)#

YOLO11 ve YOLO26, yinelenen birimi değiştiren C2f alt sınıfı C3k2 öğesini kullanır. Kurucu bayraklarına bağlı olarak n bloklarının her biri şu biçimlerden birine dönüşür:

  • yalın 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ığı sürece c3k değerini ayarlar; bu ölçekler değeri True olarak zorlar. Böylece tek bir yolo11.yaml tüm beş varyanta hizmet eder. Dolayısıyla [-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, varyantın genişlik çarpanıyla n konumunda 128'e ve x konumunda 768'e dönüşen ölçekleme öncesi kanal sayısıdır. CSP modüllerinde repeats alanı — burada varyantın derinlik çarpanıyla ölçeklenmeden önce 2 — ayrı modülleri istiflemek yerine bloğun dahili tekrar sayısını belirler.

Uzamsal Havuzlama: SPP → SPPF#

Omurganın sonunda, uzamsal piramit havuzlama bloğu alıcı alanı genişletir. YOLOv5, özgün çok çekirdekli SPP yerine SPPF (Hızlı Uzamsal Piramit Havuzlama) kullanır: tek bir MaxPool2d(kernel_size=5, stride=1, padding=2), art arda n = 3 kez uygulanır; girdi ve havuzlanmış üç çıktının tümü birleştirilip 1x1 Conv ile kaynaştırılır. Zincirlenmiş 5x5 havuzları daha büyük çekirdeklerin alıcı alanlarını kapsadığı için bu işlem SPP(k=(5, 9, 13)) ile matematiksel olarak eşdeğerdir, ancak daha düşük maliyetlidir.

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

Uzamsal Dikkat: C2PSA (YOLO11 ve sonrası)#

YOLO11, SPPF sonrasına C2PSA ekledi. Bu, etkin dalında n adet PSABlock (Konuma Duyarlı Dikkat) modülü istifleyen bir CSP bloğudur: cv1 = Conv(c1, 2 * c, 1) özellikleri ayırır, yarısı PSABlock yığınından geçer ve cv2 = Conv(2 * c, c1, 1) birleştirilmiş özellikleri kaynaştırır. Her PSABlock, çok başlı dikkat mekanizmasının ardından iki katmanlı bir ileri beslemeli ağ (Conv(c, 2 * c, 1) → Conv(2 * c, c, 1)) uygular; her ikisinde de artık bağlantı bulunur. YOLO26 aynı C3k2 + C2PSA omurgasını korur.

Boyun: FPN + PAN#

Boyun, omurganın P3/P4/P5 özellik haritalarını önce yukarıdan aşağıya bir Özellik Piramit Ağı (FPN), ardından aşağıdan yukarıya bir Yol Birleştirme Ağı (PAN) kullanarak 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 yeniden yukarı taşıyan, adım değeri 2 olan Conv + Concat öğeleridir:

# 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 neslinin 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ştirilmiş üç çıktı başlığı besler. YOLOv3 bunun istisnasıdır: boynunda yalnızca yukarıdan aşağıya FPN bulunur (YAML başlığında adım değeri 2 olan alt örnekleme yoktur); YOLOv5'in eklediği aşağıdan yukarıya PAN yolu bulunmaz.

Algılama Başlığı: Çapa Tabanlı → Çapasız → NMS'siz#

Başlık, birleştirilmiş üç özellik haritasını algılama görevi için tahminlere dönüştürür. Tasarımı sürümler boyunca çapa tabanlıdan çapasız yapıya, ardından NMS'siz yapıya değişmiştir.

Çapasız, ayrıştırılmış Detect#

Özgün 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 ortak bir dal. Bağımsız ultralytics/yolov3 ve ultralytics/yolov5 depoları bu çapa tabanlı tasarımı korur. Bunun yerine ana ultralytics paketi; aynı Darknet-53 ve C3 omurgalarını YOLOv8'in çapasız Detect başlığıyla kullanan, çapasız YOLOv3u ve YOLOv5u varyantlarını sunar. Burada belgelenen yolov3.yaml ve yolov5.yaml yapılandırmaları, tarihî tasarımı değil bu u varyantlarını ifade eder.

Detect başlığı (head.py) çapasız ve ayrıştırılmıştır: piramit düzeyi başına iki paralel dal çalıştırır ve çapa 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 derinlik ayrılabilir blok (DWConv + 1x1 Conv) → Conv2d(c3, nc, 1); YOLOv8'de eski varyant olan iki 3x3 Conv katmanı → Conv2d(c3, nc, 1) kullanılır.

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

Dağılımsal Odak Kaybı (DFL)#

YOLOv8 ve YOLO11, dört kutu koordinatının her birini tek bir skaler yerine reg_max = 16 kutu üzerinde bir dağılım olarak kestirir (Genelleştirilmiş Odak Kaybı içindeki integral biçimi). DFL modülü 4 * reg_max kutu kanalını (4, reg_max) biçimine yeniden şekillendirir, reg_max kutu üzerinde softmax uygular ve beklenen kutu indeksini alır. Tahmin edilen koordinat; her kutu indeksinin softmax olasılığıyla ağırlıklandırılıp ardından toplanmasıyla elde edilir. Bu işlem, ağırlıkları arange(reg_max) kutu indeksleri olan sabit bir 1x1 evrişimiyle uygulanır; böylece ağırlıklı toplam tek bir iç çarpım olur.

YOLO26: NMS'siz, DFL'siz#

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

  • end2end: True — Detect, dallarını bire bir başlığa (one2one_cv2/one2one_cv3) derin kopyalayarak nesne başına tek tahmin öğrenmesini sağlar. Bu YAML ayarı her iki eğitim başlığını da oluşturur; çalışma zamanında nms=False, bire bir başlığı seçer ve Maksimum Olmayan Bastırma (NMS) son işleme adımını kaldırır. Çıkarım ve dışa aktarma ayrıntıları için Uçtan Uca Algılama kılavuzuna bak.
  • reg_max: 1 — tek kutu olduğunda self.dfl, nn.Identity() ve no = nc + 4 hâline gelir; başlık koordinatları doğrudan kestirir ve dışa aktarılan ONNX grafiğinde DFL işlemi bulunmaz.

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

Sürümlere Göre Özet#

SürümOmurga bloğuUzamsal havuzlamaDikkatAlgılama başlığıDFL
YOLOv3Darknet-53 (Bottleneck)Temel yapılandırmada yokYokÖzgün: çapa tabanlı; u varyantı: çapasızhayır / evet (u)
YOLOv5C3 (CSP)SPPFYokÖzgün: çapa tabanlı; u varyantı: çapasızhayır / evet (u)
YOLOv8C2fSPPFYokÇapasız, ayrıştırılmışevet (reg_max=16)
YOLO11C3k2SPPFC2PSAÇapasız, ayrıştırılmışevet (reg_max=16)
YOLO26C3k2SPPF + atlama bağlantısıC2PSAÇapasız, çift başlıklı; isteğe bağlı olarak NMS'sizkaldırıldı (reg_max=1)

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

Mimariyi Kendin İncele#

model.info() yöntemi, katman, parametre ve FLOPs özetini yazdırır; ayrıştırılmış modül listesine model.model.model üzerinden ulaşabilirsin.

Bir YOLO modelinin mimarisini incele
from ultralytics import YOLO

# Önceden eğitilmiş bir modeli yükle
model = YOLO("yolo11n.pt")

# Yayımlanmış teknik özelliklerdeki sayılarla eşleşmesi için Conv + BatchNorm katmanlarını birleştir
model.fuse()

# Özeti yazdır: katmanlar, parametreler, gradyanlar, GFLOPs
model.info()

# Algılama başlığını incele (ağdaki son modül)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| DFL layer:", type(head.dfl).__name__)

Kod parçacığını üç nesil boyunca çalıştırmak, değişiklikleri sayısal olarak gösterir. Bunlar ultralytics paketinden alınan ve her model sayfasında yayımlanan parametre ve FLOPs sayılarıyla eşleşen, birleştirilmiş gerçek model çıktılarıdır:

ModelKatmanlarParametrelerGFLOPsreg_maxDFL katmanı
YOLOv8n723,151,9048.716DFL
YOLO11n1002,616,2486.516DFL
YOLO26n1202,408,9325.51Identity

YOLO26n, reg_max=1 ve bir Identity DFL katmanı bildirir. Tahmin ve doğrulama, varsayılan olarak NMS kullanan bire çok modunu kullanır; NMS'siz çıkarım için nms=False ayarını yap. Her iki başlık da eğitilir.

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

Parametre ve FLOPs değerleri, her Conv katmanını batch normalization katmanıyla birleştiren birleştirilmiş model (model.fuse()) için raporlanır. Bu değerler yayımlanan teknik özelliklerle uyumludur; yeni yüklenen bir kontrol noktası, birleştirme yapılmadan önce biraz daha yüksek sayılar bildirir.

Sonuç#

Sürümler boyunca YOLO mimarisi her seferinde bir aşama değişti: backbone, Darknet-53'ten C2PSA attention içeren CSP tabanlı C3, C2f ve C3k2 bloklarına geçti; neck, SPP SPPF olurken FPN + PAN yapısını korudu; head ise anchor-based yapıdan anchor-free yapıya, ardından isteğe bağlı NMS gerektirmeyen uçtan uca head içeren YOLO26'nın DFL içermeyen tasarımına geçti.

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

Sık Sorulan Sorular#

  • Bir YOLO modelinde, görüntüden 8, 16 ve 32 adım boyutlarında özellikler çı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 tüm Ultralytics YOLO modelleri bu üç aşamalı tasarımı izler.

  • C2f (YOLOv8), birleştirme evrişiminden önce tüm iç Bottleneck — n + 2 özellik haritalarının çıktılarını birleştiren bir CSP bloğudur; daha eski C3 ise yalnızca 2 tanesini iletir. C3k2 (YOLO11 ve YOLO26), C2f sınıfının bir alt sınıfıdır ve c3k bayrağı ayarlandığında her Bottleneck bloğunu bir C3k bloğuyla (C3 çeşidi 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 olan C2f yerine C3k2 kullanır, SPPF sonrasına C2PSA öz dikkat bloğu ekler ve başlığın sınıflandırma kolunu daha hafif, derinlemesine ayrılabilir evrişimlere geçirir. Her ikisi de reg_max=16 DFL regresyonuna sahip, aynı çapasız ve ayrık Detect başlığı kullanır; böylece algılama arayüzünü yeniden tasarlamak yerine parametre ve FLOPs sayılarını düşürürken doğruluğu artırır.

  • Modern Ultralytics YOLO modelleri çapasızdır. YOLOv8, YOLO11 ve YOLO26; kutu regresyonu ve sınıflandırma için ayrı kollara sahip, çapasız ve ayrık bir Detect başlığı kullanır. Orijinal YOLOv3 ve YOLOv5 çapa tabanlıydı ancak Ultralytics bunları, yapılandırmalarında YOLOv8 ile aynı çapasız başlığı kullanan YOLOv3u ve YOLOv5u varyantları olarak sunar.

  • Evet — YOLO26, nms=False ile NMS'siz çıkarımı destekleyen bire bir bir başlık içerir. Varsayılan bire çok çıkarım yolu NMS kullanır ve eğitim sırasında her iki başlık da denetim alır. Ayrıntılar için Uçtan Uca Algılama kılavuzuna bak.

  • DFL, her kutu koordinatını reg_max bölmesi (YOLOv8 ve YOLO11'de varsayılan olarak 16) üzerinde bir softmax dağılımı olarak regresyonla tahmin eder ve tek bir skaler tahmin etmek yerine koordinat olarak beklenen değeri 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 regresyonla tahmin eder ve dışa aktarılan ONNX veya TensorRT grafiklerinde DFL işlemi görünmez.

  • Modeli Python'da yükle ve katman, parametre ve GFLOPs özetini almak için model.info() işlevini çağır. Ayrıştırılan katmanlar model.model.model içindedir — örneğin model.model.model[-1], Detect başlığıdır ve reg_max ile dfl gibi öznitelikleri sunar. Mimarinin tamamı modelin YAML yapılandırma dosyasında tanımlıdır.

Katkıda Bulunanlar

Yorumlar