FIG. 01
KAYIT KÜNYESİ
Kategori
Yazılım
TARİH
Eğitim komutunu yazarken herkes aynı şeyi yapıyor: augmentation satırlarını bir forum gönderisinden ya da birinin Kaggle notebook'undan kopyalayıp yapıştırıyor. degrees=15, mixup=0.15, erasing=0.4... Çalışıyor gibi görünüyor. Sonra doğrulama mAP'i beklediğinizin altında kalıyor ve nedenini bir türlü bulamıyorsunuz.
Bizim de başımıza geldi. İlk veri setimizin büyük bölümü web'den toplanmıştı; gerçek havadan görüntü yalnızca küçük bir paydı. Üstüne, "ne kadar çok augmentation, o kadar iyi" varsayımıyla agresif ayarlar yığdık ve model havadan görüntülerde daha da kötüleşti. Sorun augmentation'ın kendisi değildi; hangi dönüşümlerin bizim problemimizde fiziksel olarak mümkün olduğunu hiç sormamış olmamızdı.
Bu yazıda Ultralytics augmentation parametrelerini tek tek ele alıyoruz: ne yaptıkları, resmi varsayılan değerleri ve ne zaman zarar verdikleri (asıl önemli olan kısım). Buradaki her değer, Ultralytics default.yaml dosyası ve resmi dokümantasyonla (2026 itibarıyla) karşılaştırılarak doğrulandı.
Parametrelerin tam tablosu
Ultralytics'te augmentation ayrı bir kütüphane değil; doğrudan eğitim yapılandırmasının içinde yaşıyor. Varsayılan değerler şöyle:
Parametre | Varsayılan | Aralık | Ne yapar |
|---|---|---|---|
| 0.015 | 0.0–1.0 | Ton (renk) kaydırma |
| 0.7 | 0.0–1.0 | Doygunluk kaydırma |
| 0.4 | 0.0–1.0 | Parlaklık kaydırma |
| 0.0 | 0–180 | ±N derece döndürme |
| 0.1 | 0.0–1.0 | Görüntü boyutunun bir oranı kadar kaydırma |
| 0.5 | 0.0–1.0 | (1−scale) ile (1+scale) arasında ölçekleme |
| 0.0 | −180–+180 | Kesme (shear / eğme dönüşümü) |
| 0.0 | 0.0–0.001 | Perspektif bozma |
| 0.0 | 0.0–1.0 | Dikey çevirme olasılığı |
| 0.5 | 0.0–1.0 | Yatay çevirme olasılığı |
| 0.0 | 0.0–1.0 | RGB↔BGR kanal değişimi olasılığı |
| 1.0 | 0.0–1.0 | 4 görüntüyü tek tuvalde birleştirme olasılığı |
| 10 | tam sayı | Son N epoch boyunca mosaic'i kapat (0 = hiç kapatma) |
| 0.0 | 0.0–1.0 | İki görüntüyü ve etiketlerini harmanlama |
| 0.0 | 0.0–1.0 | Görüntüler arasında dikdörtgen bölge kesip yapıştırma |
| 0.0 | 0.0–1.0 | Nesne kopyalama (yalnızca segmentasyon) |
|
| flip / mixup | Kopyalanan nesnenin nereden geldiği |
|
| — | Yalnızca sınıflandırma |
| 0.4 | 0.0–0.9 | Yalnızca sınıflandırma |
Dikkat çeken şu: varsayılanda yalnızca mosaic, fliplr, scale, translate ve HSV üçlüsü aktif. Geri kalan her şey kapalı. Ultralytics'in agresif olmayan bir temel seçmiş olması tesadüf değil.
scale: en çok işe yarayan, en çok gözden kaçan
scale=0.5, görüntüyü rastgele 0.5x ile 1.5x arasında yeniden boyutlandırır. Ölçek çeşitliliği nesne tespitinde doğrudan karşılığını bulur; çünkü aynı hedef 20 m'den ve 60 m'den bambaşka piksel boyutlarında görünür.
Bizim için bu kritikti: veri setimizin büyük kısmı, nesnenin kareyi doldurduğu yer seviyesi görüntülerden oluşuyordu. Uçuşta ise hedefler kare içinde çok daha küçük kalıyor. scale, bu açığın bir kısmını kapatmak için elimizdeki en ucuz araç.
scale, float yerine bir (min, max) tuple'ı da kabul eder; yani ona asimetrik bir aralık verebilirsiniz. Sorununuz küçük nesnelerse aralığı küçültme yönüne ağırlıklandırmak mantıklı:
Bir uyarı: mosaic zaten nesneleri küçültür, çünkü dört görüntüyü tek tuvale sıkıştırır. Üstüne agresif bir scale eklerseniz nesneler birkaç piksele düşebilir, etiket filtrelerine takılıp tamamen kaybolabilir. İkisini ayrı ayrı değil, birlikte ayarlayın.
fliplr ve flipud: havadan bakınca ikisi de serbest
fliplr (yatay çevirme) varsayılanda 0.5'tir; yani görüntülerinizin yarısı aynalanır. Çoğu problem için güvenlidir, ama metin, plaka ya da sağ/sol ayrımı taşıyan herhangi bir sınıf söz konusuysa sinyali yok eder.
flipud (dikey çevirme) varsayılanda 0.0'dır ve sebebi açık: yer seviyesi görüntülerde yerçekimi gerçek bir kısıt. Baş aşağı duran bir insan, eğitim setinde işi olmayan bir sahnedir.
Tam aşağı bakıldığında bu kısıt ortadan kalkar. Nadir (dik aşağı bakan) kamerada, irtifayı korurken hava aracının hangi yöne uçtuğu nesnenin kare içindeki yönelimini keyfî hale getirir. Aynı çadır, kuzeye giden geçişte ve güneye giden geçişte 180 derece farkla görünür. Bu yüzden flipud=0.5 havadan veri setlerinde yalnızca güvenli değil, doğrudan faydalıdır; üstelik döndürmenin aksine kutu geometrisini bozmaz.
degrees: kutuyu gevşetmenin sessiz bedeli
Döndürme masum görünür ama etiket formatıyla kavga eder. YOLO etiketleri eksen hizalı kutulardır; kenarları her zaman görüntü kenarlarına paraleldir. Döndürülmüş bir kutuyu saklayacak bir alan yoktur.
Ultralytics kaynağında RandomPerspective.apply_bboxes tam olarak bunu yapar: kutunun dört köşesini dönüşüm matrisinden geçirir, sonra dönüştürülmüş köşelerin uç değerlerinden yeni bir eksen hizalı kutu kurar; bu uç değerler x.min(), y.min(), x.max(), y.max() değerleridir. Yani döndürülmüş bir nesnenin etrafına çizilen kutu orijinalinden daha geniştir ve nesneye ait olmayan pikseller taşır.
Kayıp 45 derecede zirve yapar ve uzun, ince nesnelerde (örneğin yere uzanmış bir insan) çok daha belirgindir. Kabaca kare biçimli nesnelerde ise ihmal edilebilir. Pratik sonuç: degrees değerini küçük tutun (5–10 çoğu senaryoyu karşılar) ya da gerçekten tam 360 derecelik yönelim çeşitliliğine ihtiyacınız varsa döndürme yerine flipud + fliplr ikilisine başvurun. Bunların hiçbiri kutuyu gevşetmez.
mosaic ve close_mosaic: önce aç, sonra kapat
mosaic=1.0, her eğitim örneği için dört görüntüyü 2x2 bir tuvalde birleştirir. Bu, tek bir kare içindeki sınıf çeşitliliğini ve bağlam değişkenliğini artırır; nesneler doğal olarak küçüldüğü için küçük nesne performansına da yardım eder.
Ama ürettiği kare gerçek bir kare değil. Dört farklı sahnenin dikişli bir bileşimi ve kamera uçuşta size asla böyle bir görüntü vermeyecek. Tam da bu yüzden close_mosaic=10 (varsayılan) var: son 10 epoch'ta mosaic kapanır ve model gerçek, tek parça kareler üzerinde ince ayar yapar. Doğrulama metrikleriniz genellikle tam o noktada gözle görülür biçimde toparlanır.
Eğer close_mosaic değerini 0 yaparsanız mosaic sona kadar açık kalır; kısa eğitimlerde bu, modelin hiç "temiz" bir kare görmemesi demektir. 100 epoch'luk bir eğitimde varsayılan olan 10'a dokunmadan önce belirli bir gerekçeniz olmalı.
mixup ve cutmix: sınıflandırmadan gelen misafirler
mixup, iki görüntüyü saydamlıkla harmanlar ve etiketlerini de birlikte karıştırır. cutmix, bir görüntüden dikdörtgen bir bölge kesip diğerine yapıştırır. İkisi de varsayılanda 0.0, yani kapalı.
Bunlar sınıflandırma literatüründen geliyor ve tespit görevinde çok daha tartışmalı. mixup, yarı saydam hayalet nesneler üretir. İkisine de ancak gerçekten aşırı öğrenme (overfitting) gördüğünüzde ve yalnızca küçük değerlerle (0.05–0.15) başvurun.
copy_paste: segmentasyon maskesi olmadan hiçbir şey yapmaz
En çok yanlış anlaşılan parametre bu. copy_paste, sınıf dengesizliğini gidermenin doğrudan yolu: nesneleri bir görüntüden kesip başka bir sahneye yapıştırırsınız. Kulağa tam olarak bizim 7:1'lik sınıf dengesizliğimizin cevabı gibi geliyor.
İşin püf noktası şu: bir nesneyi temiz biçimde kesip çıkarmak piksel düzeyinde segmentasyon maskesi gerektirir. Kutu yetmez. Ultralytics kaynağı bunu sessizce halleder:
Yani yalnızca kutu etiketli bir tespit veri setinde copy_paste=0.5 yazarsanız hiçbir hata almazsınız; augmentation basitçe hiç çalışmaz. Bir şeyler yaptığını sanarak epoch'ları izlersiniz.
copy_paste_mode iki değer alır: flip (varsayılan) nesneleri aynı görüntüden kopyalar, mixup ise farklı görüntülerden çeker. Her iki durumda da yapıştırma, ancak mevcut nesnelerle örtüşme %30'un altında kalırsa gerçekleşir.
erasing ve auto_augment: bunlar sınıflandırmaya ait
Dokümantasyonda erasing=0.4 ve auto_augment='randaugment' varsayılanları "Classification-Specific Augmentations" başlığı altında yer alır. Bu satırları bir tespit eğitimine yazmanın hiçbir etkisi yoktur.
Bir sınıflandırıcı eğitiyorsanız yine de bir uyarı var: nesne karenin büyük kısmını dolduruyorsa erasing size kısmi örtülmeye karşı dayanıklılık kazandırır. Nesne zaten küçükse silinen dikdörtgen onu tamamen kapatabilir ve modele, içinde X olmayan bir görüntüyle birlikte "bu görüntüde bir X var" diyen bir etiket vermiş olursunuz; bu düpedüz gürültüdür. Ayrıca şunu da not edin: erasing parametresinin scale, ratio ve value alt parametreleri mevcut uygulamada değiştirilemiyor.
Hangisi ne zaman zarar verir
Parametre | Ne zaman zarar verir | Ne yapmalı |
|---|---|---|
| Nesneler zaten küçük ve mosaic de açık | Aralığı daraltın; mosaic ile birlikte ayarlayın |
| Sağ/sol anlam taşıyor (metin, plaka, ok işareti) | 0.0 yapın |
| Yerçekiminin göründüğü yer seviyesi veya eğik bakış | Bakış nadir değilse 0.0'da bırakın |
| Uzun, ince nesneler; kamera yönelimi zaten sabit | 0 ile 10 arasında tutun ya da çevirmeleri tercih edin |
| Kamera geometrisi sabit ve biliniyor | Kapalı bırakın |
| Sınıfları ayıran şey renk (kırmızıya karşı yeşil hedef) | Ton kaydırmasını kısın, parlaklığı koruyun |
| Model hiç temiz bir kare görmüyor | Sakın |
| Küçük veri seti, tespit görevi | Kapalı başlayın; yalnızca aşırı öğrenme varsa açın |
| Maske etiketi yok | Sessizce hiçbir şey yapmaz. Segmentasyon etiketleri üretin |
| Nesne kare içinde küçük | Sınıflandırmada bile düşürün |
Sık düşülen tuzaklar
Eksik veriyi augmentation ile kapatmaya çalışmak. Bir sınıfın az örneği varsa augmentation onları çoğaltmaz; aynı avuç dolusu örneği tekrar tekrar gösterir. Veri setimizde sınıflar arasında 7:1'lik bir fark vardı ve bunu augmentation ile kapatmaya çalışmak bizi hiçbir yere götürmedi. Çözüm, daha fazla gerçek havadan kare toplamak oldu.
Augmentation'ı doğrulama setine sızdırmak. Ultralytics doğrulama sırasında augmentation uygulamaz; ama kendi ön işleme adımınızı yazıp çevrimdışı augmentation'ları veri setine gömüyorsanız, aynı görüntünün varyantlarının hem eğitim hem doğrulama tarafına düşmediğinden emin olun. Ayrımı varyanta göre değil, kaynak görüntüye göre yapın.
Fiziksel olarak imkânsız sahneler üretmek. Ultralytics'in kendi eğitim materyalindeki test basit: bu görüntü sahada gerçekten oluşabilir mi? Oluşamazsa model kapasitesini yakıyorsunuz.
Her şeyi aynı anda değiştirmek. Beş parametreyi birlikte oynatıp mAP'e bakarsanız hangisinin ne yaptığını asla öğrenemezsiniz. Varsayılanlardan başlayın ve her seferinde tek bir parametre değiştirin.
Eğitim çözünürlüğünü uçuş çözünürlüğüyle karıştırmak. Eğitimi imgsz=1280 ile yapıyor, uçuşta 640 tam kare çıkarım koşuyoruz. Augmentation'ın ürettiği efektif nesne boyutunu eğitim çözünürlüğüne göre değerlendirin; ama neyin gerçekten işe yaradığını uçuş koşullarına yakın bir doğrulama setinde ölçün. Yalnızca havadan görüntülerden oluşan doğrulama setimizde bizi 0.950 mAP50'ye taşıyan yapılandırma, karışık sette ölçtüğümüzde bambaşka bir tabloya dönüştü.
Pratik özet
Varsayılanlardan başlayın.
mosaic=1.0,fliplr=0.5,scale=0.5,translate=0.1, HSV üçlüsü. Geri kalan her şey kapalı. Bu temel, çoğu tespit problemi için makul.Nadir (dik aşağı bakan) bir kamera uçuruyorsanız
flipud=0.5değerini açın. Kutu geometrisini bozmadan yönelim çeşitliliği kazandıran tek dönüşüm budur.Çevirmeleri
degreesparametresine tercih edin. Döndürme, eksen hizalı kutuyu genişletir ve etikete arka plan pikselleri doldurur.Sakın
close_mosaicdeğerini 0 yapmayın. Son epoch'larda gerçek kareler üzerinde yapılan ince ayar, mosaic'in dikiş izlerini temizler.Maskeleri,
copy_pasteparametresine başvurmadan önce üretin. Segmentasyon etiketleri olmadan parametre sessizce yok sayılır; oturup hata mesajı beklemeyin.Her değişikliği aynı doğrulama setinde ölçün ve o setin uçuş koşullarını temsil ettiğinden emin olun.
