Pazar, Ağustos 27, 2017

Derin Öğrenmede Kütüphane Savaşları 2


 TensorFlow

TensorFlow  kütüphanesi bir Google ürünü. Açık kaynak kodlu ticari kullanıma uygun lisanslı. Geç çıkmasına rağmen, Google'ın iteklemeleriyle - destek kelimesi az gelir diye böyle yazıyorum - epey bir öne çıktı. Derin öğrenmeyi ilk farkeden şirketlerden olması sebebiyle firmalarında bu işle uğraşan epey insan vardı. Bunların hemen hepsi - el mahkum -  tensorflow'a geçti. Theanonun üstünde çalışan popüler kütüphane Keras'ın geliştiricisini işe aldı. Keras theanodan sonra tensorflow üzerinede çalışmaya başladı. Hızını alamadı, Kerası bir alt küme halinede getirdi.
Tensorflow'u bulut da daha bir hızlı çalıştıracak donanım çıkardı tensor processing unit. Bu adımıyla hem NVIDA hemde Amazona tehdit oluşturdu.
İşin ticari yönündeki gelişmeleri öngördü. Yapılacak uygulamaların çoğunun web tabanlı servis olarak sunulacakdır. Bir strateji kurdu,  tensorflow yaygınlaştırılacak. Eğitilmiş modelleri sunan sistemler kurup ordan para kazanmak. Nitekim Algorithmia - open marketplace for algorithms -  google dan yatırım aldı
Sonuç olarak Google 'ın Vakti zamanında Microsoftun yaptığı tekelci hamlelerini andıran davranışlar sergilediğini düşünüyorum. Tensorflow hakkında teknik hiç bir söylemiyorum çünkü Yukarda bahsettiğim davranışları antipatik bulduğumdan hiç kullanmaya niyetlenmedim. Bence Tensorflow popülerliği zorakidir. Piyasadaki diğer kütüphanelerden olan üstünlüğüyle değil google'ın diretmesiyle bu haldedir. Tavsiye etmiyorum

CNTK 

Microsoftun  kütüphanesi ismi  "Microsoft Cognitive Toolkit"  olarak değiştirildi. Microsoft da derin öğrenmeye erken girişen firmalardan. CNTK 'yı denemek için niyetlenip incelediğimde tuhaf bir lisansla karşılaştım.
CNTK-1bit-SGD-License
ve vazgeçtim. Google ile aynı niyetle çalışmalarını sürdürüp ürününü popülerleştirmeye çalışıyor.
Reasons to Switch from TensorFlow to CNTK
 Programcıların gözdesi Kerasa da el  attılar tıpkı google gibi...


Using CNTK with Keras

Yine google gibi donanım işine el attılar TPU ya alternatif FPGA yi de öne sürüyorlar.
Rekabetten Kerasın güçlenmesini sevinsemde doğrudan CNTK yı tavsiye etmiyorum.

MxNet


Önceleri gariban şimdilerde Amazonun  desteklediği  bir kütüphane. 

MXNet - Deep Learning Framework of Choice at AWS

Apache da destekliyor

MxNet sponsored by the Apache Incubator
Eskiden beri windows desteği olan. Hatta  derlenmiş dağıtım sunan çok beğendiğim bir kütüphane. Derin öğrenmeye ilk başladığımda üzerinde denemeler yaptım. İlla python diye ısrarı yok   C++, R, Js,Julia hatta go ile yazabiliyorsunuz. Modaya uyup Kerasın altında çalışmaya adapte edildi.
Yanlız kerasın eski versiyonu üzerinde çalışıyor nedense. Yeni versiyon için desteğinde geleceği söyleniyor. 
MxNet ile devam etmemiş olmam yeterli dökümantasyon ve örneğin olmamasıydı. Yeni desteklerle bu eksikliklerini tamamlıyor gibiler.  Bir gözünüz MxNet te olsun derim ben...

Keras

Popüler üst düzey programcıların gözdesi  python kütüphanesi . Kullanımı çok kolay. Öğrenmesi kolay. Örnek ve destek çok.

Sonuç olarak Kerası kullanıyorum ve tavsiye ediyorum.
Elbettte eksiklilkeri var.
 Keras üst  düzey bir kütüphane, çalışabilmesi için altta başka bir kütüphanenin - backend- çalışıyor olması lazım.  Hali hazırda Theano , Tensorflow, CNTK  kütüphaneleri bu işlevi yerine getiriyor. MxNet 'in de eli kulağından  kerasın eski versiyonu için adapte edildi. yeni verisyonu için çalışmalar yapılıyormuş.  Allta çalışan kütüphanelerin sebep olduğu sıkıntılar

