İlk ciddi görüntü işleme projem insanlara karşı XOX oynayan bir robottu: tahtanın üstünde bir kamera, durumu okumak için klasik görüntü işleme, hamleyi seçmek için Minimax. Döngüde tek bir sinir ağı yoktu. O proje XOX robotu sayfasında duruyor ve aradan yıllar, birkaç YOLO boru hattı geçmesine rağmen aynı bir avuç işleme her hafta uzanıyorum. Nostaljiden değil. Ağların çözmediği adımları çözüyorlar.
Şekil: sentetik veri üzerinde kendi çizimim.
Eşikleme hâlâ ilk hamlem
Eşikleme, gri tonlu görüntüyü bir karara çevirir: bu piksel önemli, şu değil. Sabit hâli, T değerinin üstü beyaz, ışık değiştiği anda kırılır. Otsu yöntemi T’yi histogramdan seçer; lamba değişse de ayakta kalır. Adaptif eşikleme her komşuluk için yerel bir T hesaplar; ışığın kare içinde dengesiz olduğu durumu o kurtarır.
XOX tahtasında ışık hiçbir zaman dengeli değildi, masanın bir yanı hep daha parlaktı, o yüzden hayatta kalan tek sürüm adaptif oldu. Genel ders aklımda kaldı: eşikleme yöntemini en yeni olana göre değil, ışığının nasıl bozulduğuna göre seç.
Çalışma sıram yıllardır değişmedi: önce sabit eşik, çünkü üzerine akıl yürütmesi bedava; histogram net biçimde iki tepeliyse Otsu; sahnede ışık gradyanı belirdiği anda adaptif. Histograma on saniye bakmak hangi durumda olduğunu söylüyor. Üçü de işe yaramadığında ise sorun neredeyse hiçbir zaman eşik değildir. Eşiğe verdiğin kanaldır.
İşin diğer yarısı doğru kanalı eşiklemek. Renkli hedefler için HSV’ye geç ve ton kanalını eşikle, çünkü RGB rengi ve parlaklığı aynı sayıların içine karıştırır. Termal işlerde ise görüntü zaten tek kanaldır ve bu oyunu baştan değiştirir: termal görüntüleme yazısında anlattım.
Morfoloji: eşiklemenin bıraktığını temizler
Hiçbir eşik sana temiz maske vermez. Sensörün itiraz ettiği yerlerde tuz gürültüsü, yansımanın hedefi yediği yerlerde delikler kalır. Morfoloji ikisini de iki yapı taşıyla düzeltir: erozyon beyaz bölgeleri küçültür, genişletme büyütür. Açma, önce erozyon sonra genişletme, çekirdekten küçük benekleri siler. Kapama, ters sıra, çekirdekten küçük delikleri doldurur.
Bütün karar çekirdek boyutudur. Gürültü saydığın şeyi silecek kadar büyüt, daha fazla değil; yoksa istediğin nesneleri yemeye başlarsın. Kuralım şu: temiz maske almak için eşiği sonsuza kadar kurcalıyorsam dururum, kirli maskeyi kabul ederim ve bir saatlik ayarın yapamayacağını tek bir açma işlemine milisaniyede yaptırırım.
Beklenenden daha önemli iki küçük ayar var. Çekirdek şekli: varsayılanım elips, çünkü dikdörtgen çekirdek organik şekillerde köşeleri bloklaştırır ve çaprazları dengesiz büyütür. Bir de yineleme sayısı: küçük çekirdekle iki geçiş, büyük çekirdekle tek geçişten daha nazik ve daha kontrollüdür. Maske bundan fazlasına ihtiyaç duyuyorsa morfoloji yanlış araçtır; bir aşama geri döner, eşiği ya da kanalı düzeltirim.
Konturlar: maskeyi nesneye çevirir
findContours, piksellerin şeylere dönüştüğü yerdir. Kapalı sınırlar
alırsın ve her birinden alan, en boy oranı, momentlerle ağırlık merkezi
çıkar. Alana göre filtrele, artık gürültü gitsin; en boy oranına göre
filtrele, beklediğin şekiller kalsın. Bir anda elinde hiç eğitim verisi
olmadan tespitler var.
XOX robotunda X ile O’yu ayırmak kontur hiyerarşisine indi: O’nun iç konturu vardır, X’in yoktur. Bugün bir sınıflandırıcının yapacağı işi tek bir if yaptı, anında çalıştı ve hiç veri seti istemedi. Kontrollü bir sahnede bu takas hâlâ yapmaya değer; konturlar yetmediğinde de önlerine Canny gibi bir kenar dedektörü koymak genelde yeter.
Hiyerarşi numarasını istiyorsan bunu findContours’tan açıkça iste: alma
modu, düz bir liste mi yoksa ebeveyn ve çocuk ağacı mı alacağını belirler.
RETR_TREE tam iç içe yapıyı verir ve her kontur, ebeveyninin indeksiyle
birlikte gelir. O tek dizi, sınır yığınını yapıya çevirir; bir oyun
tahtasını okumanın ihtiyacı da tam olarak budur.
Vaka: kamera karesinden tahta matrisine
XOX robotu, bu işlemlerin elimdeki en temiz uçtan uca örneği; o yüzden hattın tamamını bir kez, aşama aşama yürüyelim. Görev: fiziksel bir XOX tahtasını kameradan izle, onu boş, X ve O’dan oluşan 3x3 bir matrise çevir, matrisi Minimax’e ver ve cevabı endüstriyel bir robot kol oynasın. Bu cümlede Minimax’ten önceki her şey klasik görüntü işleme ve yukarıdaki bölümlerle bire bir eşleşiyor.
Adım 1, eşikleme. Kare gri tona çevrilir ve doğrudan adaptif eşiklemeye girer. İlk denediğim şey global eşikti ve ilk bozulan da o oldu: masanın bir yarısı daha parlaktı, tahtanın yarısı bembeyaz çıktı. Adaptif eşikleme her komşuluk için yerel bir eşik hesaplar; ızgara çizgileri ve kalem izleri tahtanın iki yarısında da hayatta kalır.
Adım 2, morfoloji. Ham maske sensör beneği ve izin inceldiği yerlerde küçük boşluklar taşır. Küçük eliptik çekirdekle bir açma benekleri siler, bir kapama boşlukları mühürler; böylece çizilen her sembol tek parça bağlı bir bölge olur. Kapama olmazsa titrek bir X ayrı lekelere dağılabilir ve akışın devamı tahtayı yanlış sayar.
Adım 3, konturlar. findContours temiz maske üzerinde ağaç alma
moduyla çalışır; her sınır, ebeveyn ve çocuk ilişkileriyle birlikte gelir.
Alan filtresi, açmanın kaçırdıklarını atar. En büyük yapı ızgaranın
kendisidir ve geometrisi dokuz hücrenin karede nerede oturduğunu sabitler;
böylece kamera biraz kaydığında işaretçiye ya da elle kalibrasyon adımına
hiç ihtiyacım olmadı.
Adım 4, hücre sınıflama. Dokuz hücrenin her biri artık içinde en fazla bir sembol barındıran küçük bir maske bölgesi. Boş hücrede gürültü tabanının üstünde kontur yoktur. Sembollü hücreye önceki bölümdeki hiyerarşi testi uygulanır: dış kontur bir iç kontur içeriyorsa O, içermiyorsa X. Hücre başına üç olası cevap, dokuz hücre ve fiziksel tahta 3x3 bir matrise dönüştü.
Adım 5, karar ve hamle. Matris artık oyun durumu ve buradan sonra görüntünün işi bitti. Minimax durumu arar ve hamleyi seçer, endüstriyel robot kol da hamleyi fiziksel tahtada oynar. Aşağıdaki konsol çıktısı bütün hattın birleştiği an: kameradan okunan tahta matrisi ve yanında basılan hamle kararı.
Kare: projenin gerçek çıktısı.
Vakanın meselesi bir robotun XOX oynayabilmesi değil. Mesele, hattın her aşamasının kaydedip bakabileceğin bir resim olması. Bir hücre yanlış okunduğunda eşik çıktısını, morfoloji sonrası maskeyi ve konturları diske döktüm; bozuk aşama dakikalar içinde ortadaydı. Aynısını bir ağın ara aktivasyonlarıyla yapmayı dene. Kol dahil yapımın tamamı XOX robotu proje sayfasında.
Klasikler emekli olmuyor, boru hattına taşınıyor
Sahaya çıkardığım her dedektör klasik işlemlerle sarılı. Ağdan önce yeniden boyutlandırma ve letterbox. İlgisiz olduğunu bildiğin bölgelerden gelen yanlış alarmları kesen maskeler. NMS gibi son işlemler, ki onu tespitin son ve hafife alınan adımı yazısında anlattım. Spor takip işinde ilginç olaylar dedektörün üstünde oturuyor ve onlar hakkında akıl yürütmek ağırlıklar değil, geometri ve maske işi.
Bunların hiçbiri öğrenmeye karşı bir argüman değil. Hedef, dronedan görünen bir insan ya da kalabalık sahadaki bir oyuncuysa dedektör eğitirim ve arkama bakmam. Kullandığım ayrım basit: karede ne olduğu sorusunu ağ cevaplar, o sorunun öncesindeki ve sonrasındaki her şeyi klasikler cevaplar. Ağa temiz, maskelenmiş, doğru boyutlanmış girdi ver; çıkandan da ortalığı topla. Bu ayrımın iki yarısı birlikte, demoyu üründen ayıran şey.
Sessiz süper güç ise hata ayıklama. Boru hattı tuhaf davrandığında bütün ara görüntüleri diske döküp bakarım. Bir eşiğin ya da genişletmenin nasıl görünmesi gerektiğini bilen kişi bozuk aşamayı dakikalar içinde bulur. Temeller eski yöntem değil. Boru hattının gerçekten görebildiğin kısmı.