
FIG. 01
KAYIT KÜNYESİ
Kategori
Proje Günlüğü
TARİH
Eğitilmiş bir nesne tespit modelimiz vardı ve doğrulama metrikleri iyi görünüyordu. Sahada ise tuhaf davrandı:
Hedefe yakınken onu yüksek güvenle buluyordu
Mesafe biraz açıldığında hiçbir şey üretmiyordu
Arada hiçbir geçiş yoktu. "Şüpheli tespit" bile çıkmıyordu
Bu davranışın kendisi bir ipucu. Model kademeli olarak bozulmuyordu; belli bir eşiğin ötesinde tamamen susuyordu. Bu yazı, o sessizliğin nedenini nasıl bulduğumuzun hikâyesi.
İlk refleks: eşiği düşürmek (ve neden işe yaramadığı)
Herkesin ilk başvurduğu çözüm: güven eşiğini düşürmek. Model 0.4'te susuyorsa 0.15'e çekersiniz, belki zayıf tespitler yüzeye çıkar.
Denedik. Hiçbir şey değişmedi.
Geriye dönüp bakınca nedeni apaçıktı: eşik taraması, ağın hiç üretmediği bir tespiti geri getiremez. Eşik, var olan çıktıları filtreler. Model o rejimde hiç aday üretmiyorsa, filtreyi gevşetmek filtrelenecek bir şey bırakmaz.
Sık düşülen bir hata ayıklama tuzağı bu: semptomu ayarlamak, nedeni aramanın yerine geçiyor. Hiçbir şey ölçmeden düğmeleri çevirmek problemi çözüyormuş gibi hissettirir; ama çözmez.
Adım 1: fizik ne diyor?
Sorduğumuz ilk soru: hedef, kameranın gördüğü karede gerçekte kaç piksel kaplıyor?
Nadir bakan (dik aşağı) bir kamera için karenin yere düşen izi ve yer örnekleme mesafesi (GSD) şöyle çıkar:
W_ground= 2 ·h· tan(HFOV/ 2)
GSD=W_ground/N_pixels
Bizim kameramızda (SIYI A8 mini, 81° yatay görüş açısı, 1920 px genişlik):
İrtifa | GSD | 1080p'de manken (1.7 m) | Model girdisine küçültüldükten sonra (640 px) |
|---|---|---|---|
20 m | 17.8 mm/px | ~95 px | ~32 px |
46 m | 40.9 mm/px | ~42 px | ~14 px |
50 m, 3× zoom (uçuş yapılandırması) | 14.8 mm/px | ~115 px | ~38 px |
20 m ve 46 m satırları tekli (1×) zoom içindir; model sustuğunda uçtuğumuz yapılandırma buydu. Tespit artık 3× dijital zoomla uçuyor: 4K sensör okuması kırpılıyor, görüş açısı 31.8°'ye daralıyor ve etkin odak ~1124 px'ten 3372 px'e çıkıyor; son satır bu durum.
İlk kritik bulgu şu: model kareyi hiçbir zaman çekildiği haliyle görmüyor. Girdi boyutuna küçültülmüş bir sürümünü görüyor. 46 metrede, 1080p karede 42 piksel kaplayan bir manken ağa 14 piksel olarak ulaşıyor.
14 piksellik bir nesne, evrişimli bir ağın derin katmanlarında (stride-32 aşamasında) kabaca tek bir hücreye çöker. Bilgi, ağ karar vermeye başlamadan önce yok olmuştur. Bu, tekli zoomdaki piksel bütçesi: aracın bugün uçtuğu 3× zoomda aynı hedef ağa yaklaşık 38 piksel olarak ulaşıyor.

