Building_Segmentation from bluekid on Vimeo.
Bölütleme pekçok görsel çözümün temelinde bulunması gereken bir aşama. İnsanoğlunun görmesinin de önemli bir parçası. Görme alanımızın tamamına sürekli dikkat etmeyiz. sadece yaptığımız iş için gerekli olan kısımı takip ederiz. İnsanoğlu hem konumlandırır hemde tanır. Semantik bölütleme makinaları bir aşama daha insan algısına yaklaştıırır.
Uygulama alanı çok geniştir. Medikal görüntü işlemeden, otonom araca, sanayide kalite kontrolden, e-ticare, uzaktan algılamaya kadar pek çok alanda kullanılabilir.
Konuyla ilgili çalışmaların linklerini bu adresde listlemişler
handong1587.github.io/deep_learning/2015/10/09/segmentation.htmlbir inceleyin uzun web aramalarından sizi kurtaracaktır.
Bizde bir çalışma yapalım istedik ve uygun bir veri seti aradık. Sonunda uydu görüntülerinden bina bölütleme için hazırlanmış şu küçük veri setine ulaştık
Building Detection Dataset ( web, data , ground truth )
Veriler IKONOS ve QuickBird uydularından çekilmiş 14 resim ve o resmilerdeki binalar için bölütlemeyi gösteren çıkış resimlerinden oluşuyor.
Veriler hakkında ki detaylı bilgileri şurdan alabilirsiniz
Resimler tiff formatında fakat uydunun çektiği görüntü multi-spektral olduğundan (B, G, R, and NIR) ilave katmanı var. Biz bu çalışmamızda normal görünür katmanları kullanacağız. Bu özel tiff formatını okuyabilmeniz için şu yazıdan faydalana bilirsiniz.
Öncelikle Uydu fotoğraflarını sadce RGB kanalları ile kaydediyoruz.
Fotoğrafların ebatlarındaki değişiklik ve büyük olmaları Eğiteceğimiz ağa doğrudan vermemizi zorlaştırıyor. Keza 14 resimde veri sayısı olara az. Çözüm olarak her resimden rastgele 256x256 ebatında 100 er örnek alıyoruz. Aslında doğrusu verileri çoğaltamak olmadı en azından ilaveten resimlere gürültü ekleme döndürme işlemleride uygulamakdi. Biz bu kadarla iktifa ettik
Verilerimizi hazırladığımıza göre ağımıza geçebiliriz. Biz kerası kullandık bu problem için.
Building Autoencoders in Kerasyazısındaki kodlardan faydalandık.
Bahsettiğimiz yazının "Convolutional autoencoder" kısmında ilginç bir problem çözülüyor.
Gürültü eklenmiş görüntüler
temizleniyor. Giriş olarak üsttteki resimler veriliyor. İstenen çıkış olarak alttaki resimleri veriyorlar. Ağı gürültülü resimden temizlenmiş resme ulaşacak şekilde eğitiliyor. Ağ yapısıda oldukça basit
Encoder ; Giriş resmini alıp Conv2D ve MaxPooling2D katmanları ile ebatça küçültülüyor.
Decoder ; Encoderdan gelen veriyi Conv2D ve UpSampling2D katmanları ile ebatça büyütülüyor ve nihayetinde çıkış verisine eşleniyor.
Katman dedik ama yazılışı tuhafınıza gitmiş olabilir aslında Kerasın iki ana şekilde kodlama imkanı var biri daha önceki bahsettiğimiz kamanlar halindeki diğeride burda görmekte olduğunuz katmanların fonksiyonlar olarak tanımlandığı tarz detaylar için bakınız
Keras functional APIYazıdaki problemde giriş ebatı ufak ve nispeten daha kolay bir problem biz bu yüzden kendi çalışmamızda ilave katmanlar ekledik
Encoder için ; Conv2D ve MaxPooling2D
Decoder için ; Conv2D ve UpSampling2D
elbette filtre sayılarınıda artırdık. Problemin zorluğuna göre ağın katman sayısını ve topolojisini değeiştirmek gerekiyor. Mesela Medikal görüntüler üzerinde çalışan u-net diye adlandırılımış şöyle bir yapı var
bu karmaşık ağ yapısı ve kullanımı için Kaggle 'ın "Ultrasound Nerve Segmentation" yarışması için hazırlanmış çalışmaya
ultrasound-nerve-segmentationbakabilirsiniz.
Unutmadan Dice ölçütünden de bahsedelim;
wikipedia da Sørensen–Dice coefficient diye geçiyor teferruatını merak edenler oraya bakabilir.
Biz burda olabildiğince sade anlatmaya çalışacağız.
Ağın eğitimi dediğimiz şey hatasını görmesiyle ! mümkün. Ağın hesapladığı çıktı ile gerçekte olması gereken çıktı rasındaki fark bize hatayı veriyor ve hata değerimize göre ağın içindeki parametreler düzeltilerek,k hatayı minimize etmeye çalışıyoruz. Eğitim dediğimiz bu.
Bizim problemimizde aslında nokta bazında bir sınıflandırma yapılıyor. Bir noktanın iki ihtimali var. Ya Bir binaya ait yada değil. Ama şöyle bir problem varki elimizdeki verilirin çoğunda noktalar bir binaya ait değil. Bu yüzden klasik bir hata hesabıyla elde edeceğimiz sonuç bize doğru bir hata değeri vermiyor. Örneklendirelim
Resimlerde Bina olan kısımlar beyaz diğer kısımlar arka plan siyah gösteriliyor.
Ağımız şöyle bir çıktı hesaplamış olsun
Gerçekte olması gerekense şu olsun
klasik bir fark ile hesaplarsa bu iki resim arasındaki tutmayan kısımlar, yani bina yı arka plan yada arka planı bina diye tahmin ettiğimiz yerler
Koca resmin çok az bir kısmı tutmamış :) . Bu şekilde hesaplanan hata değeri oldukça küçük çıkacaktır. Küçük hata değeride eğitimin yetersiz olmasına sebep olur.
Oysa gerçekte sadece binaya bina dediğimiz şekilde bakarsak
gördüğünüz gibi Binanın olduğu yeri tahmin olarak çok küçük bir kısmı doğru tahmin etmiş ağ.
Bu problemin çözümü için şöyle bir hesaplama yapılıyor. Bina için Doğru hesaplanan noktaların sayısının iki katı alınıyor ve bu sayı hesaplanan ve gerçek çıktı resimlerindeki noktaların toplamına bölünüyor. Hiç tutmadığında 0 . ve tamamen çakıştığında 1 çıktısı veren bir ölçüte sahip olmuş oluyoruz.
Ölçüt tek başına bir işe yaramıyor bu ölçütten bir hata değeri hesaplayan bir özel bir loss fonkisyonu yazmamız lazım ki Eğitime bir faydası dokunsun.
Nasıl kodlandığını görmek isterseniz
github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.pybu dosyadan dice_coef ve dice_coef_loss fonksiyonlarını inceleyebilirsiniz. Bizde eğitimizde bu metriği ve loss fonkisyonunu kullandık.
Sonuçda bir kaç günü aşkın eğitim ve ağ düzenleme faaliyetleri sonunda Yukarda videoda gördüğünüz sonuçlara ulaştık.
Dice ölçütü
Eğitim verisi için 0.9148'e kadar yükseldi.
Test verisi için 0.7530
Her türlü görüş, düzeltme , soru ve önerilerinizi bekleriz.
Hiç yorum yok:
Yorum Gönder