Veri Seti ve Model Eğitimi··6 dk okuma
YOLO11 ile Havadan Nesne Tespiti: Uçtan Uca Eğitim Rehberi
Hazır COCO ağırlıkları 20 metreden bakan bir gimbal kamerada neden hiçbir şey görmez? Veri toplamadan results.csv'yi okumaya kadar, kendi eğitim hattımızın tamamı.
Takımın ilk denemesi klasikti: yolo11n.pt indirildi, gimbal kameranın RTSP akışına bağlandı, drone 20 metreye çıktı. Sonuç, yerdeki hedefler için sıfır tespit. Aynı model masaüstünde bir web görselinde insanı, arabayı, çantayı sorunsuz buluyordu.
Sebep gizemli değil: COCO gibi genel veri setleri yatay bakış açısıyla, nesnenin karenin önemli bir kısmını kapladığı fotoğraflardan oluşur. 20 metre irtifadan tepeden bakan bir kamerada aynı hedef birkaç düzine piksele iner ve silueti tamamen değişir. Model o dağılımı hiç görmemiştir.
Bu yazıda, SUAS 2026 için kurduğumuz eğitim hattını baştan sona anlatıyoruz: veriyi nasıl topladık, data.yaml’ı nasıl yazdık, model boyutunu ve imgsz’yi neye göre seçtik, results.csv’den ne okuduk. Komut ve parametre adlarını Ultralytics resmi dokümanından doğruladık; sürüm 8.4.105 (24 Temmuz 2026 itibarıyla, Python 3.8-3.13). YOLO11 ailesi bu sürümde hâlâ aktif olarak destekleniyor, aşağıdaki API yeni YOLO26 modelleriyle de birebir aynı.
Modelin tavanını veri belirler
Eğitim komutunu yazmadan önce harcanan her saat geri döner. Bizim ilk veri setimizin yalnızca yaklaşık %11’i gerçek havadan çekimdi, geri kalanı internetten toplanmış yer seviyesi görsellerdi. İki sınıf arasındaki örnek oranı da 7:1’e kadar açılmıştı. O sürümle alınan doğrulama skoru güzel görünüyordu ama sahada karşılığı yoktu.
Kritik nokta şu: doğrulama setine web görseli koyarsanız model kolay örneklerden puan toplar, gerçek uçuş koşulunu ölçmezsiniz. Biz doğrulama setini yalnızca havadan çekimlerden oluşturduktan sonra tablo dürüstleşti — ve o set üzerinde mAP50 (IoU, yani kesişim/birleşim oranı 0.50 eşiğinde ortalama kesinlik) 0.950’ye ulaştı.
| Veri kaynağı | Güçlü yanı | Zayıf yanı | Ne zaman tercih edilir |
|---|---|---|---|
| Web görselleri | Hızlı, bol, ücretsiz | Bakış açısı ve ölçek yanlış | Sınıfın genel görünümünü öğretmek için, yalnızca eğitim setinde |
| Kendi uçuş kayıtlarımız | Dağılım birebir doğru | Toplaması pahalı, hava koşuluna bağlı | Doğrulama setinin tamamı ve eğitimin ağırlıklı kısmı |
| Simülasyon kareleri (Gazebo + SITL) | Sınırsız üretilebilir, etiketi otomatik | Doku ve ışık gerçekçi değil | Nadir senaryolar ve arka plan çeşitliliği için takviye |
Pratik kural: her yeni veri turunda önce doğrulama setini büyütün, sonra eğitim setini.
Klasör düzeni ve data.yaml
Ultralytics, etiket dosyalarını görüntü yolundaki images dizinini labels ile değiştirerek bulur. Bu yüzden klasör adları birebir bu olmalı:
dataset/
├── images/
│ ├── train/ img_0001.jpg
│ └── val/ img_0500.jpg
└── labels/
├── train/ img_0001.txt
└── val/ img_0500.txt
Her etiket dosyası, satır başına bir nesne içerir: sınıf indeksi ve normalize edilmiş (0-1 aralığına indirgenmiş) merkez-x, merkez-y, genişlik, yükseklik.
0 0.512 0.334 0.041 0.062
1 0.780 0.611 0.115 0.098
data.yaml dosyası ise şöyle:
path: /home/team/datasets/suas2026 # kök dizin
train: images/train
val: images/val
# test: images/test # opsiyonel
nc: 2
names:
0: mannequin
1: tent
names içindeki indeksler ile etiket dosyalarındaki sınıf numaraları birebir aynı olmalı. Bu eşleşmeyi bozmak, sessizce yanlış eğitilen bir modelin en yaygın sebebi.
Model boyutu: n, s, m yoksa l?
Aşağıdaki rakamlar Ultralytics’in resmi YOLO11 tablosundan; COCO doğrulama setinde, imgsz=640 ile ölçülmüş. Hız değerleri NVIDIA T4 üzerinde TensorRT10 ile alınmış — kendi companion computer’ınızdaki (uçuşta görüntü işleyen kart) süre farklı çıkar, bu sütunu yalnızca göreli karşılaştırma için kullanın.
| Model | mAP50-95 | T4 TensorRT10 (ms) | Parametre (M) | FLOPs (B) | Ne zaman |
|---|---|---|---|---|---|
| YOLO11n | 39.5 | 1.5 | 2.6 | 6.5 | Zayıf donanım, yüksek FPS zorunluysa |
| YOLO11s | 47.0 | 2.5 | 9.4 | 21.5 | Hız/doğruluk dengesi, ilk prototip |
| YOLO11m | 51.5 | 4.7 | 20.1 | 68.0 | Jetson sınıfı kart + küçük nesne |
| YOLO11l | 53.4 | 6.2 | 25.3 | 86.9 | Gerçek zamanlı olmayan, sonradan işleme |
Biz Jetson Orin NX 16GB üzerinde YOLO11m’de karar kıldık. m’den l’ye geçmek COCO’da yaklaşık 2 mAP puanı getiriyor ama çıkarım süresini gözle görülür artırıyor; bizim uçuş bütçemizde bu takas kârlı değildi. Kendi kartımızda tam kare 640 çıkarımda 15-20 FPS alıyoruz.
imgsz kararı: küçük nesnenin can damarı
imgsz varsayılanı 640. Havadan görüntüde asıl belirleyici parametre bu. Hedef 1080p karede 25 piksel genişliğindeyse, 640’a küçültme sonrası yaklaşık 15 piksele iner ve modelin en ince özellik haritası bile onu zor yakalar.
Biz imgsz=1280 ile eğitiyoruz. Bunun bedeli var: aynı batch (parti) boyutunda GPU belleği ve epoch süresi belirgin şekilde artar, çoğu zaman batch’i düşürmek gerekir. Uçuşta ise tam kareyi 640’ta işleyip, şüpheli bölgeler için SAHI (dilimleme destekli çıkarım) ile kareyi örtüşmeli parçalara bölüyoruz. SAHI’nin slice_height, slice_width, overlap_height_ratio, overlap_width_ratio parametreleri örtüşme oranını belirler; dilim sınırında kesilen nesneleri kaçırmamak için örtüşmeyi sıfır bırakmayın.
Çıkarım tarafında imgsz’yi her zaman açıkça yazın. Eğitimdeki değerle çıkarımdaki değer sessizce ayrışırsa, doğrulamada gördüğünüz skorla sahada gördüğünüz davranış birbirini tutmaz.
Temel eğitim komutu
CLI tarafı:
yolo detect train model=yolo11m.pt data=suas2026.yaml \
epochs=300 imgsz=1280 batch=8 patience=50 \
device=0 workers=8 project=runs name=v3_aerial
Python API ile aynı iş:
from ultralytics import YOLO
model = YOLO("yolo11m.pt") # önceden eğitilmiş ağırlıklarla başla
results = model.train(
data="suas2026.yaml",
epochs=300,
imgsz=1280,
batch=8, # -1 verilirse AutoBatch, ~%60 GPU belleği hedefler
patience=50, # 50 epoch boyunca iyileşme yoksa dur
close_mosaic=10, # son 10 epoch'ta mozaik artırımını kapat
amp=True, # karma hassasiyet: hızlı ve daha az bellek
seed=0,
)
| Parametre | Varsayılan | Bizim değerimiz | Gerekçe |
|---|---|---|---|
epochs |
100 | 300 | Ultralytics 300’ü başlangıç önerisi olarak veriyor; aşırı öğrenme yoksa 600+’ya çıkılabilir |
patience |
100 | 50 | Varsayılan, 100 epoch’luk bir eğitimde erken durdurmayı fiilen kapatır |
batch |
16 | 8 | imgsz=1280 belleği doldurduğu için düşürüldü |
imgsz |
640 | 1280 | Küçük hedefler |
optimizer |
auto |
auto |
Elle ayar için önce veriyi düzeltmek daha kârlı |
fraction |
1.0 | 0.1 (deneme turlarında) | Hattın çalıştığını 10 dakikada doğrulamak için |
Sonuçları okumak
Eğitim bitince çıktılar runs/detect/train/ altına yazılır: weights/best.pt ve weights/last.pt, results.csv, results.png, BoxPR_curve.png, BoxF1_curve.png, confusion_matrix.png ve val_batch*_labels.jpg / val_batch*_pred.jpg karşılaştırma kareleri.
results.csv sütunları şunlar: epoch, time, train/box_loss, train/cls_loss, train/dfl_loss, metrics/precision(B), metrics/recall(B), metrics/mAP50(B), metrics/mAP50-95(B), val/box_loss, val/cls_loss, val/dfl_loss, lr/pg0, lr/pg1, lr/pg2.
Üç sinyal okuruz:
val/box_lossdüşüp sonra yükselmeye başlıyorsa aşırı öğrenme (overfitting) başlamıştır;best.ptzaten o tepe noktasından alınır.- Kesinlik (precision) yüksek, duyarlılık (recall) düşükse model temkinlidir ve hedefleri kaçırıyordur — çözüm veri çeşitliliği veya daha yüksek
imgsz. - Tersi durumda, yani duyarlılık yüksek kesinlik düşükse yanlış pozitif üretiyordur; PR eğrisinden çalışma noktasını seçip uçuşta
confeşiğini yükseltmek gerekir. Bizconf=0.25ile uçuyoruz.
Bir noktayı karıştırmayın: mAP, güven eşiğinden bağımsız bir metriktir. Uçuşta kullanacağınız conf değeri ayrı bir mühendislik kararıdır ve mAP’yi değiştirmez.
Sık düşülen tuzaklar
- Doğrulama setinde web görseli bırakmak. En pahalı hata bu. Skoru şişirir, sahada karşılığı çıkmaz.
- train/val sızıntısı. Aynı uçuştan ardışık kareleri iki sete bölerseniz model neredeyse aynı görüntüyü ezberler. Ayrımı kare bazında değil, uçuş bazında yapın.
namesile etiket indekslerinin kayması. Etiketleme aracında sınıf sırası değişirse tüm veri seti sessizce bozulur. Her dışa aktarımdan sonra rastgele 10 etiketi elle doğrulayın.batch=-1’e körü körüne güvenmek. AutoBatch yaklaşık %60 GPU belleği hedefler; kartı paylaşan başka bir süreç varsa eğitim ortasında bellek taşabilir.- Varsayılan
patience=100ile 100 epoch eğitmek. Erken durdurma hiç devreye girmez, sadece süre harcarsınız. - Ölçek uyumsuzluğu. 640’ta eğitip 1280’de çıkarım almak (veya tersi) tespit sayısını beklenmedik biçimde değiştirir.
Pratik özet
- Doğrulama setini yalnızca gerçek uçuş kayıtlarından kurun; her şeyi ona göre ölçün.
imgsz’yi hedefin piksel boyutuna göre seçin — havadan tespitte 640 çoğu zaman yetmez.- Model boyutunu companion computer’ınızın gerçek FPS’ine göre seçin, COCO tablosuna göre değil.
- İlk turu
fraction=0.1ve az epoch ile çalıştırıp hattın uçtan uca çalıştığını doğrulayın, sonra tam eğitime geçin. results.csv’yi her turda saklayın; iki eğitimi karşılaştıramıyorsanız neyin işe yaradığını asla bilemezsiniz.
- YOLO11
- nesne tespiti
- model eğitimi
- Ultralytics
- havadan görüntü