Eğittiğiniz modeller altta çalışan kütüphaneye göre değişiyor. Python dışında çalıştırmak için de genel resmi bir  çözüm yok malesef. (şunlar var ;  kerasify , keras2cpp )
Yeni katman tipleri yazmak gerektiğinde , genellikle kerasın imkanları yerli olmuyor. Altta çalışan kütüphaneyide biliyor ve iyi bir şekilde kullanabiliyor olmanız lazım.
Çok büyük veri setleri için modele hızlı veri besleme için dahili bir çözüm yok malesef.
Multi GPU desteği henüz yok sayılır. ( Mxnet le birlikte gelecek gibi görünüyor  bakınız )

Burda bahsedemediğimiz pek çok irili ufak kütüphanede vardır elbette. Biz hakkında az çok bilgi sahibi olduğumuz nispeten daha yaygın olanlardan bahsettik.

Şirketlerin Konumları

Kütüphanelerin savaşları dedik.  Durumu  savaşa ! çeviren şirketlerin taraf tutarak diğer seçeneklere karşı olmaları. Kütüphaneleri anlatıren bahsettik ama burda şirket şirket bir adaha yazayım. Beleşe tavsiyelerde bulanayım dedim

Google :  

Google bence yanlış yapıyor.  Tekelci bir anlayışla davranmanın kazandığın durumda şirket için iyi olması yapılan şeyin doğru olduğunu  göstermez. Tensorflow'u destekleyebilirsiniz ama diğerlerini ezmeye çalışmak doğru değildir. TPU  üretmek ve piyasaya sokmak isteyebilirsiniz ama diğer kütüphaneler ile kullanılabilecek alt yapıyı sağlamalısınız. Hiç olmadı Kerasa destek olmazız lazım.

Quaradaki "Is Google an evil company?" sorusuna şöyle bir cevap gelmiş
"The only significant difference between a kitten and a tiger is that the tiger is bigger"
Eğer kaplan büyüklüğündeyseniz hareketlerinize daha çok dikkat etmeniz gerekir. Aksi halde sorunun cevabı Yes olur.
  

Microsoft:

Google dan önce kaplan olmuş :) ve "Is Microsoft an evil company" sorusuna Büyük bir Yes cevabı almış ve bunun ceremesini yıllardır çeken bir firmadır. Google a göre daha temkinli davranmayı öğrenmiştir. Linux'a kapılarını açmış ordada iş yapmaya -Azure- başlamıştır.  Ortada bir sürü lisansı uygun kütüphane varken kendi yayınladığı ve yaygınlaşması için uğraştığı kütüphanenin bir kısmına Tuhaf bir bir lisanslama niye ayağına kurşun sıkar anlamış değilim...



NVDIA:

Derin öğrenmenin motor gücünü oluşturan GPU ların üreticisi olarak hemen her kütüphaneye destek veriyor. Verdiği desteklerin kütüphanelere zarar vermemesinide temin etmesi lazım diyorum. Digits altında kullanmak için değiştirdiği caffe sürümünü, ana geliştiricilerle ortaklaşa hazırlasaydı, şimdi caffe deki bu dağınıklık olmazdı muhtemelen.


Amazon:

İşlerinin bir kısmına gözünü dikmiş şirketler var ve Koştura koştura çalışıyorlar. Geç  farkına vardılar. MxNet i destekleme kararı aldılar ama bence yeterli destekde bulunmuyorlar halen.


Facebook:

Çok güzel bir ekip kurdular. Çok güzel çalışmalar da yapıyorlar.  Caffe2 ve Torch 'un arkasında durdular. İkisi içinde daha çok çalışmaları lazım. Torch lua sebebiyle popülerliğini kaybetti. Caffe2 ve PyTorch yeni çıktı sayılır. Yaygınlaşabilmeleri için epey bir emek lazım. 


Intel:

Ne yaptıkları belli değil. Beleş tiyolar verelim. 
Kütüphanelerin  cpu optimize halini çıkarmaları hikayedir. Paralel işlem yapabilen donanımlar geliştirip. Bunlara kütüphanelerin kolayca uğraşacağı ara kütüphanelerini yazmaları zorunludur.  Mesela NVDIA nın cuDNN kütüphanesi gibi .
cuDNN, hemen her derin öğrenme kütüphanesinde gpu için kullanılmaktadır. Intelde kendine bir yol seçmeli (OpenCL bazlı gpu larmı olur mi olur Yoksa FPGA mı olur )  
Sonra ona uygun ara kütüphane çıkarmalı
CL_DNN mi olur artık FPGA_DNN mi
Kütüphanelerin kendi donanımlarına adapte edilmesi için destek vermeli
piyasaya girmelidir. 
Hiç bir şey bilmiyorsa Theanoya ve libgpuarray'a destek verimesi lazım.


Son Söz 

Epey bir dağınık oldu kusura bakmayın.  Pek çoğuda şahsi görüş ağırlıklı oldu, o nazarla bakın. Her türlü eleştiri ve önerinizi bekleriz....

Cumartesi, Ağustos 26, 2017

Derin Öğrenmede Kütüphane Savaşları 1

    Artık derin öğrenme - deeplearning- çok moda bir kavram oldu. Her tarafta hakkında bir şeyler söyleniyor. Hiç aklınıza gelemeyecek konularda uygulamalar görüyorsunuz duyuyorsunuz.

Piyasadaki çoğu derin öğrenme kütüphanesi  -framework- açık kaynak kodlu ve ücretsiz kullanıma uygun lisanslı olarak bulunuyor.  Büyük şirketler, İlk etapta para kazanamasa bile, yaygınlık kazanacak , piyasada hakim konuma sahip framework'un sahibi yada hamisi olmak  istiyorlar.  Bunca popülerlik büyük şirketlerinde iştahını kabartıyor yani. Buda  savaşın daha da şiddetleneceğini gösteriyor.

Benim bakış açıma göre savaşın taraflarından ve kütüphanelerden bahsedeyim dedim.
Savaşın taraflarından olan başlıca şirketler ; Google, Facebook, Microsoft, Amazon, Intel...
kütüphanelerle ilgilir görüşlerimler şirketlerin konumlarından da bahsedeceğiz.

Caffe / Digits / Caffe2

Caffe piyasanın en eski kütüphnelerinden  C++ / Cuda temelli. Çoklu GPU deseteği var. Görüntü tabanlı problemler için oturmuş bir yapıda.  Bence ticari olarak doğrudan uygulamaya girebileceğiniz bir kararlılıkta. Benim için en büyük avantajlarından biride windows desteğinin olması. Intelin CPU optimize versiyonu da var. Caffenin OpenCL versiyonuda var.

Digits, NVDIA nın  daha çok Caffe tabanlı  belkide piyasada bulabileceğiniz yegane sağlam GUI . Kod yazma işleri ile fazla boğuşmaya gerek olmadan  yine görüntü tabanlı projeler için kullanabileceğiniz bir program.
  • Nesne Tanıma  - Object Recognition -
  • Nesne Bulma  - Object Detection -
  • Semantik Bölütleme  - Semantic Segmantation -
gibi problemler için doğrudan çalışmaya başlaya bilirsiniz.  Üstelik ülkemizde NVIDIA Deep Learning Institute (DLI) den sertifika alabileceğiniz eğitimi de var. bakınız 
openzeka.com/egitim/  

Caffenin eksikliklerinden bahsedelim.

1) Caffe malesef merkezi güçlü bir yönetime sahip olamadı. Pek çok değişik insan caffe bazlı pek çok değişik çalışma yaptı. Ama bu çalışmalar bölük pörçük sağda solda duruyor.  Ana kod deposuna vakti zamanında birleştirmeler yapılmadığından şimdi istensede bir araya gelemiyor.  Hatta NVDIA bile kendi caffe versiyonunu oluşturdu. Derin öğrenme çok hızlı gelişen bir alan olduğundan kütüphanenin güncel gelişmelere çok hızlı adapte edilmesini gerektiriyor.

2)  Görüntü dışı uygulamalar için gereken yapılar çok geç kütüphaneye dahil edilde ve halen çokda dökümante edilmedi. RNN yapıları gibi. Bu tür ihtiyaçları olan insanlarda başka kütüphanelere yöneldiler.

