Pazartesi, Mart 13, 2017

Semantik Bölütleme ve FCN

Resimde nelerin olduğu dışında,  konumlarınıda öğrenmemizi gerektiren pek çok durum vardır. Mesela otonom araç etrafındaki nesneleri konumları ile tanıya bilmelidir ki çarpışma olmaksızın hareket edebilsin. Resimde konum belirlemenin iki şekli var.
  • Kutu içerisine alma
  • Semantik Bölütleme - Sematic Segmentation -
Biz bu yazımızda semantik bölütleme üzerine bir örnek gösterceğiz.  Resimde semantik bölütleme dediğimizde kast edilen, Resimdeki her pikselin neye ait olduğunu ayırabilmektir.



Yukarda resimde görüldüğü gibi köpeğe, kediye, ve kanepeye ait pikseller ayrıştırılmış. Peki Nasıl yapılıyor ?

Görüntü sınıflandırma için CNN yapsından bahsetmiştik.  ( bakınız )


Yıllardır görüntü bazlı problemler için CNN in eline su dökebilecek bir metod çıkmadı. Ağ yapılarında düzenlemeler, yeniliklerle , kendi kendiyle yarıştı.  Ağın genel yapısı yukarda gördüğünüz gibidir.  Kabaca giriş resmi üzerinde uygulanan konvolüsyon katmanları  ile öznitelik çıkarma, sondaki YSA katmanları ile çıkarılmış özniteliklerden sınıflandırmayı öğrenme işlemi yapılmaktaydı. Semantik bölütleme içinde bu yapıdan faydalanıldı.



Yukarda görüdüğünüz şekilde bir ağ yapısı oluşturuldu. CNN den farklı olarak, baştan sona  konvolüsyon katmanları kullanıldı.  Bu yeni tip Ağ yapısıda Fully Convolutional Networks olarak adlandırıldı. YSA yerine geçen katmanlarla, ağın çıkışı ebatları girişiyle aynı hale getirildi. Ek olarak ayrıştıracağı sınıf sayısı kadar kanala sahip bir matris üretildi. Mesela 5 sınıfa ait bir bölütleme işlemi yaptığımızı varsayalım

HxWx3 ( RGB )   ----->  FCN  ----->   HxWx5

Çıktıyı iki şekilde düşünebiliriz. 

Giriş resminin hep pikseli için sınıflandırma sonuç vektörü. yani HxW tane 5 lik vektör
Her sınıf için piksellerin o sınıfa ait olma ihtimalini gösterer Matrisler

İşin teferruatları ve terorisi için aşağıdaki makaleleri incelemenizi tavsiye ediyoruz
  1. Fully Convolutional Networks for Semantic Segmentation 2015
  2. Fully Convolutional Networks for Semantic Segmentation 2016
Makelelerinde tarihlerinden anlaşılacağı gibi çok yeni konular.  Medikal görüntülerden uydu görüntülerine, IHA görüntülerine, Radar görüntülerine, vs  vs .. kullanılabilecek uygulama alanı çok geniş bir metod.

Makalelerde geçen  FCN-32s, FCN-16s ve FCN-8s  tabirlerinin sizin ne ifade ettiğini



  yukardaki resimle gösterelim. Bölütleme kesinliği sondaki sayı ile ters orantılı. Gerçek bölütleme sonucuna en uygun sonuçlar FCN-8s ile elde ediliyor.


Gelelim bizim uygulamamıza. FCN ağ yapısının caffe kütüphanesi ile uygulanmış olduğu açık kaynak kodlu proje sayası var.

http://fcn.berkeleyvision.org

Bu sayfa sizi bir github sayfasına yönlenidir. Orada  değişik veri setleri ve için değişik ağ yapılara ve modellere ulaşabilirsiniz

Biz örneğimiz için  'fcn8s-heavy-pascal'  model tanım ve  ağırlık dosyalarını indirdik
  • fcn8s-heavy-pascal.prototxt
  • fcn8s-heavy-pascal.caffemodel
Bir ipython dosyası yazdık. Bu model 500x500 ebatında renkli resim alıp 20 sınıf + 1 Arka plan  olmak üzre 21 sınıflı 500x500x21 lik bir matris çıktısı veriyor. bir    Sonuçlar şöyle




Bisiklet sınıfı için  ihtimal  görüntüsü


Bölütleme sonucuda
Bisiklet için


Köpek İçin




gibi görünmektedir. Sonuç olarak bıyık filtrresinin !  :)  çıkardığı aksilik dışında gayet iyi çalışıyor.

Kodun içine elimizden geldiğince açıklama satırlarıda koyduğumuzdan burda ek açıklama yapmaya gerek duymadık.   Kod için bakınız

https://github.com/birolkuyumcu/ddm_blog_examples/tree/master/fcn-caffe

 Yinede anlaşılmayan yerler varsa, yada bu konularda görüş ve önerileriniz varsa iletişime geçebilirsiniz.

Hiç yorum yok: