Sayfalar

python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Pazar, Eylül 15, 2019

Python dan EXE ye çevirmek...


C/C++ ile programlamaya başlayan biri olarak Python ile program yazmak oldukça zahmetsiz geliyor. Bir kütüphane kurmak çoğu zaman komut satırında bir "pip"  yazmayla halloluyor. Keza kodun içerisinde de bir "import" ile kurulmuş kütüphaneyi kullanmaya başlıyabiliyorsunuz.

C/C++ da olsa bir kütüphaneyi kurmak için ya o kütüphaneyi derlemeniz gerekiyor ya da kullandığınız derleyiciyle derlenmiş kütüphaneyi bulmanız gerekiyor. Keza yazdığınız kodda kütüphaneyi çağırabilmek içinde bir sürü formaliteyi halletmiş olmanız lazım. Bu konu çok sorulduğundan hakkında  Kütüphane kullanımı diye yazı bile yazmıştık. Bütün bunların üstüne programınızı derleyip çalıştırmışsanız. Çalıştırılabilir halini kolayca başkalarıyla paylaşabiliyordunuz. Yanına eğer gerekiyorsa kullanılan dinamik kütüphaneleri -DLL- koyarak elbette.

Pythonda bu imkan kolay değil. Kodu verebilirsiniz elbette ama insanlar sadece kullanmak istiyorsa bile mecburen python ve gereken paketleri kurmaları bekleniyor. Helede kullanıcının programlamayla ilgisi yoksa bu seçenek tümden zor oluyor. Yada python dosyalarından çalıştırılabilir dosya çevrimi yapan bir uygulama kullanacaksınız. Bundan önceki 3 yazımızda FastText ve onun için yazdığımız GUI programından bahsettik. GUI programının kullanımını kolaylaştırmak adına bizde exe formatına çevirelim dedik. Ve kolları sıvadık

Python kodlarını çalıştırılabilir hale getirmek için değişik projeler oluşturulmuş benim görebildiklerimi listeleyim 
Uzun boylu bir inceleme yapmadık. Kabaca bir araştırma sonrası biz PyInstaller kullanmaya karar verdik.  Birileri oturup incleyip karşılaştırma yaparsa bizde seviniriz. Çalışmaların çoğunun yaptığı aslında çevrilmesi için belirlenen python dosyasından o dosyada kullanılan paketleri tespit edip sonra ilgili dönüşümleri yapmasıyla oluyor. Elebette zor bir işlem helede kurulmuş paket sayınız çoksa. Burda önerim yeni bir ortam - virtual environment - kurmanız.  Benim bilgisayarımda Anaconda verisyonu var.  conda komutuyla hemde python versiyonu seçerek oratm kurabiliyorsunuz

conda create -n pvinst python=2.7