Caffe2, Başda Facebook olmak üzere değişik firmalar tarafından piyasaya sürüldü. Caffenin popülerliğinden de faydalanarak  daha çabuk yayılmayı hedefleyen bir proje. Vaadleri oldukça parlak;
mesela mobilde çalışma desteği. Henüz deneme şansını bulamadım ama caffe kullanıcısı olarak beni cezbeden bir yanı var.


Torch / PyTorch

Torch aslın da epey eski bir Yapay Öğrenme (ML) kütüphanesidir. Hatta torch'u temel alan bir bilgisayarlı görü kütüphanesi TorchVison hakkında bir yazı yazmıştık. Torch kütüphanesi zamanla değişti. Lua temelli scriptlerle çalışır hale geldi ve Derin öğrenmenin öncüleri tarafından da yaygınlıkla kullanıldı. C / Cuda temelli yapısı ile pek çok ortamda çalışabiliyor. Facebook 'un desteklediği bir proje. Artık windows desteğide varmış. Şahsi fikrim Lua bana sevimli gelmedi. Gerek Yapay Öğrenme gerekse Derin Öğrenmede ana tercih edilen dil python. Bu yüzden hiç kullanmayı düşünmedim.

PyTorch ; Lua dez avantajının onlarda farkına varmışlarki  PyTorch 'u çıkardılar. Çok övülen bir kütüphane ama yolun başında ve Yarışa epey geç katıldı. Halen Windows desteği yok...


Theano

Piyasanın eskilerinden ve malesef garibanlarından. Python temelli esnek bir yapısı olan bir kütüphane. Gariban çünkü doğrudan destek veren büyük bir firma yok. Windowsda kolaylıkla çalıştırabiliyorsunuz.  GPU desteği konusunda bir çalışması - libgpuarray  - var.  Cuda yada OpenCL de de çalışıyor. Türkçesi şu NVDIA gpunuz olmasada, diğer firmaların ürünleri ile derin öğrenmede  GPU kullanabiliyorsunuz. Doğrudan kullanmadım ama Keras 'ın altında theanoyu tercih ediyorum.

devam edecek...


Çarşamba, Ağustos 09, 2017

Windowsda Python için OpenCv kurulumu

 



Yazımınızın ana konusuna geçmeden bir duyuru ve bir soruyala başlayalım.

Önce duyurumuz.
OpenCv 3.3 yayınlandı ;  En bariz fark DNN kısmının  contribden ana dağıtıma aktarılması olarak görünüyor, Darısı epeydir contribde duran diğer kısımlara diyelim. Yeniliklere bakarsak
  • DNN : zaten var olan bir kısımdı ama ana dağıtıma girdi. Ve elbette gelişti. Örneklere göre Caffe 1 , Torch ve Tensorflow modellerini çalışıtrabiliyor.  Bence çok önemli ve yeni derin öğrenme kütüphaneleri desteğiyle güncel tutulması gereken bir kısım. Sadece eğitilmiş modeli kullanmakda eziyet olabiliyor.  DNN ile bu problem bir nebze olsun çözülüyor.
  •  "a language for image processing and computational photography" diye bahsedilen halide desteği gelmiş. Daha net bir şey görünmüyor ama  siftah yapmışlar :)
  • C++ 11 desteği gelmiş
  • Intel Media SDK ile video okuma yazma işlemlerinde donanım hızlanması sağlanmış 
  • Pek çok özellik eklemsi ve hata ayıklaması yapılmış.
Yeri gelmişken bahsedelim OpenCv ilk olarak Intelin Rusyadaki ArGe labaratuvarlarında ortaya çıktı. Ama Intel doğru bir strateji kuramadı. Pek çok hata yaptı
      OpenCv yi,  sattığı IPP kütüphanesine bir payanda gibi sığ bir düşüncesi vardı. Millet opencv öğrenecek  daha hızlı çalıştırabilmek için IPP satın alacaktı hesapta olmadı.
      Sonra bütün bütün elini ayağını çekdi. Buda ayrı bir hataydı. OpenCv gelişmeye devam etti.
 Intel yaptığı hatadan şimdi opencv nin ana geliştiricisi konumunda olan itseez 'i satın alarak dönmeye çalışıyor. İnşallah yine hatalı stratejilere yönelip opencv nin gelişimini engelleyecek adımlar atmaz...

