Semantik Bölütleme ve Autoencoder

0
88
Semantic Segmentation and Autoencoder

Başlıktanda anlaşılacağı üzre semantik bölütlemeye devam edeceğiz.

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.html

bir 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 256×256 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 Keras

yazı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 API

Yazı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-segmentation

bakabilirsiniz.

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.

Çıktılar

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.py

bu 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
Test verisi için 0.7530

‘e kadar yükseldi.

Her türlü görüş, düzeltme , soru ve önerilerinizi  bekleriz.

Birol Kuyumcu

Facebook Yorumları