Nesne tespitine giriş
Önkoşul:Transfer öğrenme
Kanca
30-33. derste gördüğümüz CNN’ler hep AYNI soruyu cevapladı: “bu görüntüde NE var?” (sınıflandırma). Nesne tespiti, bir adım öteye geçip İKİNCİ bir soru ekliyor: “NEREDE?”
Sezgi
Nesne tespiti, bir görüntüdeki her nesne için hem bir ETİKET hem de bir KONUM (sınırlayıcı kutu) üretir. Bu, sınıflandırmadan iki kat daha zor bir problem — artık sadece “ne” değil, “kaç tane” ve “nerede” sorularına da cevap vermek gerekiyor.
Mekanizma
Önce terminolojiyi netleştirelim:
Sınıflandırma vs tespit
# 30. derste gördüğümüz CNN, bir görüntüye TEK bir etiket veriyordu ("bu bir X'tir").
# Nesne tespiti (object detection) İKİ soruya birden cevap verir: NE var, ve NEREDE?
print("Sınıflandırma çıktısı: 'kedi' (tek bir etiket)")
print("Nesne tespiti çıktısı: 'kedi', kutu=(x1=34, y1=12, x2=98, y2=87) (etiket + KONUM)")
print("\nKonum, genelde bir 'sınırlayıcı kutu' (bounding box) ile ifade edilir: (x1,y1) sol-üst köşe, (x2,y2) sağ-alt köşe.")Sınıflandırma çıktısı: 'kedi' (tek bir etiket)
Nesne tespiti çıktısı: 'kedi', kutu=(x1=34, y1=12, x2=98, y2=87) (etiket + KONUM)
Konum, genelde bir 'sınırlayıcı kutu' (bounding box) ile ifade edilir: (x1,y1) sol-üst köşe, (x2,y2) sağ-alt köşe.Bir modelin tahmin ettiği kutu, GERÇEK (doğru) kutuyla ne kadar örtüşüyor? Bunu ölçmek için IoU (Intersection over Union) kullanılır:
IoU: örtüşme oranı
# İki kutunun NE KADAR örtüştüğünü ölçmek için IoU (Intersection over Union) kullanılır.
def iou_hesapla(kutu1, kutu2):
x1 = max(kutu1[0], kutu2[0])
y1 = max(kutu1[1], kutu2[1])
x2 = min(kutu1[2], kutu2[2])
y2 = min(kutu1[3], kutu2[3])
kesisim = max(0, x2 - x1) * max(0, y2 - y1)
alan1 = (kutu1[2] - kutu1[0]) * (kutu1[3] - kutu1[1])
alan2 = (kutu2[2] - kutu2[0]) * (kutu2[3] - kutu2[1])
birlesim = alan1 + alan2 - kesisim
return kesisim / birlesim
kutu_a = (10, 10, 50, 50)
kutu_b = (20, 20, 60, 60) # kısmi örtüşme
kutu_c = (10, 10, 50, 50) # A ile birebir aynı
kutu_d = (100, 100, 140, 140) # hiç örtüşme yok
print(f"\nIoU(A, B) [kısmi örtüşme]: {iou_hesapla(kutu_a, kutu_b):.3f}")
print(f"IoU(A, C) [birebir aynı kutu]: {iou_hesapla(kutu_a, kutu_c):.3f}")
print(f"IoU(A, D) [hiç örtüşme yok]: {iou_hesapla(kutu_a, kutu_d):.3f}")
print("\nIoU her zaman [0,1] arasında: 0=hiç örtüşme, 1=birebir aynı kutu. Modelin tahmini kutusu ile")
print("gerçek (doğru) kutu arasındaki IoU, tespitin ne kadar İYİ olduğunu ölçmenin standart yoludur.")
IoU(A, B) [kısmi örtüşme]: 0.391
IoU(A, C) [birebir aynı kutu]: 1.000
IoU(A, D) [hiç örtüşme yok]: 0.000
IoU her zaman [0,1] arasında: 0=hiç örtüşme, 1=birebir aynı kutu. Modelin tahmini kutusu ile
gerçek (doğru) kutu arasındaki IoU, tespitin ne kadar İYİ olduğunu ölçmenin standart yoludur.Şimdi gerçek bir sorunu ele alalım: bir dedektör, AYNI nesne için genelde BİRDEN FAZLA, üst üste binen kutu önerir.
Non-Max Suppression (NMS)
# Gerçek bir dedektör, AYNI nesne için genelde BİRDEN FAZLA (üst üste binen) kutu önerir.
# Non-Max Suppression (NMS), bunları TEK bir kutuya indirger.
kutular = [
(10, 10, 50, 50, 0.95), # aynı nesne, en yüksek güven
(12, 11, 52, 49, 0.88), # aynı nesne, biraz kaymış
(15, 14, 55, 53, 0.75), # yine aynı nesne
(100, 100, 140, 140, 0.90), # TAMAMEN farklı bir nesne
]
def nms_uygula(kutular, esik=0.5):
kutular = sorted(kutular, key=lambda k: k[4], reverse=True) # güvene göre sırala
tutulan = []
while kutular:
en_iyi = kutular.pop(0)
tutulan.append(en_iyi)
# en_iyi ile ÇOK örtüşen (IoU > eşik) diğer kutuları AT -- muhtemelen aynı nesne
kutular = [k for k in kutular if iou_hesapla(en_iyi[:4], k[:4]) < esik]
return tutulan
print(f"\nNMS öncesi kutu sayısı: {len(kutular)}")
sonuc = nms_uygula(kutular)
print(f"NMS sonrası kutu sayısı: {len(sonuc)}")
for k in sonuc:
print(f" Tutulan: konum=({k[0]},{k[1]},{k[2]},{k[3]}), güven={k[4]}")
print("\n4 aday kutudan 3'ü AYNI nesneyi işaret ediyordu (yüksek IoU) -- NMS bunları TEK kutuya indirdi.")
NMS öncesi kutu sayısı: 4
NMS sonrası kutu sayısı: 2
Tutulan: konum=(10,10,50,50), güven=0.95
Tutulan: konum=(100,100,140,140), güven=0.9
4 aday kutudan 3'ü AYNI nesneyi işaret ediyordu (yüksek IoU) -- NMS bunları TEK kutuya indirdi.4 aday kutudan 3’ü AYNI nesneyi işaret ediyordu (birbirleriyle IoU > 0.5). Çoğu kişi “model 3 farklı nesne buldu” sanır. Yanlış, çünkü bu 3 kutu, aynı nesnenin sadece HAFİF farklı tahminleridir — NMS bunları TEK bir kutuya (en yüksek güvenli olana) indirger.
Matematik
IoU ve Non-Max Suppression
| Sembol | Anlamı |
|---|---|
| İki kutunun kesişim alanı | |
| İki kutunun birleşim alanı (kesişim ÇİFT sayılmadan) | |
| (tau) | NMS eşiği — genelde 0.5; bu değerin ÜZERİNDEKİ örtüşmeler “aynı nesne” sayılır |
IoU=1: kutular birebir aynı. IoU=0: hiç örtüşme yok. NMS, en yüksek güvenli kutuyu tutup onunla ÇOK örtüşen (yüksek IoU’lu) diğer kutuları eler.
Kod
Nerede işe yarar
Nesne tespiti, CNN tabanlı görme sistemlerinin en pratik uygulamalarından biridir:
- İki ana yaklaşım ailesi vardır: iki-aşamalı dedektörler (önce “burada bir nesne olabilir” bölgeleri öner, sonra sınıflandır — örn. Faster R-CNN) ve tek-aşamalı dedektörler (doğrudan kutu+sınıfı birlikte tahmin et — örn. YOLO, SSD).
- Tek-aşamalı dedektörler genelde DAHA HIZLI, iki-aşamalılar genelde DAHA DOĞRUDUR — hız/doğruluk dengesi, uygulamaya göre seçilir.
- 30-33. derste gördüğümüz TÜM bileşenler (CNN, transfer öğrenme) bir dedektörün “omurgasını” (backbone) oluşturur — nesne tespiti, bu omurgaya bir “kutu tahmin” katmanı ekler.
Bu 3 hatayı yaparsın:
- IoU eşiğini (τ) çok DÜŞÜK seçip yakın ama FARKLI nesneleri yanlışlıkla tek kutuya birleştirmek.
- IoU eşiğini çok YÜKSEK seçip aynı nesnenin birden fazla kez raporlanmasına izin vermek.
- Nesne tespitini sınıflandırmadan sadece “biraz daha karmaşık” sanmak — konum tahmini, tamamen farklı bir kayıp fonksiyonu ve değerlendirme metriği gerektirir.
Kendini test et
1. Nesne tespiti, görüntü sınıflandırmasından temel olarak nasıl farklıdır?
- Aralarında fark yoktur
- Sınıflandırma sadece "ne" sorusuna cevap verir; nesne tespiti hem "ne" hem "nerede" (sınırlayıcı kutu) sorularına cevap verir (doğru cevap)
- Nesne tespiti sadece siyah-beyaz görüntülerde çalışır
- Sınıflandırma her zaman daha yavaştır
Neden: Sınıflandırma, tüm görüntü için tek bir etiket üretir; nesne tespiti ayrıca her nesnenin KONUMUNU (bir sınırlayıcı kutu ile) da tahmin eder.
2. IoU (Intersection over Union) neyi ölçer?
- Bir görüntüdeki toplam nesne sayısını
- İki sınırlayıcı kutunun ne kadar ÖRTÜŞTÜĞÜNÜ -- kesişim alanının birleşim alanına oranını (doğru cevap)
- Bir modelin eğitim hızını
- Görüntünün çözünürlüğünü
Neden: IoU = kesişim alanı / birleşim alanı; 1'e ne kadar yakınsa iki kutu o kadar örtüşüyor demektir, 0 ise hiç örtüşmüyor demektir.
3. Notebook'ta Non-Max Suppression neden 4 kutudan 2'sini elemişti?
- Rastgele bir seçim yapıldı
- 3 kutu, birbirleriyle YÜKSEK IoU'ya sahipti (aynı nesneyi işaret ediyorlardı) -- NMS bunlardan sadece en yüksek güvenli olanı tuttu, diğer 2'sini eledi (doğru cevap)
- Güven skoru düşük olan kutular her zaman elenir
- NMS her zaman kutu sayısını yarıya indirir
Neden: 3 kutu birbirleriyle 0.5 eşiğinin üzerinde IoU'ya sahipti, bu yüzden "aynı nesne" olarak değerlendirildiler; NMS bunlardan en yüksek güvenli (0.95) olanı tuttu, diğer ikisini (0.88 ve 0.75) eledi.
Özet
Özet
- Nesne tespiti, sınıflandırmadan farklı olarak hem "ne" hem "nerede" (sınırlayıcı kutu) sorularına cevap verir.
- IoU (kesişim/birleşim), iki kutunun ne kadar örtüştüğünü [0,1] arasında ölçer.
- Bir dedektör genelde aynı nesne için birden fazla üst üste binen kutu önerir.
- Non-Max Suppression, yüksek IoU'lu kutuları birleştirip her nesne için tek bir kutu bırakır.
- İki-aşamalı (Faster R-CNN) ve tek-aşamalı (YOLO, SSD) olmak üzere iki ana dedektör ailesi vardır.