Adım 2: veri ne diyor?
Fizik "imkânsız" değil, "zor" diyordu. Bu da ikinci soruyu getirdi: model o kadar küçük bir nesneyi görmeyi hiç öğrenmiş miydi?
Eğitim veri setindeki bütün etiket kutularının boyut dağılımını çıkardık. Sonuç çarpıcıydı:
Medyan kutu boyutu: ~200 piksel
En küçük %10'luk dilimdeki kutular bile ~99 piksel seviyesindeydi
Başka bir deyişle, veri seti operasyonel boyuta yakın tek bir örnek bile içermiyordu. Model 100-300 piksellik nesnelerle eğitilmişti; sahada ise ondan 14 piksellik bir nesneyi bulmasını bekliyorduk.
Bu, modelin "kötü" olduğu anlamına gelmiyor. Kendisine öğretilen işi tam olarak yapıyordu. Sadece öğretilen iş, sahadaki iş değildi.
Adım 3: eğitim ayarları ne diyor?
Son parça eğitim yapılandırmasından çıktı. Model checkpoint'ine kaydedilmiş parametrelere baktığımızda augmentation ayarlarının kapalı olduğunu gördük:
scale = 0 burada en kritik olanı. Bu parametre eğitim sırasında görüntüleri rastgele büyütüp küçültür; ağa "aynı nesne başka boyutlarda da görünebilir" demenin yolu budur. Kapalıyken ağ her nesneyi, veri setinde hangi boyutta bulunuyorsa yalnızca o boyutta öğrenir.
Teşhis: iki neden, tek semptom
Tablo yerine oturdu:
Veride küçük ya da uzak örnek yok (medyan ~200 px)
Ölçek çeşitliliği kapalı (
scale=0)
İkisi birbirini besledi. Veride küçük nesne yoktu, augmentation da üretmiyordu. Sonuç: ağ "uzaktaki hedef" diye bir kavramı hiç oluşturamadı. Sahada gördüğümüz ikili davranışı (yakında kusursuz, uzakta sıfır) tam olarak bu açıklıyordu.
Dikkat çeken şu: doğrulama metrikleri bunun hiçbir ipucunu vermedi. Doğrulama seti aynı veriden geliyordu; yani model, tam da öğrendiği boyut aralığında sınava giriyordu. Metrik yalan söylemiyordu, sadece yanlış soruyu soruyordu.
Çözüm
Teşhis veriyi ve ölçeği işaret ettiği için mimariye dokunmadık. Aynı model ailesinde kalıp şunları değiştirdik:
Girdi çözünürlüğünü yükselttik (960 → 1280)
Augmentation'ı açtık:
scale 0.5,fliplr/flipud 0.5,degrees 15,mosaic 1.0,mixup 0.1Veri setini sıfırdan kurduk (ayrı yazı: "16.000 Görüntüyü Tek Veri Setinde Birleştirmek")
Doğrulama setini yalnızca gerçek havadan görüntülerden kurduk
scale ve mosaic burada asıl yükü çeken ikili: verinin sahip olmadığı küçük nesne popülasyonunu sentezliyorlar. Model artık aynı hedefi geniş bir boyut yelpazesinde görerek eğitiliyor.
Mimariyi bilerek sabit tuttuk. Veriyi ve mimariyi aynı anda değiştirseydik, iyileşmeyi hangisinin getirdiğini asla bilemezdik. Her seferinde tek bir değişkeni oynatmak, bir hata ayıklama sonucunu yorumlanabilir kılan şeydir.
Sonuçlar
Yeniden eğitilen model, tamamı gerçek havadan karelerden oluşan bir doğrulama setinde mAP50 0.950 değerine ulaştı. Daha da önemlisi, saha testinde iki hedefi de tespit etti ve otonom bir bırakma gerçekleştirebildik.
Çıkarımlar
1. Semptomu ayarlamadan önce nedeni ölçün. Bir eşiği düşürmek, kök nedeni avlamanın yerini tutmaz.
2. Fiziği yapın. "Hedef kaç piksel?" sorusu, saatlerce model denemekten daha hızlı yol gösterir. Kameranın görüş açısı, irtifa ve model girdi boyutu birlikte bir bütçe oluşturur.
3. Veri setinizin yalnızca boyutuna değil, dağılımına bakın. 16.000 görüntünüz olabilir ve yine de asıl ihtiyacınız olan durumdan tek bir örneğiniz bulunmayabilir.
4. Doğrulama setiniz uçacağınız ortamı temsil etmiyorsa metrikleriniz sizi yanıltır. Kolay metrik, iyi metrik değildir.
