Ceviz Ağacı Taç Tespiti: YOLOv8-seg ile Özel Model Eğitimi
Problem
PlantFarm Scan'in her şeyi tek bir adıma dayanıyor: ortofotodaki her ağacın tacını doğru bulmak. Taç yanlışsa, o ağacın NDVI'ı da, trendi de yanlış. Bu yazıda bu adım için Walnut AI adını verdiğimiz modeli nasıl eğittiğimizi anlatıyoruz.
Neden Instance Segmentation?
Üç seçenek vardı:
- Nesne tespiti (bounding box): Ağacı bir kutuyla bulur. Ama kutunun köşeleri toprak ve çim içerir; ağaç bazlı NDVI ölçümünü bozar.
- Semantik segmentasyon: Her pikseli "ağaç" ya da "değil" diye etiketler. Birbirine değen iki ağacı ayıramaz.
- Örnek segmentasyonu (instance segmentation): Her ağacı ayrı bir nesne olarak, piksel düzeyindeki maskesiyle bulur.
Bize gereken üçüncüsüydü. Mimari olarak YOLOv8-seg'i seçtik: hızlı, küçük veri setinde iyi başlıyor ve eğitimi tek komutla yapılıyor. Küçük (yolov8s-seg) sürümle başladık; veri büyüdükçe orta boy modele geçmek mümkün.
Veri: Hangi Kareleri Seçtik?
Modelin başarısı mimariden çok verideki çeşitliliğe bağlı. Uçuşlardan kare seçerken şu kurallara uyduk:
- Çeşitlilik: Sık ve seyrek dikilmiş bölgeler, bahçenin farklı köşeleri, gölgeli ve güneşli kareler.
- Ağaçsız kareler: Boş tarla, çıplak toprak, yalnız çim. Modele "bu yeşil ama ağaç değil" demeyi öğretmek için şart. Bunlar olmadan model ilk çim kümesini ağaç sanıyor.
- Hastalıklı görünen ağaçlar: Şu an yalnız ağaç buluyoruz ama ileride hastalık sınıflandırması için bu kareler en değerli veri olacak.
- Bulanık ve hareketli kareleri dışarıda bırakmak.
Etiketleme renkli (_D.JPG) görüntü üzerinden yapıldı; aynı numaralı kırmızı, yeşil ve NIR bant dosyaları yanına alındı. İki sınıf var: ceviz ve badem.
Büyük Ortofoto, Küçük Model Girdisi
Model 640×640 piksellik görüntü bekliyor; bir bahçe ortofotosu ise on binlerce piksel genişliğinde. Bu yüzden tahmin bir hattan geçiyor:
- Ortofoto, yaklaşık %25 örtüşen 640 piksellik karolarla taranıyor.
- Örtüşen bölgelerde aynı ağaç iki kez bulunuyor; IoU tabanlı NMS ile tekrarlar eleniyor.
- Karo kenarında ikiye kesilmiş taçlar var: bir karoda sol yarısı, ötekinde sağ yarısı. Bunlar dikiş birleştirme adımında tek bir taca bağlanıyor.
- Son olarak gerçekten üst üste binen poligonlar için bir poligon örtüşme NMS'i daha çalışıyor.
Bu adımlar olmadan karo kenarındaki ağaçlar ya iki kez sayılıyor ya da yarım ölçülüyordu.
Sonuçlar Nasıl Okunmalı?
Eğitim sonunda modeli, eğitimde hiç kullanılmamış bir test seti üzerinde ölçüyoruz. Üç sayıya bakıyoruz:
- Precision: Model "ağaç" dediğinde ne sıklıkla haklı. Düşükse yanlış alarm çok.
- Recall: Gerçek ağaçların ne kadarını buluyor. Düşükse ağaç kaçırıyor.
- mAP50: İkisinin özeti; modelleri karşılaştırmak için en pratik tek sayı.
Doğrulama setinde taç maskesi için recall 0,75, mAP50 yaklaşık 0,61 civarında. Bu sayılar her pikselin doğru maskelenmesini ölçüyor ve karo birleştirme öncesi; sahada ağaç sayımı açısından tablo daha iyi. Ama dürüst olmak gerekirse, asıl darboğaz model değil veri: badem örnekleri cevize göre çok az olduğu için badem skorları düşük. Bu bir model hatası değil, veri dengesizliği. Çözümü daha fazla badem karesi.
Eğitimde erken durdurma (early stopping) kullandık: 30 epoch boyunca doğrulama skoru iyileşmezse eğitim kendiliğinden duruyor. Son modelimiz 105. epoch'ta durdu, en iyi ağırlıklar 75. epoch'tan.
Eski GPU ile Eğitim
Eğitim makinemizde bir GTX 1060 (Pascal nesli) var. Güncel PyTorch sürümleri bu GPU'yu resmi olarak desteklemiyor: torch.cuda.is_available() True dönüyor ama ilk gerçek işlemde hata veriyor. Bu yüzden eğitim için ayrı bir ortam kurduk (PyTorch 2.1.2 + CUDA 11.8). Bu ortamdaki Ultralytics sürümü YOLO11'i tanımıyor; o yüzden YOLOv8 tabanında kaldık.
Bunu yazmamızın nedeni şu: sahadaki pek çok tesiste son nesil GPU yok. Modelin "çalışıyor" demesi için yalnız is_available() değil, gerçek bir matris çarpımı deneyen bir kontrol yazdık. Müşteri donanımında da aynısını yapıyoruz.
Sıradaki Adımlar
- Daha fazla badem ve sık dikim örneğiyle veri setini dengelemek
- Hastalıklı ağaçları ayrı bir sınıf olarak etiketlemek
- Daha büyük bir modelin hız/doğruluk dengesini ölçmek
Sonuç
İyi bir tespit modeli, iyi seçilmiş veri ile modelin çevresindeki mühendisliğin (karo, birleştirme, ölçüm) toplamı. Benzer bir görüntü işleme ihtiyacınız varsa Industrial AI çözümümüz sayfasına bakabilirsiniz.