komutuyla pvinst isimli bir ortam kurduk. Bu ortamı activate komutuyla aktif edip içine sadece fasttextgui için lazım olan paketleri kuruyoruz.
artık pyinstaller komutunu kullanabiliriz. genel hali şöyle
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
                   [--add-data ]
                   [--add-binary ] [-p DIR]
                   [--hidden-import MODULENAME]
                   [--additional-hooks-dir HOOKSPATH]
                   [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
                   [--noupx] [--upx-exclude FILE] [-c] [-w]
                   [-i ]
                   [--version-file FILE] [-m ] [-r RESOURCE]
                   [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
                   [--win-no-prefer-redirects]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER]
                   [--runtime-tmpdir PATH] [--bootloader-ignore-signals]
                   [--distpath DIR] [--workpath WORKPATH] [-y]
                   [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]
                  
biz öyle teferruata felan girmeden

pyinstaller fasttext_gui_main.py --clean


diye yazıyoruz ve gereken dosyalar oluşturuluyor. Elbette sonucu denemeniz ve gereken ilave dosyalarıda toplamanız gerekiyor.

GUI içinde düğmelerde kullanılan görüntü dosayalarını diziniyle birlikte ilgili dizine atıyoruz
GUI programı aslında arkaplanda alt işlem olarak fasttext.exe yi çalışıtırıyor. fasttext.exe de bazı DLL dosyalarına ihtiyaç uduryor onlarıda ekliyoruz.
Her nedence pygal ın css ile kısmında bütün  herşey ilgili dizine aktarılmamış. O dosyalarıda ekliyoruz.
artık elimizde çalıştırılabilir FastText GUI var  hayırlı olsun

Indirmek için github hesabının release sayfasına buyrunuz

bu sayfadaki daki fasttext_gui_main.7z isimli  sıkıştırılmış dosyayı indirip açın "fasttext_gui_main.exe" dosyasını çalıştırın

Her türlü görüş ve öneriliriniz bekleriz. Eğer kısmet olursa FastText yazılarımıza kelime vektörleri ile ilgili  konularda devam edeceğiz

Pazartesi, Ekim 08, 2018

DeepCon'18 payment anomaly workshop

DeepCon'18 geçtiğimiz cuma ve cumartesi günü yapıldı. Yoğun bir katılım vardı. Emeği geçen herkese burdan teşekkür etmek isteriz. Pek çok konu konuşuldu. Bence çok daha önemlisi ilgili insanlar bir araya geldi. İletişim pek çok zaman gelişmedeki temel motor işlevini görür. İnsanların bir şeyler yapma ve öğrenme gayretini görmek, Yada yaptıklarınızın takip edildiğini öğrenmek gayretinizin artmasına vesile oluyor.

SefaMerve.com ArGe Merkezinin çalışmalarından bahsettiğimiz, "Eticarette yapay Zeka Uygulamaları" başlıklı  bir sunumumuz oldu. Sunumu Cüneyt bey yaptı. Sunumun ilk kısmında "Payment Anomaly" başlıklı bir kısım sonrasında genel yapılanlar anlatıldı. Ben burada İlk kısım için biraz daha teferruatlı bir açıklma yazmak istiyorum. İnşallah birilerine Faydalı olur.

Bir E-Ticaret firmasının helede Uluslararası satışı varsa pek çok kaynakdan ve çeşitli kurlarda tahsilat yapması gerekmektedir. Pek çok banka, değişik ödeme türleri ( paypal, paybyme vs... ) gibi Değişik ülkelerde çalışmaktadır. Yani sistemin sağlıklı yürüyebilmesi için pek çok tahsilat sisteminide sağlıklı yürüyor olması lazımdır.

Biz tahsilat sistemindeki olası anormalliklerin tespiti için, her türdeki alt sistem için yapılan saatlik tahsilatların toplamlarını bir zaman serisine dönüştürdük. Sonra 24 saatlik veri ile 25. saat deki değeri tahmin edecek bir model kurduk.  Tahmin ve gerçek değer arasındaki belli eşik edeğerinden fazla farklılık ve bu farklılığın belli saat boyunca devam etmesinin bir anomaly olacağını varsaydık.




Çalışmamız bu anlamda klasik bir zaman serisi tahmini modeline benzetilebilir. Bir kaç özelliği var ; çok girişli, çembersel normalizsayon, gurup normalizasyonu.

Circular Normalization:

Genelde İnsan davranışları için elebtte burda bizim ana ilgimiz olan satın alma için  zamanın önemi büyük. Zamanın dönügüleri var.  Gün içinde bazı saatlerde satışlar artarken bazı saatlerde çok düşe biliyor. Haftanın günlerine görede bu değişimi gözlemleye biliriz, hafta içi ile hafta sonu davranış farkları olması gibi. Normalde bu döngüsel zaman değerlerinin girişi klasik kategorik veri gibi yapılmaktadır. yani mesela haftanın günleri için.
Pazartesi : 0 0 0 0 0 0 1
Salı         : 0 0 0 0 0 1 0
 ...
Pazar      : 1 0 0 0 0 0 0
 gibi Bu durumda her bir günün bir birine uzaklığı eşit olmaktadır.  Oysa Cumartesi gününün Pazar gününe uzaklığı ile Çarşamba gününe uzaklığı farklıdır.


Biz bu tip döngüsel kategorik değişkenler için Birim çember üzerinde eşit aralıklı  noktalar olarak Normalize etmeyi kullandık. Üstteki grafikde olduğu gibi.  Pazar Günü pazartesi ve Cumartesi gününe yakındır.  Bu şekilde bir dönüşümün bir faydasıda girdi büyüklüğünün küçülmesidir. Kasik metodla kodladığımızda 7 lik vektör olarak kodlayabilirken. Çembersel  Normalizasyonla 2 lik vektöre dönüştürmüş oluyoruz. Bu sayede günün hangi saati olduğunuda 24 yerine 2 lik vektör olarak kodluyoruz. Yada Ayın hangi günü olduğunuda 31 lik vektör yerine 2 lik vektör olarak kodlamış oluyoruz. Bu tip bi kodlamanın daha önce uygulandığına dair bir bilgimiz yok. İşin akademik yönünüde klasik metodlarla karşılaştırıp teferruatlı test etme imkanımız olmadı malesef.  Tecrübi bir yöntem olarak bahsetmiş oluyoruz.

Grup Normalization :

Zaman serisinde tedrici genel - belki mevsimsel - bir değişim olabilmektedir. Zaman serisinin normalizasyonunda komple bütün serinin maksimum değerine göre yapılması bizce kısmen problem olabilir. Hele bu genel değeşim çok büyükse. Genel maksimuma göre normalizasyon yerine biz bu çalışmamızda giriş olarak aldığımız 24 saatlik gurubun maksimum değerine göre bir normalizasyon yapmayı tercih ettik.

Multiple Input Model :


Çok girişli bir ağ yapısını kullandık.  Çünkü ; Zaman serisi dışında tahmin etmememiz gereken saatin zaman döngüsünde nerede olduğunun da tahmin ile ilgili olduğunu düşündük ve onuda kattık.
İlk girdimiz zaman serisi ve 24 saatlik bir birini takip eden tahsilat değerleri  LSTM ile işleniyor.
İkinci girdimiz  Zaman ile ilgili verimiz 8 lik bir vektör . ( haftanın günü, saat, ayın günü, ay )  kalsik YSA katmanı - Dense layer -  ile işleniyor. Sonrasında bu iki kısım birleştiriliyor.



Sonuç olarak sıradışı bir anormallik tespiti yaklaşımı üzerine bir çalışma yapmış olduk. Koda ve verilere ve sunuma şağıdaki github sayfamızdan ulaşabilirsiniz

github.com/birolkuyumcu/deep_con18_payment_anomaly_workshop

Her türlü görüş ve önerilerinizi bekleriz.


Pazar, Temmuz 08, 2018

EKG Kalp Atışı Sınıflandırması 6

Sonuçların Analizi ;


Kalp atışı sinyalinin sınıflandırılması amacıyla bu yazımıza kadar 9 metodu kullandık. Yukarıda gördüğünüz grafiği bu sonuçları kullanarak oluşturduk.
Tabloyu da görelim sayılar daha net gözüksün


Tablodan görüldüğü üzere, Derin öğrenme için uyguladığımız 3 ağ tipinden, Conv1d ve LSTM sırayla ilk iki sıraya yerleştiler.  İlk sıradaki Evrişimli yapay sinir ağı, her 3 ölçüt e  - precision,     recall, f1-score - görede  en iyi sonuca ulaştı. Derin öğrenmenin  bu iki modelini Boosting metodları takip ediyor. Sırayla Light GBM, Xgboost, CatBoost , üçüncü , dördüncü ve beşinciliğe yerleşiyorlar. Hemde pratik anlamda ulaştıkları sonuçlar bir birlerinden pek farklı değil. Üstelik 'F' tipi sinyal için derin öğrenme metodlarından daha iyi bir sonuca ulaşmış. Sinyal sınıflarının f1-skor değerlerine göre grafiğine bakalım















Bu bize gösteriyorki, illa derin öğrenme gibi bir müşkülata girmeye gerek yok. Boosting metodlarıda pek güzel işimizi görebilir.

Son olarak En başarılı iki metod olan Conv1D ve LSTM sonuçlarını birleştirince - Ensemble -, bir gıdım daha iyileşme oluyor.

 Classification Report
             precision    recall  f1-score   support

          N      0.990     0.997     0.993     18118
          S      0.933     0.804     0.864       556
          V      0.973     0.954     0.963      1448
          F      0.856     0.735     0.791       162
          Q      0.997     0.987     0.992      1608

avg / total      0.987     0.987     0.987     21892
Elbette bunlar bizim ulaşabildiğimiz sonuçlar.  3. yazımızda geçen metodolojiyi çok daha sistematik ve derinlemesine uygulanırsa sonuçların bir nebze daha iyi olabileceğini düşünüyorum. İlk yazılarımızda bahsetmiştik veri kümemiz sınıf  bazında dengesiz. Buna dair sınıf bazında ağırlıklar yada özel hata fonksiyonları - loss - denenebilir.

Karşılaştırma ;


Veri setini hazırlayanların, yazdığı makalede paylaşılan , sonuç tablosu şöyle ;

Görüldüğü gibi , makaleye göre daha başarılı  sonuçlara ulaşmışız.  Tabloda geçen diğer çalışmaların aynı veri seti üzerinde yapılmadığından karşılaştırmanın çok sağlıklı olmayacağını düşünüyorum.

Son olarak "müşteri her zaman haklıdır" düsturunca.

"Bir çalışma yaptık , Doktorlardan daha iyi kalp rahatsızlığını tespit ediyor !!! "  
mealinde gaflet içinde bir cümle ASLA kurmuyoruz.
Doğrusunun, çalışmanın uygulanabilirliğini, konunun UZMANLARIYLA - yani doktorlarla - görüşerek yapılması gerektiğini söylüyoruz.

Bunca Yazıyı sabırla okuduysanız tebrik ediyoruz. Her türlü eleştiri , görüş ve önerilerinizi bekleriz.


Cumartesi, Temmuz 07, 2018

EKG Kalp Atışı Sınıflandırması 5

Derin Öğrenme

Evet son olarak günümüzün en popüler ve en güçlü yapay öğrenme metodu olan derin öğrenmeye geldi sıra. Malumunuz biz keras kütüphanesini kullanıyoruz. Bu problemi çözmek için 3 tane ağ tasarladık.  Hepsi için ortak kullanıdğımız parameterler şöyle
  • batch_size :  128
  • epochs :  120
  • optimizer :  adam

 Dense ;

İlki klasik yapay sinir ağı diyebileceğimiz, keras daki "Dense" katmanlarıyla oluşturulmuş bir ağ. Sklearn deki MLP nin benzeri bir çözüm diyebiliriz. Farklılığına gelirsek burda biz bunu keras kütüphanesini kullanarak uyguladık, ve 'Dropout' denen katmanlarda ilave ettik.


Eğitim grafiğimiz


Sonucumuz
  Classification Report
             precision    recall  f1-score   support

          N      0.983     0.995     0.989     18118
          S      0.916     0.664     0.770       556
          V      0.951     0.941     0.946      1448
          F      0.911     0.698     0.790       162
          Q      0.986     0.978     0.982      1608

avg / total      0.979     0.980     0.979     21892

Conv1D;

İkinci olarak Tek boyutlu evrişim katmanlarının kullanıldığı VGG tipi bir ağ tasarladık. Kısaca iki evrişim katmanı sonrasında boyut küçültme - bakınız pooling -  şeklinde tarif edilebilecek bir yapı.
Ağ yapımız böyle



Eğitim Grafiğimiz



 Sonucumuz
 Classification Report
             precision    recall  f1-score   support

          N      0.990     0.996     0.993     18118
          S      0.895     0.809     0.850       556
          V      0.971     0.950     0.960      1448
          F      0.826     0.735     0.778       162
          Q      0.998     0.986     0.992      1608

avg / total      0.985     0.986     0.986     21892

LSTM;

Son olarak Özyinelemeli Sinir Ağları - RNN - denen ağ yapısının en bilinen tipi olan LSTM  kullanıldı.  Bu tip ağlarda vectörel biri giriş değil, zaman da değişen değerler öğrenilir. Dizilimden bir sonuca ulaşma tipine "many to one"  diyorlar.

The Unreasonable Effectiveness of Recurrent Neural Networks
 Andrej Karpathy nin yukardaki yazısından detaylara ulaşabilirsiniz. Konuyu dağıtmadan devam edelim

Ağ yapımız şöyle



Eğitim Grafiğimiz



Sonucumuz
 Classification Report
             precision    recall  f1-score   support

          N      0.986     0.997     0.991     18118
          S      0.915     0.755     0.828       556
          V      0.964     0.938     0.951      1448
          F      0.813     0.673     0.736       162
          Q      0.996     0.980     0.988      1608

avg / total      0.982     0.983     0.982     21892

Sonuçlar hakkındaki görüşlerimizi bir sonraki yazıya bırakıyoruz. Sadece bu yazımıza kadar denediğimiz metodlardan en başarılısı evrişimli yapay sinir ağını uyguladığımız oldu deyip bitiriyoruz. Her türlü görüş ve önerilerinizi bekleriz.

Çarşamba, Temmuz 04, 2018

EKG Kalp Atışı Sınıflandırması 4

Gradient Boosting Kütüphaneleri ile Sınıflandırma

Boosting ve gradient boosting genel algoritmalar. Yaygın olarak bilinen hali karar ağaçlarıyla çalışanı. Çok kaba bir özet geçersek. Zayıf sınıflandırıcılar olan küçük karar ağaçlarının birleştirilmesiyle  oluşturulmuş güçlü bir sınıflandırıcı oluşturulmaya çalışılıyor.



Gradient Boost 'un sklearnin içinde de var. Fakat biz harici kütüphaneler olana XGBoost, Light GBM ve CatBoost 'u burada kulanacağız

XGBoost :  İlk çıkan ve popüler olan kütüphane. Özellikle Kaggle yarışmalarında çok kullanılıyordu.
Tantım yazısı ;
XGBoost is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable. It implements machine learning algorithms under the Gradient Boosting framework. XGBoost provides a parallel tree boosting (also known as GBDT, GBM) that solve many data science problems in a fast and accurate way. The same code runs on major distributed environment (Hadoop, SGE, MPI) and can solve problems beyond billions of examples.

LightGBM : Microsoft 'un geliştirdiği açık kaynak kodlu bir kütüphane, Epey güçlü ve yaygınlaşmaya başladı.
Tanıtım yazısı;
 A fast, distributed, high performance gradient boosting (GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.

CatBoost : Yandex'in geliştirdiği açık kaynak kodlu bir kütüphane, Nispeten çok daha az biliniyor ama en az rakipleri kadar güçlü. Yaygınlaşmaya çalışıyor.
Tanıtım yazısı;
 CatBoost is an open-source gradient boosting on decision trees library with categorical features support out of the box for Python, R

 Konunun detayları hakkında bir kaç bağlantı verip geçiyoruz.

 Kullanımları 

 Sklearn tipi bir kullanımları var.  Sınıflandırıcı nesnenizi oluşturuyorsunuz. "fit" fonksiyonu ile eğitim , "predict" fonskisyonu ile tahmin yapıyorsunuz.

XGboost için   :  "XGBClassifier" sınıfı kullanılıyor


Sonuç :
             precision    recall  f1-score   support

          N      0.981     0.999     0.989     18118
          S      0.966     0.667     0.789       556
          V      0.977     0.921     0.948      1448
          F      0.894     0.728     0.803       162
          Q      0.994     0.965     0.979      1608

avg / total      0.980     0.981     0.980     21892


LightGBM  için : "LGBMClassifier" sınıfı kullanılıyor


Sonuç:
              precision    recall  f1-score   support

          N      0.982     0.999     0.990     18118
          S      0.974     0.683     0.803       556
          V      0.980     0.927     0.953      1448
          F      0.876     0.741     0.803       162
          Q      0.995     0.973     0.984      1608

avg / total      0.982     0.982     0.981     21892

CatBoost için : "CatBoostClassifier" sınıfı kullanılıyor.



Sonuç :
              precision    recall  f1-score   support

          N      0.982     0.997     0.989     18118
          S      0.931     0.680     0.786       556
          V      0.973     0.918     0.945      1448
          F      0.848     0.722     0.780       162
          Q      0.987     0.972     0.980      1608

avg / total      0.979     0.980     0.979     21892

Sonuçlar çok büyük farklılık göstermiyor.
Boosting kütüphaneleri ile yaptığımız denemelerin sonuçları böyl. Bir sonraki yazımızda kısmetse derin öğrenme ile aynı probleme çözüm bulmaya çalışacağız. Her türlü görüş ve önerilerinizi bekleriz.

Salı, Temmuz 03, 2018

EKG Kalp Atışı Sınıflandırması 3

Scikit-Learn ile Sınıflandırma

Scikit-Learn  Python 'un standart Yapay Öğrenme kütüphanesidir.  Kalp atışı sınıflandırma problemi için bu kütüphane ile başlayacağız. Bu kütüphane devasa bir kütüphane aklınıza gelen hemen her tür metod için sınıflar, fonksiyonlar eklenmiştir. Pek çok sınıflandırıcıda hali hazırda emrinize amade beklemedektedir


Yukardaki resim sınıflandırıcı metdolarını karşılaştırmak için yazılmış örnek kodun çıktısıdır.

Sınıflandırıcı için alt sınırımızdan bahsetmiştik geçenki yazımızda. Bütün örneklere normal dersek %82 başarılı çıkıyordu. Önce onu deneyelim


Bu basit ve sade tahmin sistemi bizim alt çizgimiz bu yöntemle ulaştığımız sonuçlardan daha iyi sonuca ulaşamayan, sınıflandırcı metodlarını bu problem için kullanmanın anlamı yok.

Verimiz hazır, sklearn 'ün bir sürü sınıflandırıcısı da elimizin altında. Bundan sonra izleyeceğimiz metodloji şöyle
  1. Sınıflandırıcı Nesnesini oluştur.
  2. Eğitim verisi ile modeli eğit - fit fonksiyonu -
  3. Eğitilmiş model ile doğrulama  verisinden tahmin yaptır - predict -
  4. Tahmin edilmiş değerlerle gerçek değerleri karşılaştır - classification_report fonksiyonu -
  5. Karşılaştırılımış sonuçlar yeterince iyi ise 8. maddeye git
  6. Karşılaştırılımış sonuçları daha iyi hale getirmesni umduğumuz parametre değişikliklerini yap
  7. Yeni parametrelerle 1. maddeye dön
  8. Eğitilmiş model ile test verisinden tahmin yaptır - predict -
  9.  Tahmin edilmiş değerlerle gerçek değerleri karşılaştır - classification_report fonksiyonu -
bu admlardan en muğlak olan 6. olan  daha iyi sonuca ulaştıracak parametre değişikliği.  Bunu yapabilmek için ilk etapta Sınıflandırıcı nasıl çalışır , parametreler ne anlama gelir, bilgi sahibi olmamız lazım. Bunlara ek olarak hangi tür verilerde hangi tip değişiklikler olumlu etkiliyor  gibi tecrübe de gerekiyor. İlki İçin okuyup araştıracaksınız. İkincisi için tecrübe edeceksiniz.

Başlayalım denemelere 3 tip sınıflandırıcı deneyeceğiz.

KNN -  K-En Yakın Komşuluk

 Genellikle KNN olan kısaltılmış adıyla bilinir. KNN genel anlamda hem sınıflandırma hem de regresyon için kullanılabilir. Sklearn de sınıflandırıcı olarak kullanmak için "KNeighborsClassifier" kullanılır. Metodda veriler vektörel olarak ifade edilir. Tahmin işlemi için verilen vektör K adet en yakın komşusunun durumuna göre cevaplanır. Eğer Sınıflandırma problemi ise, K adet komşunun sınıflarının oy çokluğudur. Eğer regresyon ise En Yakın K adet komşusunun değerlerinin ortalamasıdır.
Mesela aşağıdaki grafikte rengi belli olmayan noktanın sınıfı, kendisine en yakın K = 3 komşusunun
rengine göre seçilir.


2 komşusu kırmızı, bir komşusu mavi, sonuç kırmızıdır.


SVM – Destekleyici Vektör Makinesi

Support Vector Machines; Destekçi Vektör Makinesi diye tercüme edilse de Türkçe kaynakların pek çoğunda kısaltma ismiyle SVM olarak geçer. Çekirdek -kernel- fonksiyonu ile veriler hiper uzaya aktarılır, guruplar arası hiper düzlemler hesaplanır. Bu düzleme en yakın veriler - ki destek vektörleri denir - kullanılarak, düzlem guruplar arası en optimum konuma yerleştirilir.
Sınıflandırma  aşamasında da veri hiper uzaya aktarılır ve eğitim verisiyle oluşturulmuş hiper düzleme olan konumuna göre değerlendirilir.






Grafikle kafanızda canlandırmaya çalışalım. Kırmızı ve mavi iki ayrı sınıfa ait veriler ve uzayda şekildeki gibi görünsün. Bu iki gurubu ayrıştıran bir doğru bulalım. Fakat şöyle bir durum var; bu iki gurubu ayrıştıran sonsuz sayıda doğru bulunabilir. Bir kaç tanesini kesik çizgili olarak çizdik. SVM eğitimi ile doğrumuzu guruplar arası en optimum yere taşıyoruz. Grafikteki yeşil çizgi gibi. Doğru bir kez tespit edildikten sonra kullanımı kolaydır. Bulduğumuz doğrunun solunda kalanlar mavi, sağında kalanlar kırmızıdır.
Sklearn de  sınıflandırıcı olarak kullanmak için  "SVC" kullanılır.

Yapay Sinir Ağı

Klasik çok katmanlı Yapay Sinir Ağı. Sklearn de "Multi-layer Perceptron" diye geçiyor. Hem regresyon hem sınıflandırma için kullanılabiliyor. Sınıflandırma problemi için "MLPClassifier" kullanılıyor. Metodun çalışma sistemi için açıklama yazmayacağım, Çünkü eski yazılarımızda çok fazla işlediğimiz bir konu. Biraz zahmet olacak ama kusura bakmayın...

Sonuçlar

KNN

             precision    recall  f1-score   support

          N      0.979     0.995     0.987     18118
          S      0.882     0.671     0.762       556
          V      0.946     0.906     0.926      1448
          F      0.791     0.679     0.731       162
          Q      0.994     0.954     0.973      1608

avg / total      0.974     0.975     0.974     21892

SVM

             precision    recall  f1-score   support

          N      0.961     1.000     0.980     18118
          S      0.984     0.570     0.722       556
          V      0.987     0.772     0.866      1448
          F      0.854     0.648     0.737       162
          Q      0.999     0.917     0.957      1608

avg / total      0.966     0.965     0.962     21892

YSA

             precision    recall  f1-score   support

          N      0.980     0.995     0.987     18118
          S      0.886     0.631     0.737       556
          V      0.966     0.901     0.932      1448
          F      0.815     0.654     0.726       162
          Q      0.979     0.979     0.979      1608

avg / total      0.975     0.976     0.975     21892

Sklearn ile yaptığımız denemelerin sonuçları böyle bundan sonraki  aynı konulu yazılarımızda, Başka kütüphaneler  ve metodlarla denemeler yapmaya çalışacağız. Her türlü görüş ve önerilerinizi bekleriz.

Perşembe, Mart 15, 2018

Sesim nasıl görünüyor ?


Fırsat buldukça Kaggle daki yarışmalara bakıyoruz. Pek çok alanda verilerle uğraşabilme imkanı veriyor. Geçenlerde Kaggle da Ses tanıma üzerine bir yarışma açıldı.
TensorFlow Speech Recognition Challenge
Binlerce farklı kişi tarafından seslendirilmiş  30 kelimelik 1 saniye uzunluğunda bir veriseti.  65.000 kayıt var. Seçilmiş on kelime
yes, no, up, down, left, right, on, off, stop, go
ve bu kelimelerin dışındaki kelimelere - unknown - bilinmiyor. Veya sessizlik yada konuşma dışı seslere - silence - sessizlik  ilavesi ile  12 sınıflı bir sınıflandırma problemi olarak verilmişti.

Klasik spektrogram dönüşümleri ve arkasına evrişimli sinir ağları ile sınıflandırma işlemleri yapılıyordu bizde öyle yaptık ilk etapta. Yarışma sonunda 0.82579 lik  bir  başarıya ancak ulaşa bildik yarışmanın birincisinin başarısı 0.91060. pekde parlak bir sonuç değil  1315 katılımcının içinde 441. olabilmişiz. Neyse asıl konumuz bu değil.

Hazır elimizde veri varken ses verisini poincare plot  metoduyla bir görüntüye dönüştürsek ve üzerinde (CNN ) Evrişimli Sinir Ağı denesek diye bir çalışma yaptık.  Hatırlarsanız bu konuda benim büyük bir umudum var. Bir çalışmaya başlamıştım ama devam edememişdim.
Poincare Plot Feature Extraction
Ses için öznitelik çıkarma yerine doğrudan ölçeklendirip renkli bir görüntüye çevirmeyi denedik.

Yukarda 'two'  ve 'stop' kelimeleri için üretilmiş resimlerden örnekler görüyorsunuz.
Sonuçlar hiçde iyi çıkmadı malesef. Üzerinde çalışmak gerekiyor elbette. Ama estetik ve fraktalvari grafiklerde çıkmıştı. Kaybolup gitmesindedik ve koda döküp yayınladık.
github.com/birolkuyumcu/sound2image
 sound2img.py ;  ses dosyasını okuyor ve rastgele belli büyüklükteki - kodda 4096 -  parçalarını seçip görüntüye dönüştürüyor ve png formatında kaydediyor. Mesela en üstte gördüğünüz resim  "sesim nasıl görünüyor" sesinin tamamının  resme dönüştürülmüş hali.

play_sound_with_imgs ;  ses dosyasını okuyor. Bir taraftan ses çalınırken diğer taraftan  çalınan kısmıda görüntüye dönüştürüp ekranda gösteriliyor.



mesala yukardakiler Çetin Akdenizin bağlamayla çaldığı Şeyh Şamil ezgisinden.


Birilerinin işine yaraması umuduyla. Her türlü görüş ve önerilerinizi bekleriz.

Salı, Ocak 16, 2018

2017 de neler yaptık

2018 in ilk yazısı olarak geçen sene neler yaptığımıza dair bir yazıyla başlamak istiyorum.  Öncelikle blogdan başlayalım.

Blog da yine uygulamalı ve pratik örnekler vermeye çalıştım. Yazılarımızın pek çoğu Derin öğrenme ile ilgiliydi.  Derin Öğrenme ile ilgili pek çok kütüphane ortaya çıkdı. Avantajlar , dezavatajları neler, Hangisini tercih etmek lazım ? gibi sorulara cevap niteliğinde  yazılar yazdık


Özetle Elbette Caffede kullanıyoruz ama tercihimizi Keras dan yana yaptık.  Bu yüzden  Caffenin yanı sıra bu yıl Kerası da kullanmaya ve öğrendiklerimi anlatmaya başladım
 ilki temel açıklamalar hakkında bir giriş yazısı ikincide LSTM anlatılıyor ve zaman serisi ile bir uygulama yazıyoruz.

 
Semantik bölütleme bilgisayarlı görü ile ilgili autoencoder denen bir Ağ tipiyle Uydu görüntüsünden bina bulma işlemi yapdık. 



Duygu analizi diye geçen yazıdan Doğal dil işlemenin bir uygulamasını yapıyoruz.

Caffe ilede ilgili iki yazımız var
 İlkinde FCN ağ yapısında hazır bir caffe modelinin kullanımıyla semantik bölütleme yapılıyor.
Ağ yapısından bahsediliyor.

İkicisi aslında Caffe modellerini görselleştirip hangi katmanda neler oluyor görebilmemizi sağlayan bir uygulama.





 Açık kaynak kodlu bir proje olarak paylaşıyoruz.


 Elbette OpenCv hakkında da yazılar yazdık
 Yazılar  OpenCv nin pythondan kullanımı ve Derin Öğrenme modellerinin opencv içinden çağrılmasıyla ilgili.


Bu rda bahsettiklerimiz dışında da yazılarımız var. Bu senede klasik olan şey malesef  yine ilgi çok tepki yok  durumunun devam ediyor olması. Ben yinede hatırlatmış olayım her türlü görüş önerilerinizi bekleriz.

Çarşamba, Aralık 06, 2017

OpenCv ve Derin Öğrenme

OpenCv nin yeni versiyonundan bahsetmiştik.
Windowsda Python için OpenCv kurulumu
En büyük yenilik  Derin öğrenme modellerini  opencv içinden çalıştırmanıza imkan  sağlayan DNN  modülünün, ana dağıtıma eklenmesi olmuştur.  Halen yoğun bir şekilde geliştirilen bir modül. Derin öğrenmenin üst düzey popülerliğinde  opencv camiasıda buna kayıtsız kalamazdı. Bizde bu yazımızda bu modülü kullanan bir örneği anlatıp paylaşacağız.

Öncelikle DNN den bahsedelim. OpenCv nin DNN modülü genel bir ihtiyaç aslında. DNN ağlarını eğitmek için pek çok kütüphane meydan çıkdı. Her birsinin değişik iyi ve kötü yanları var. Bizde iki yazıyla bu konudan bahsettik
Derin Öğrenmede Kütüphane Savaşları 1 , 2
Bir başka ve daha yaygın ihtiyaç daha var. Eğitilmiş modellerin kullanılması. Elbette kendi kütüphaneleri içinden kullanmanız mümkün. Ama hem caffe, hem torch , hem tensorflow  kütüphanesini kullanmak istersek ne olacak ? her birisiyle ayrı ayrı uğraşmak yerine bir kütüphane olsa eğitilmiş modelleri sadece çalıştırmak için kullanabilsek.  İşte OpenCv de DNN tamda bu iş için geliştiriliyor. Şimdilik en büyük eksikliği sadece cpu üzerinden çalıştırılıyor olması. Halen vadettiklerini hepsini gerçekleştiremiyor ama yoğun olarak geliştiriliyor.

Gelelim DNN örneğimize. Biz bu yazımızda bir nesne tespit ağı olan SSD nin hafif versiyonu Mobil SSD ağını çalıştıracağız.
SSD bahsedelim ,  Single Shot MultiBox Detector   kelimelerinden oluşturulmuş bir kıslatma.
2015 yılında,  Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg  kişiler tarafından yayınlanan
SSD: Single Shot MultiBox Detector
makalesiyle ortaya çıktı. Ağ yapısı

başlangıcı VGG sonunda ise nesne sınıfı ve konumunu gösteren çerçeve veriyor.



Ana SSD github sayfası
github.com/weiliu89/caffe/tree/ssd
Bizim bu gün kullanacağımız Mobile SSD github sayfası
 github.com/chuanqi305/MobileNet-SSD
 Gelelim koda ;

Kodu kullanabilmeniz için OpenCV  3.3 ve üstü lazım.

OpenCV de caffe modeli kullanabilmek için  2 dosya lazım
  • Ağ yapısını tutan prototxt dosyası
  • Eğitilmiş Ağ ağırlıklarını içeren caffemodel uzantılı dosya

cv2.dnn.readNetFromCaffe fonksiyonuyla bu ikisini kullanarak ağı  oluşturyoruz.



Ağı çalıştırmak için kullacağımız görüntüyü öncelikle ağın giriş ebatına (300x300) çeviriyoruz. Sonrasında görüntüyü cv2.dnn.blobFromImage fonksiyonuyla blob a çeviriyoruz.  Oluşturduğumuz ağ nesnesine bu blobu verip ağı çalıştırıyoruz.


Çalışan ağ bize tespit ettiği nesneleri ve konumlarını ve tespitin eminlik değerini verir. Bundan sonrasında resim üzerinde çerçeve ver sınıf bilgilerini yazdırıyoruz.



Koda OpenCv kitabının kodlarının python versiyonlarını yazdığımız 
github.com/birolkuyumcu/opencvbook_python
ders 13 olarak ulaşabilirsiniz
her türlü görüş ve önerilerinizi bekleriz





Salı, Ekim 10, 2017

Keras ile Duygu Analizi

Bir başka Keras uygulaması ile yine burdayız. Bu uygulamamız, doğal dil işleme ( NLP ) alanında olacak. Metinden duygu analizi  (Sentiment Analysis) üzerine bir çalışma yaptık.

Doğal dil işleme üzerine bir uygulama geliştirmenin ana zorluğu metinin sayılara dönüştürülmesi. Genel olarak kullanılan metodlar.
  • Kelimeler için vektör karşılığı ( WordVect)  hesaplamak ve bu vektörleri bir dizi şekilde vermek.
  • Kelimeleri bir dizi de tutup orda belli büyüklükte vektörlere eğitim esnasında çeviren Embeding katmanını kullanmak 
  • Metinin harf dizisi olarak düşünüp.  Her harfi harf sayısı kadar uzunlukta bir vectörle ifade etmek.
 Metinden duygu analizi çalışmalarında  genellikle verilen metnin olumlu yada olumsuz olduğunun tespiti üzerine çalışılır. Bizim kullandığımız veri seti de Twitlerin olumlu yada olumsuz olması hakkında.

Veri setimiz hakkındaki bilgilere ve verisetinin kendisine burdan ulaşabilirsiniz

thinknook.com/twitter-sentiment-analysis-training-corpus-dataset-2012-09-22/

Veri setimizde toplamda 1578624 adet kayıt var.
Olumlu   :    790184
Olumsuz :    788440
olumlu ve olumsuz nitelikli metinlerin sayılarıda aşğı yukarı eşit.

Biz metinin sayıya çevrilmesi için harf bazlı bir sistem uyguladık. Veri üzerinde herhangi bir filitreleme yapılmadı. Sadece küçük harfe çevrildi. Metinlerde geçen harler çıkarılıp birer sıra no karşılığla bir sözlükte -dict - tutuldu.
{'\t': 0,
 '\n': 1,
 ' ': 2,
 '!': 3,
 '"': 4,
 '#': 5,
 '$': 6,
 '%': 7,
 '&': 8,
 "'": 9,
 '(': 10,
 ')': 11,
 '*': 12,
 '+': 13,
 ',': 14,
 '-': 15,
 '.': 16,
 '/': 17,
 '0': 18,

...
Veri sadece Ağ yapısı olarak LSTM bazlı basit bir sistem kuruldu. LSTM de dizinin tersine sıralamasınıda hesaba katan Bidirectional katmanı ile birlikte kullanıyoruz.

 Layer (type)                 Output Shape              Param # 
===================================
bidirectional_1 (Bidirection (None, 150, 278)          310248  
_________________________________________________
bidirectional_2 (Bidirection (None, 278)               464816  
________________________________________________
dense_1 (Dense)              (None, 2)                 558     
________________________________________________
activation_1 (Activation)    (None, 2)                 0       
====================================

Total params: 775,622
Trainable params: 775,622
Non-trainable params: 0

Veri epey büyük olduğunda eğitim epey uzun sürüyor biz bir kontrol başarısı %85 civarında kesdik.
Çalışmamıza burdan erişebilirsiniz
github.com/birolkuyumcu/ddm_blog_examples/tree/master/sentiment
 Üzerinde çalışılması lazım elbette ama bence bu halide fena değil. Bir örnek verelim
"Got the Macbook Pro seller to send me the serial number of the machine before I paid.
Turns out its just a macbook so not buying it now"
 bu twit için  modelimiz.  0.623167 oranıyla olumsuz diye karar vermiş
aynı twitin başındaki kısmı alıp sorduğumuzda
"Got the Macbook Pro seller to send me the serial number of the machine "

haklı olarak  0.62573 oranıyla olumlu cevap vermiş.

Giriş niteliğinde, harf bazlı, LSTM içerikli bir çözüm. Bir başlangıç noktası olmasını umuyor, görüş ve önerilerinizi bekliyoruz...


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

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.