
FIG. 01
KAYIT KÜNYESİ
Kategori
Proje Günlüğü
TARİH
Modelimizin uzaktaki hedefleri göremediğini teşhis ettikten sonra (o hikâye burada) tek bir sonuca vardık: veri setinin sıfırdan yeniden kurulması gerekiyordu. Elimizdeki veri, sahada karşılaşacağımız durumu basitçe içermiyordu.
Çözüm kulağa basit geliyordu: daha fazla veri bul, hepsini birleştir, yeniden eğit. Uygulaması hiç de öyle olmadı. Bu yazı, 16.000 görüntüyü tek bir kullanılabilir veri setine dönüştürürken karşımıza çıkan dört problemin hikâyesi.
Problem 0: Elimizdeki veride ne eksikti?
Elimizdeki veriyi anlamak için önce basit ama son derece öğretici bir analiz yaptık: tüm etiket kutularının boyut dağılımını çıkardık.
Medyan kutu boyutu: ~200 piksel
10. persentil: ~99 piksel
Yani veride küçük ya da uzak nesne hiç yoktu. Üstelik görüntülerin büyük çoğunluğu internetten toplanmıştı; gerçek drone kareleri azınlıktaydı. Modeli yerden çekilmiş büyük nesnelerle eğitip ondan havadan çekilmiş küçük nesneleri bulmasını bekliyorduk.
Bu analiz beş dakika sürdü ve sonraki bütün kararlarımızı şekillendirdi. Bakmadığınız bir veri setiyle eğitim yapmayın.
Problem 1: Sınıf adı kaosu
Birkaç farklı kaynağı birleştirince ortaya şöyle bir sınıf listesi çıktı:
'0''0 pedestrian''Lying_Person''Person''baygin''bicycle''bus''car''human''motobike''motorbik3''p3rson''people''person''tent'
On beş sınıf. Aralarında yazım hataları (p3rson, motorbik3), başka dillerden gelen adlar (baygin, Türkçe yazılmış), aynı şeyin birden fazla adı (Person, person, human, people) ve görevimizle hiç ilgisi olmayan sınıflar (car, bus, bicycle) vardı.
Görevimizde tam olarak iki hedef var: manken ve çadır. Karar kıldığımız eşleme şöyle:
Kaynak sınıflar | Hedef sınıf |
|---|---|
person, people, human, Person, p3rson, Lying_Person, pedestrian, baygin |
|
tent |
|
car, bus, bicycle, motorbike… | çıkarıldı |
Tek bir sınıf gerçekten dikkat istedi: yalnızca '0' diye adlandırılmış olan. Adı içeriği hakkında hiçbir şey söylemiyordu ama 4.000'den fazla kutu taşıyordu. Körü körüne atmak da körü körüne tutmak da aynı ölçüde riskliydi. Bu yüzden bu sınıfa ait birkaç görüntüyü kutuları çizili hâlde açıp baktık: havadan çekilmiş insanlardı. Tam da ihtiyacımız olan veri. Eşlemeye dahil ettik.
Ders: Belirsiz bir sınıfı tahminle değil, gözünüzle karara bağlayın. Beş görüntüye bakmak ya 4.000 kutuyu kurtarır ya da onları yanlış etiketlemekten sizi kurtarır.
Problem 2: Görünmez kopyalar
Farklı projelerden gelen veriler birbirinin kopyalarını içeriyordu; hem de iki ayrı biçimde:
a) Augmentation kopyaları. Roboflow gibi platformlar dışa aktarımda her görüntünün döndürülmüş ve parlaklığı kaydırılmış varyantlarını üretebiliyor. Dosya adları farklı, ama içerik aynı görüntünün bir varyasyonu.
b) Aynı görüntünün farklı adla durması. Tek bir kaynak görüntü, iki ayrı projede iki farklı dosya adıyla duruyor.
Bunları içeride bırakırsanız iki şey olur. Veri seti şişer, çünkü aynı bilgiyi tekrar tekrar öğretirsiniz. Daha kötüsü, bir görüntünün bir kopyası eğitime, diğeri doğrulamaya düşerse veri sızıntısı (data leakage) yaşarsınız: model daha önce gördüğü bir soruyu cevaplar ve metrikler yanlış sebeple yükselir.
Temizliği iki geçişte yaptık:
aHash, görüntüyü 8×8'e küçültür ve her pikseli ortalamanın üstünde mi altında mı olduğuna göre 1 ya da 0 olarak kodlar. Yeniden boyutlandırmaya ve JPEG sıkıştırmasına karşı dayanıklıdır; "aynı görüntü, farklı kaydedilmiş" durumunu yakalayan da tam olarak budur.
Sonuç: kabaca 2.000 kopya elendi.
Problem 3: 32'ye 1 dengesizlik
Birleştirme bittiğinde sınıf dağılımı şöyleydi:
mannequin(insan): ~160.000 kututent: ~5.000 kutu
Kabaca 32:1. Sebebi açık: havadan çekilmiş insan veri setleri (kalabalık sahneler) her yerde, havadan çadır verisi ise nadir. Tek bir karede onlarca insan olabilir; bir çadır ise genelde tek başına durur.
Bu dengesizlikle eğitim yapmak modeli çadır sınıfını görmezden gelmeye iter; çünkü loss açısından bir çadırı kaçırmanın bedeli, insanları doğru bilmenin getirisinin yanında küçük kalır.
Çözümümüz azınlık sınıfı çoğaltmak (oversampling) oldu: içinde çadır bulunan eğitim karelerini 3× kopyaladık. Bunu, veriyi sayan, hangi sınıfın azınlıkta kaldığını bulan ve onu çoğaltan otomatik bir adıma bağladık. Böylece veri seti altından değişse bile mantık çalışmaya devam ediyor.
Problem 4: Doğrulama setini kirletmemek
Atlanması en kolay, ama verdiğimiz en kritik karar buydu.
Elimizde iki tür görüntü vardı: internetten toplanmış kareler (çoğunluk) ve kendi dronumuzdan gelen gerçek havadan kareler (azınlık). Doğrulama setini rastgele seçseydik büyük ölçüde internet görüntüleriyle dolardı.
Sonucu tahmin edilebilirdi: yüksek metrik, zayıf saha performansı. Model, hiç uçmadığımız bir alanda sınava girmiş olurdu.
Bu yüzden doğrulama setini yalnızca gerçek havadan karelerden kurduk: 631 karelik bir havuzdan seçilen 31 görüntü ve 121 etiketli nesne. Küçük bir set (bunu açıkça söylüyoruz), ama temsil ettiği şey doğru.
Kolay metrik, iyi metrik değildir. Doğrulama seti modelin gerçekte çalışacağı ortamı yansıtmıyorsa, elinize geçen sayı içinizi rahatlatır ama size bir şey anlatmaz.
Ek adımlar: tiling ve hard negative kareler
Son iki dokunuş:
Tiling ile eğitim. Büyük görüntüleri %40 overlap ile 1280×1280 karolara böldük. Bu, küçük nesnelerin göreli boyutunu büyütüyor ve aynı anda çıkarım (inference) sırasında kullandığımız dilimleme yaklaşımıyla aynı dağılımı üretiyor.
Hard negative kareler. Eğitim setinin %15'i kadar, içinde hiç hedef bulunmayan arka plan karesi (çimen, moloz, gölge, çalı) ekledik. Amaç modele "burada bir şey yok" demeyi öğretmek. Bu kareler yanlış alarm oranını düşürüyor ve moloz arasında hedef aradığınız bir görevde bu doğrudan puana dönüşüyor.

