GÖREV KAYDI

GÖREV KAYDI

KAYIT AÇIK

ATILIM UAV · YER KONTROL İSTASYONU

GÖREV KAYDI / DETAY

Arşiv

CANLI · OKUMA MODU

Yazılım

Augmentation Rehberi: scale, mosaic, flip — Hangisi Ne İşe Yarıyor?

Augmentation Rehberi: scale, mosaic, flip — Hangisi Ne İşe Yarıyor?

FIG. 01

KAYIT KÜNYESİ

Kategori

Yazılım

TARİH

TÜM KAYITLAR

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

hsv_h

0.015

0.0–1.0

Ton (renk) kaydırma

hsv_s

0.7

0.0–1.0

Doygunluk kaydırma

hsv_v

0.4

0.0–1.0

Parlaklık kaydırma

degrees

0.0

0–180

±N derece döndürme

translate

0.1

0.0–1.0

Görüntü boyutunun bir oranı kadar kaydırma

scale

0.5

0.0–1.0

(1−scale) ile (1+scale) arasında ölçekleme

shear

0.0

−180–+180

Kesme (shear / eğme dönüşümü)

perspective

0.0

0.0–0.001

Perspektif bozma

flipud

0.0

0.0–1.0

Dikey çevirme olasılığı

fliplr

0.5

0.0–1.0

Yatay çevirme olasılığı

bgr

0.0

0.0–1.0

RGB↔BGR kanal değişimi olasılığı

mosaic

1.0

0.0–1.0

4 görüntüyü tek tuvalde birleştirme olasılığı

close_mosaic

10

tam sayı

Son N epoch boyunca mosaic'i kapat (0 = hiç kapatma)

mixup

0.0

0.0–1.0

İki görüntüyü ve etiketlerini harmanlama

cutmix

0.0

0.0–1.0

Görüntüler arasında dikdörtgen bölge kesip yapıştırma

copy_paste

0.0

0.0–1.0

Nesne kopyalama (yalnızca segmentasyon)

copy_paste_mode

flip

flip / mixup

Kopyalanan nesnenin nereden geldiği

auto_augment

randaugment

Yalnızca sınıflandırma

erasing

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ı:

model.train(
    data="suas.yaml",
    imgsz=1280,
    scale=(0.4, 1.2),   # weight toward shrinking
    mosaic=1.0,
    close_mosaic=10,
)
model.train(
    data="suas.yaml",
    imgsz=1280,
    scale=(0.4, 1.2),   # weight toward shrinking
    mosaic=1.0,
    close_mosaic=10,
)

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:

if len(labels["instances"].segments) == 0 or self.p == 0:
    return labels
if len(labels["instances"].segments) == 0 or self.p == 0:
    return labels

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ı

scale (yüksek)

Nesneler zaten küçük ve mosaic de açık

Aralığı daraltın; mosaic ile birlikte ayarlayın

fliplr

Sağ/sol anlam taşıyor (metin, plaka, ok işareti)

0.0 yapın

flipud

Yerçekiminin göründüğü yer seviyesi veya eğik bakış

Bakış nadir değilse 0.0'da bırakın

degrees

Uzun, ince nesneler; kamera yönelimi zaten sabit

0 ile 10 arasında tutun ya da çevirmeleri tercih edin

shear, perspective

Kamera geometrisi sabit ve biliniyor

Kapalı bırakın

hsv_s / hsv_h (yüksek)

Sınıfları ayıran şey renk (kırmızıya karşı yeşil hedef)

Ton kaydırmasını kısın, parlaklığı koruyun

mosaic (son epoch'larda)

Model hiç temiz bir kare görmüyor

Sakın close_mosaic değerini 0 yapmayın

mixup / cutmix

Küçük veri seti, tespit görevi

Kapalı başlayın; yalnızca aşırı öğrenme varsa açın

copy_paste

Maske etiketi yok

Sessizce hiçbir şey yapmaz. Segmentasyon etiketleri üretin

erasing

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

  1. 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.

  2. Nadir (dik aşağı bakan) bir kamera uçuruyorsanız flipud=0.5 değerini açın. Kutu geometrisini bozmadan yönelim çeşitliliği kazandıran tek dönüşüm budur.

  3. Çevirmeleri degrees parametresine tercih edin. Döndürme, eksen hizalı kutuyu genişletir ve etikete arka plan pikselleri doldurur.

  4. Sakın close_mosaic değerini 0 yapmayın. Son epoch'larda gerçek kareler üzerinde yapılan ince ayar, mosaic'in dikiş izlerini temizler.

  5. Maskeleri, copy_paste parametresine başvurmadan önce üretin. Segmentasyon etiketleri olmadan parametre sessizce yok sayılır; oturup hata mesajı beklemeyin.

  6. Her değişikliği aynı doğrulama setinde ölçün ve o setin uçuş koşullarını temsil ettiğinden emin olun.

©2026 ATILIM UAV TEAM

©2026 ATILIM UAV TEAM