Sorumuza gelirsek. 
"Pythonun pek çok kütüphane desteği var görüntü işleme için opencv kulllanmasak olmazmı ?"
 Benim şahsi görüşüme göre OLMAZ. OpenCv C++ tabanlı olmasıyla, hız olarak kullanmayı düşündüğünüz diğer kütüphanelerin pek çoğunun önüne geçer. İlaveten  OpenCv görüntü işleme ve bilgisayarlı görü alanındaki büyük çoğunluk  tarafından standart kabul edilen bir kütüphanedir. Bu size kaynak bolluğu olarak hemen gelir. OpenCv  kullanarak geliştireceğiniz bir uygulamayı pek çok değişik dile de taşıyabilirsiniz.

Gelelim ana konumuza.

Pythonda OpenCv  kütüphanesini nasıl kuracaksınız?

İlk seçenek OpenCv yi derlemek. Nispeten zor bir yol. Internette derlemenin uzun uzun anlatıldığı pek çok örnek görebilirsiniz, kitabımızda da var. Python için dikkat etmeniz gereken şey  python un kullandığınız versiyon için olan seçeneklerin dolu olması.  



mesela resimde benim derleme için kullandığım cmake dosyasından

derleme sonrasında cv2.pyd  bir dosya oluşturuluyor. Bu dosyayı pythonu kurduğunuz dizin altında
lib/site-packages 
dizinine atın. Eğer derlemeyi statik  yapmaıysanız,  opencv'in dinamik kütüphanelerininde ulaşılabilir yerde - baknız path tanımı - olması lazım.

İkinci ve daha kolay, derlenmiş hazır dağıtımı kullanmak.

Öncelikle sisteminizde Python 2.7.x 64 kurulu olmalı hatta tavsiyemiz. Anaconda dağıtımını kullanmanız.

Python hazırsa artık opencv ye geçelim.
opencv.org/releases.html
adresinden window için derlenmiş dağıtımı indirin


idirdiğiniz dosyayı çalıştırın dosya aslında sadece sıkıştırılmış dosyayı açıyor. Kendinizce uygun gördüğünüz bir dizine açın.

açtığınız dizinde  'opencv\build\python\2.7\x64' kısmında cv2.pyd dosyasını bulun.
lib/site-packages 
dizinine atın. Bu dağıtım statik olarak derlendiğinden sadece
opencv\build\bin
dizininde bulunan  "opencv_ffmpeg330_64.dll"  kütüphanesine bağlıdır.  Bunuda windows -path tanımlı - bir yere taşımanız gerekiyor. mesela pythonu kurduğunuz dizin.

Evet artık opencv python içinden kullanıma hazır.


deneme yapalım
komut satırından pythonu çalıştırın
import cv2
cv2.__version__
yazın  kurulumunzda bir hata yoksa size yüklü olan opencv nin versiyonunu gösteririr.

 Artık python içinden opencv 'yi kullanmaya başlaya bilirsiniz.  Geçen yazımızda bildirmiştik, kitabımızdaki opencv örneklerinin python versiyonlarını yazıyoruz. Yeni dersler eklendi. Yukardaki adımları yaptıysanız. Python örneklerini githubdan klonlayıp inceleyebilirsiniz



 Yazımızın sonuna geldik. her türlü görüş ve önerilerinizi bekleriz.

Cuma, Haziran 30, 2017

Python ile OpenCv


Malumunuz "OpenCv Görüntü İşleme ve Yapay Öğrenme" adlı bir kitabımız var. Hali hazırda 2. baskısı piyasada.  Bidiğiniz gibi kitabımızda konuları C++ bazlı anlattık.  Derin öğrenme konuları yüzünden Python diline geçdik.  OpenCv de lazım oluyor elbette.

OpenCv yi python ile kullanmak zor değil. Zaten python dili resmi olarak destekleniyor. OpenCv kurulumunda seçenek olarak python eklentisi bulunuyor.

Kitap içindeki örnekleri python ile tekrar yazmaya giriştim. Yeni baskısı olsunda python kısımı eklerim gibi bir durum ufukta görünmüyor malesef. Hali hazırda bir sene önce basılan kitaplardan epey var hala.

Bu durumda ; kitaptaki örnek derslerin python halini github'a attım. Çok karmaşık örnekler değil ama illa açıklama siterseniz kitaba bakmanız gerekebilir.  Hali hazırda ilk 6 ders var.

github.com/birolkuyumcu/opencvbook_python