Sonuçlar
Yeniden eğitilen model, yalnızca gerçek havadan karelerden oluşan doğrulama setinde mAP50 0.950 değerine ulaştı; saha testinde ise her iki hedefi de tespit edip otonom bırakışı gerçekleştirdi.
Bu iyileşmenin ne kadarı yeni veriden, ne kadarı augmentation'dan geldi? İkisini birbirinden tam olarak ayıramıyoruz, çünkü ikisini birlikte değiştirdik. Vaktiniz varsa, sonucu yorumlanabilir kılan şey her seferinde tek bir değişkeni değiştirmektir.
Çıkarımlar
1. Veri setinizin sayısını değil, dağılımını ölçün. 16.000 görüntünüz olabilir ve gerçekten ihtiyaç duyduğunuz durumdan tek bir kare bile bulunmayabilir.
2. Birleştirme = sınıf eşleme + tekilleştirme + dengeleme. Klasörleri arka arkaya eklemek işin kolay kısmı.
3. İçerik tabanlı tekilleştirme şart. Dosya adları yetmez; aynı görüntü farklı adlarla gelir ve sızıntı yaratır.
4. Azınlık sınıfı dengeleyin. 32:1'de model azınlığı büsbütün öğrenmeyi bırakıyor.
5. Doğrulama seti, çalışacağınız ortamı temsil etmeli. Kolay bir set yalan söyleyen bir metrik üretir.
6. Belirsizliği bakarak çözün. Bir sınıf adı içinde ne olduğunu söylemiyorsa, birkaç örnek açıp bakın.
