Neden özel bir model gerekti?
YOLO'nun COCO veri setinde eğitilmiş hazır modelleri insan, araç ve günlük eşya gibi çok sayıda sınıfı tanıyor; sigara bunlardan biri değil. Bu nedenle hazır ağı yalnızca çalıştırmak yerine kendi etiketlerimi hazırlayıp modele yeni sınıfı öğretmem gerekiyordu.
Sıfırdan bir ağ eğitmedim. Milyonlarca örnekte kenar, doku ve şekil özelliklerini öğrenmiş YOLOv8n ağırlıklarını başlangıç noktası olarak kullanıp transfer learning uyguladım. Böylece sınırlı veriyle daha hızlı bir ilk sonuç elde ettim.
IoU ve NMS'i anlamak
Modeli eğitmeden önce iki temel kavramı netleştirdim. IoU, tahmin edilen kutuyla gerçek kutunun ne kadar örtüştüğünü ölçüyor. NMS ise aynı sigara üzerinde oluşan birden fazla tahminden en güvenilir olanı bırakıp diğerlerini eliyor. Bu iki adım, ekrandaki kutuların hem konumunu hem de tekrar sayısını doğrudan etkiliyor.
Segmentasyon maskesinden YOLO kutusuna
Bulduğum kaynak veri setinde 823 görüntü ve piksel düzeyinde sigara maskeleri vardı. YOLO ise her nesne için merkez, genişlik ve yükseklik değerleriyle tanımlanan sınırlayıcı kutular bekliyor. Maskeleri OpenCV ile okuyup connected components ile ayrı bölgeleri buldum; her bölgenin sınırlarını YOLO formatına dönüştürdüm.
İlk denemede maskeleri gri tonlamalı okuyunca bütün değerler sıfır görünüyordu. Maskenin bilgiyi yalnızca belirli bir renk kanalında taşıdığını fark edip renkli okuma ve kanal maksimumu üzerinden ikili maske oluşturdum. Geçerli nesnesi olmayan görüntüleri eledikten sonra 679 eğitim, 122 doğrulama görüntüsü ve toplam 980 sigara kutusu elde ettim.
Nesne tespitinde etiket biçimi model kadar kritik. Yanlış okunan bir maske eğitim kodunu durdurmayabilir, fakat modele tamamen boş veya hatalı kutular öğretebilir.
CPU üzerinde eğitimi yönetmek
GPU olmadığı için eğitimi kısa epoch grupları hâlinde çalıştırıp ağırlıklardan devam ettim. Öğrenme oranını ilerleyen denemelerde düşürdüm. Sigara ince ve küçük bir nesne olduğu için giriş çözünürlüğü belirgin fark oluşturdu; 320 pikselden 416 piksele çıktığım deneylerde mAP50 yaklaşık 0.41-0.46 bandına ulaştı.
Bu skor kusursuz bir sistem anlamına gelmiyor. Model bazı açılarda sigarayı kaçırabiliyor veya benzer ince nesneleri karıştırabiliyor. Yine de farklı ışık ve sahnelerde doğru kutular üreten, geliştirilebilir bir ilk sürüm elde ettim.
Canlı kamera uygulaması
Eğitilen ağırlıkları OpenCV ile açılan web kameraya bağladım. Her kare 416 piksel giriş boyutuyla modele gönderiliyor. En az bir kutu bulunduğunda görüntünün üstünde kırmızı bir uyarı bandı beliriyor; kutular ve güven değerleri de kare üzerine çiziliyor.
Güven eşiğini ayrı bir ayar olarak tuttum. Eşiği düşürmek daha çok sigara yakalarken yanlış alarmı artırıyor; yükseltmek ise daha temkinli ama bazı gerçek örnekleri kaçıran bir davranış üretiyor. Son olarak uygulamayı PyInstaller ile terminal gerektirmeyen bir Windows paketine dönüştürdüm.
Sınırlar ve sonraki adım
Bu sürüm bir bilgisayarlı görü prototipi. Gerçek bir mekânda kullanılmadan önce daha çeşitli kamera açıları, düşük ışık, duman, el kapanması ve sigaraya benzeyen nesnelerle test edilmesi gerekiyor. Bir sonraki adım daha geniş veri, GPU üzerinde tam eğitim ve precision-recall dengesini gerçek kamera kayıtlarıyla değerlendirmek.
Projede en çok öğrendiğim nokta, model çağırmanın işin küçük kısmı olduğuydu. Etiketi dönüştürmek, bozuk maskeyi bulmak, küçük nesne için çözünürlüğü ayarlamak ve sonucu kullanılabilir bir uygulamaya taşımak asıl geliştirme sürecini oluşturdu.
SONRAKİ YAZIDoku görüntüsünden olasılık ısı haritası üretmek