Detection Head
Algılama başlığı, bir nesne algılayıcının son bölümüdür; omurga ve boyun özelliklerini her ızgara konumunda kutu ve sınıf puanlarına dönüştürür.
Bir algılama başlığı, bir nesne algılama ağının son katman grubudur. Önceki katmanların ürettiği özellik haritalarını okur ve her aday konumda bir sınırlayıcı kutu ile her sınıf için bir skor üretir. Tasarımı; kutuların, çapa kutularına göre ofsetler olarak mı yoksa bir noktaya olan uzaklıklar olarak mı kodlanacağını, modelin kaç aday kutu üreteceğini ve maksimum olmayanların bastırılması (NMS) gibi bir son işleme adımının yinelenen kutuları kaldırmasının gerekip gerekmediğini belirler.
Başlığın Yeri#
Modern algılayıcılar üç aşamadan oluşur. Genellikle bir evrişimli ağ veya görüntü Transformer'ı olan omurga, derinlik arttıkça çözünürlüğü düşen ve anlamsal içeriği artan özellik haritalarına dönüştürür. Özellik piramit ağı (FPN) gibi bir boyun, derin ve sığ haritaları birleştirerek her çıktı ölçeğinin hem ince ayrıntıları hem de bağlamı taşımasını sağlar. Ardından başlık, genellikle 8, 16 ve 32 adımlı tüm piramit düzeylerinde küçük evrişim dalları çalıştırır; böylece ince haritalar küçük nesneleri, kaba haritalar ise büyük nesneleri bulur.
Tek aşamalı algılayıcıların her ızgara hücresinde tahmin yapan tek, yoğun bir başlığı vardır. Faster R-CNN gibi iki aşamalı algılayıcıların ise iki başlığı bulunur: her konumdaki çapaları puanlayan bir bölge öneri ağı ve ardından önerilen birkaç yüz bölgeyi sınıflandırıp iyileştiren bir ilgi bölgesi başlığı.
Başlık Kutuları ve Sınıfları Nasıl Tahmin Eder#
Yoğun bir başlık, her ızgara hücresinde üç tür değer tahmin eder:
- Sınıf puanları: Her sınıf için bir puan üretilir ve her konumun her sınıfa ayrı ayrı puan verebilmesi için puanların her birine sigmoid uygulanır.
- Kutu regresyonu: Bir kutuyu konumlandıran dört sayı. Bunlar, çapa kutusunu kaydırıp yeniden boyutlandıran ofsetler veya hücrenin merkezinden kutunun dört kenarına olan uzaklıklar olabilir.
- Kalite ve görev çıktıları: Kutuları sıralayan bir nesne olma puanı (YOLOv1'den YOLOv5'e kadar) veya merkezilik puanı (FCOS) ve örnek bölütleme için maske katsayıları ya da poz tahmini için anahtar noktalar gibi göreve özgü değerler.
Kutu kodlaması, çapa tabanlı algılayıcıları çapasız algılayıcılardan ayırır. Her dal, tahmin edilen değer başına bir çıktı kanalı olan 1 × 1 evrişimle biten birkaç evrişim katmanından oluşur. RetinaNet ve FCOS, sınıflandırma ve regresyon için ayrı dalları zaten kullanıyordu; YOLOX ise 2021'de bu ayrık başlığı YOLO'ya taşıdı ve YOLOv3'ün tek paylaşımlı çıktı katmanına kıyasla çok daha hızlı eğitim yakınsaması bildirdi. Aşağıdaki şema, 640 × 640 görüntünün üç piramit düzeyi için bu son 1 × 1 katmanları oluşturur ve çıktılarını tek bir aday listesinde birleştirir:
import torch
from torch import nn
# Neck outputs for a 640x640 image at strides 8, 16, and 32 (80x80, 40x40, and 20x20 grids)
channels = (64, 128, 256)
features = [torch.randn(1, c, 640 // s, 640 // s) for c, s in zip(channels, (8, 16, 32))]
# Decoupled head: a box branch (4 values) and a class branch (80 scores) for every pyramid level
box_branches = nn.ModuleList(nn.Conv2d(c, 4, 1) for c in channels)
cls_branches = nn.ModuleList(nn.Conv2d(c, 80, 1) for c in channels)
# Flatten each level's grid and concatenate, giving one candidate per grid cell
boxes = torch.cat([branch(f).flatten(2) for branch, f in zip(box_branches, features)], dim=2)
scores = torch.cat([branch(f).flatten(2) for branch, f in zip(cls_branches, features)], dim=2).sigmoid()
print(f"boxes {tuple(boxes.shape)}, class scores {tuple(scores.shape)}")Kod boxes (1, 4, 8400), class scores (1, 80, 8400) değerini yazdırır: 6,400 + 1,600 + 400 ızgara hücresinin her biri, 80 sınıf puanıyla birlikte bir kutu önerir.
Ham Çıktılardan Algılamalara#
Eğitim, her nesnenin kaç tahmin alacağını belirler. Bire-çok atama, her nesnenin yakınındaki birkaç hücreyi pozitif olarak işaretler; bu, başlığa daha fazla eğitim sinyali verir ve çıkarım sırasında her nesne için birbiriyle örtüşen birkaç kutu bırakır; bu nedenle NMS en iyisini tutar. DETR ve YOLOv10'un çıkarım başlığında kullanılan bire-bir atama ise nesne başına tam olarak bir tahmin eğitir; böylece çıktılarda NMS gerekmez.
YOLO26 başlığı dört kenar uzaklığını doğrudan tahmin eder ve YOLOv8 ile YOLO11'in kullandığı, kenar başına 16 bölmeli Dağılım Odaklı Kayıp çıktısını kaldırır. Ayrıca kutu ve sınıf dallarının bire-çok ve bire-bir kopyalarını eğitir. YOLO26, varsayılan olarak bire-çok çıktılara NMS uygular; nms=False parametresini iletmek bire-bir dallara geçiş yapar. Bu dallar, görüntü başına en fazla 300 kutu döndürür ve NMS adımı uygulamaz.
Uygulamada Başlık Tasarımı#
- Yeni sınıflara ince ayar: Sınıf dalı, her sınıf için bir çıktı kanalıyla biter. Bu nedenle farklı sayıda sınıfa sahip bir veri kümesinde eğitim yapmak yeni bir son sınıflandırma katmanı gerektirirken, önceden eğitilmiş omurga ve boyun ağırlıkları kullanılmaya devam eder.
- Dağıtım: Başlıktaki her işlem hedef cihazda çalışır; bu nedenle basit kutu kod çözme ve NMS gerektirmeyen çıktılar dışa aktarmayı kolaylaştırır ve son işleme süresini kısaltır.
- Küçük nesneler: 4 adımlı bir piramit düzeyi eklemek, ek hesaplama maliyeti karşılığında başlığa küçük nesneler için daha ince bir ızgara sağlar: 640 × 640 girdi için 160 × 160 = 25,600 hücre ekler; bu, 8 adımlı düzeydekinin dört katıdır.