Fırsat buldukça tamamlamaya çalışacağız bakalım kısmet...

Pazar, Haziran 18, 2017

Baki kalan bu kubbede bir hoş seda imiş





Saff Suresi
8. Onlar ağızlarıyla Allah'ın nûrunu söndürmek istiyorlar. Halbuki kâfirler istemeseler de Allah nûrunu tamamlayacaktır.
9. Müşrikler istemeseler de dinini bütün dinlere üstün kılmak için Peygamberini hidayet ve hak ile gönderen O'dur.
10. Ey iman edenler! Sizi acı bir azaptan kurtaracak ticareti size göstereyim mi?
11. Allah'a ve Resûlüne inanır, mallarınızla ve canlarınızla Allah yolunda cihad edersiniz. Eğer bilirseniz, bu sizin için daha hayırlıdır.
12. İşte bu takdirde O, sizin günahlarınızı bağışlar, sizi zemininden ırmaklar akan cennetlere, Adn cennetlerindeki güzel meskenlere koyar. İşte en büyük kurtuluş budur.
13. Seveceğiniz başka bir şey daha var: Allah'tan yardım ve yakın bir fetih. Müminleri (bunlarla) müjdele.
14. Ey iman edenler! Allah'ın yardımcıları olun. Nitekim Meryem oğlu İsa havârîlere: Allah'a (giden yolda) benim yardımcılarım kimdir? demişti. Havârîler de: Allah (yolunun) yardımcıları biziz, demişlerdi. İsrailoğullarından bir zümre inanmış, bir zümre de inkâr etmişti. Nihayet biz inananları, düşmanlarına karşı destekledik. Böylece üstün geldiler.

 İnna Lillahi ve İnna İleyhi Raci’un

Perşembe, Mayıs 11, 2017

CaffeNetViewer Caffe için görselleştirme uygulaması





Derin öğrenme ile ilgili kütüphaneler için yazılmış işimizi kolaylaştıran pek bir gui yoktur. Mesela Cafffe için  NVDIA nın Digits ürünü dışında herhangi bir uygulamayla karşılaşmadım. Digits ürünüde eğitim için yazılmış bir uygulama ve arka planda caffenin kendilerine has bir versiyonu üzerinde çalışıyor. Kullanıcının işlerinin kolaylaştırılmamasının sebebi ne  derseniz. Halen aktif geliştirme aşamasında olan sistemler. Geliştiriciler yeni özellikler, optimizasyonlar vs konularda oldukça meşguller. Kullanıcılar mecburen kendi başlarının çaresine bakmak zorunda kalıyorlar. Kendileri için bir şeyler geliştirenler olsada pek dışarıya açılmıyor.

Caffe ile olan çalışmalarda bizde mecburen kendi işlerimizi kolaylaştıran pek çok kodlar yazdık. Bu yazımızda benzeri ihtiyaçlar için yazdığımız bir uygulamanın sağını solunu düzeltip yayınlamak istiyoruz. 

Uygulamamızın adı CaffeNetViewer. Caffe Ağ yapısı ve ağın içinde verinin ne şekilde değişimlere uğradığını görebileceğimiz bir uygulama. Kullanımından bahsedelim.


Öncelikle Yüklenmesi gereken dosyaları  seçiyoruz
  •  Model dosyası (*.prototxt) 
  • Ağırlık dosyası (*.caffemodel)
  • Ağı çalıştırmak için kullanacağımız Görüntü dosyası
Sonrasında ağı çalıştırıyoruz.  Data katmanı olan giriş görüntüsünü ekranda gosterir. Ağın katmanları text olarak gösterilirilir. Katman ismi Tipi ve ebatları gösterilir.


Bundan sonra katmanlar arasında gezinti yapıp katman çıkış değerlerini görebilirsiniz


Katmanların çıkışlarını toplu olarak görebileceğiniz gibi katman katmanda görebiliyorsunuz.



Eksik olan kısımlar var. Fırsat bulursak tamamlamaya çalışacağız.

Kullanabilmeniz için yüklemeniz gereken paketler
  • Caffe ve  pyCaffe
  • OpenCv
  • pySide
Koda burdan ulaşabilirsiniz
github.com/birolkuyumcu/caffeNetViewer

Görüş ve önerilerinizi bekleriz

Salı, Nisan 25, 2017

Semantik Bölütleme ve Autoencoder

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

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

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.