Sayfalar

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

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





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


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

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.

Cumartesi, Kasım 26, 2016

Instagram Hesap Analizi 2

Evet cem yılmazın instagram sayfasını analiz ediyorduk. Devam edelim.

Beğeni ve yorum sayılarında zamanla bir değişim olmuşmudur diye bakalım.  Cem yılmazın instagram hesabında çok sık paylaşım olmadığından doğrudan zamanı kullanmak aldatıcı olur. Bu yüzden her 20 gönderi başına ortalama beğeni ve yorum sayısını hesaplayıp grafiğe döktük. Bizim çalışmamız yapıldığında 340 gönderisi vardı cem yılmazın  340/20 -> 17 tane veri noktası hesaplıyoruz.

Zaman İçinden beğeni sayısının değişimi




Zaman içinde yorum sayısının değişimi


Grafiklerden de belli olduğu gibi sayfanın başlangıcında yorumda beğenide nispeten azmış.
zamanla bu büyük bir artış göstermiş. muhtemelen zaman içinde cem yılmazın instagram sayfasının bilinirliğinin artması ve takipçilerinin çoğalması ile olmuştur.

Toplamda gönderi sayısının azlığı ve zaman içindeki değişim büyüklüğü gibi olumsuzluklar var. Bu zaman içindeki büyük değişim tahmin sistemini olumsuz etkileyeceği aşıkardır. Yinede biz  Görsel olarak az beğenilen çok beğenilen ayrımını yapabilen bir sınıflandırıcı eğitmeye çalıştık.

Resimleri beğeni sayısına göre sıralayıp, en beğenilen 120 ve en az beğenilen 120 resmi iki ayrı sınıf için eğitmek için alıyoruz. Caffe ile bir fine-tune işlemi ile eğitiyoruz ve test ediyoruz.

Sonuç :


Sınıflandırıcımız  ı 46 adet  eğitimde kullanmadığımız  gönderi ile test ediyoruz. Bu gönderilerin 23 tanesi az, 23 taneside çok beğenil olarak seçildi

Sınıflandırıcımız
  •   21 kez bu az beğenilir demiş 16 tanesi doğru sınıflandırılmış
  •  25 kez çok beğenilir demiş 18 tanesi doğru sınıflandırılmış
sınıflandırcının  ortalama doğruluğu % 73.9

Sınıflandırıcımız her iki sınıf içinde bir tahminde bulunur. her sınıfın ihtimalini verir. Toplamda 1 olan bu oranlardan yüksek olanını tahmin olarak kullanıyoruz.

Çok kaba bir beğeni sayısı tahmini yaparsak.

çok beğenilenlerin ortalama beğeni sayısı ->  m_mean
az beğenilenlerin ortalma beğeni sayısı -> l_mean
resmin :
çok beğenilme ihtimali : m_prob
az beğenilme ihtimali :  l_prob

beğeni tahmini = ( m_prob*m_mean  ) + ( l_prob*l_mean )

Mesela :

gönderisi için sistemimiz 10 bin 127 beğeni alır demiş.

Tahmindeki sapmayı ise başta bahsettiğimiz olumsuzluklara,  ilaveten de tahmin yöntemimizin çok kabalığına bağlıyorum. Siz nedersiniz bilmem ama bence yinde sonuç fena değil...

Daha çok gönderisi olan,  takipçi durumu  belli bir düzene girmiş hesaplar için daha başarılı çalışmalar yapılabilir.

Aslında görüntüler üzerinde kümelemelerde yapılıp onun üzeerinden de çıkarımlar yapılabilir. Şimdilik burda bitiriyoruz.

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

Çarşamba, Kasım 09, 2016

Pratik Caffe


Geçen hatfa sonu Caffe hakkında Ankara-Deep-Learning meetup gurubunun düzenlediği bir etkinlikte  bir sunum yaptık.

Sunumda Neler Anlattık
  • Caffe Nedir , Niçin Caffe
  • CNN nedir
  • Caffe Windows Derlenmesi ve kurulması
  • Komut satırı programlarla kullanım  ( caffe , convert_image_set , compute_image_mean )
  • Caffede kullanılan dosyalar ( Ağ model dosyası, Solver , ... )
  • Uygulama - Renk Tanıma 
  • Veri seti nasıl hazırlanır, 
  • Eğitim
  • Test 
Sonu biraz vakit darlığından aceleye geldi ama kullanılan kodlar ve bat dosyalar verildi

Sunuma : Burdan Ulaşabilirsiniz
Kod ve Veri Setini :  Burdan indirebilirsiniz
Derlenmiş Caffe : Burdan indirebilirsiniz
Offline Netscope - Caffe Ağ modellerini grafik olarak gösterir - 
github.com/birolkuyumcu/offline-netscope

Uygulama için 3 ayrı kodumuz var
  1. classify ipython notebook : Eğitilmiş Modelin kullanımını gösteriyor
  2. Test.py : Bir dizi görüntüler OpenCv ile yükleniyor caffede sınıflanıdırlıyor ve karşılaştırma -confusion- matrisi hesaplıyor 
  3. gui/colorRec.py : pySide ile  GUI yazıldı.
Önerilerinizi ve sorularınızı bekleriz....

Cuma, Ekim 21, 2016

Görünür ve Kızılötesi görüntülerle Gemi Sınıflandırma



Vais from bluekid on Vimeo.




Deniz trafiği kontrolünde gemilerin gece ve gündüz tanınması gerekiyormuş. Bu problemin çözümü için bir veri seti oluşturulmuş ve bir makale yazılmış.




Yukardaki fotoğraflara bakarsanız, geminin tanınması gereken görüntünün çok değişik uzaklardan değişik açılardan çekildiği görünüyor. Keza gündüz kızıl ötesi görüntü alınabilirken, gece el mahkum sadece kızıötesi görüntüler üzerinden tanınması gerekiyor.

VAIS: A Dataset for Recognizing Maritime Imagery in the Visible and InfraredSpectrums

University of Pennsylvania, Gwangju Institute of Science and Technology ve Jet Propulsion Laboratory, California Institute of Technology den araştırmacıların bir çalışması. Çalışmada tanıma algoritması olarak derin öğrenme  'Convolutional neural networks' - CNN kullanılmış. Bütün emeklerin üstüne birde veri setini umuma açmışlar, sağolsunlar.

Bizde fırsattan istifade bu veri setiyle Caffede bir çalışma yaptık. Caffedeki "bvlc_reference_caffenet" modeline ince ayar - fine tune - yaptık.
Caffe neymiş, ince ayar yapmak neymiş diyenler
yazılarımıza müracaat etsinler.

Makalede  görünürde %87, kızılötesinde % 61 başarıya ulaşılmış.



 Bizim ulaştığımız sonuçlar ise Görünürde %98, Kızılötesinde % 92 başarı oldu.

Kızılötesi için:




Gündüz Görüntüleri için 




Cumartesi, Temmuz 23, 2016

Deep learning based Visual Recommendation and Product Navigation Tool



Visual Recommendation and Product Navigation Tool from bluekid on Vimeo.

Bir Önceki yazımızda ayakkabı görüntüleri üzerinde çalışmıştık.  Aynı veriyi biraz daha genişletip devam edelim.

Varsayalım ayakkabı satan bir e ticaret siteniz var. Müşterinize gösterebileceğiniz  binlerce ürün var. Müşterinin işini kolaylaştırmak için ne yapılabilir ?
   Ayakabının  renk, tür, malzeme, tip, ve benzeri vasıflarını içeren menüler yada filitrelemeler kullanabilirsiniz. Fakat ürün girişi nin vasıflarıda hatasız ve eksiksiz girilmesi gerekiyor. Bu yeterli bir çözüm olacakmı ?

Başka ne yapabiliriz. Bir ürüne bakan müşteriye baktığı ürünün benzerlerini göstermekde lazım. Peki nasıl yapabiliriz  ? Vasıf bazında mesela siyah deri topuklu bir ayakkabıya bakıyorsa aynı vasıflardaki 100 lerce ürününüzden bir kısmını rastgele gösterebilirsiniz.  Satış Tecrübesine göre ; Eski alışverişlerdeki müşterilerin bu ürünü inceleyen şunalarda bakdı mantığında alternatif ürünleri gösterebilirsiniz.

Bu problemlere bir alternatif çözüm anlamında yukarda videoda göreceğiniz çalışmayı yaptık. Bu çalışmada seçilen ürüne önerilen alternatif ürünleri belirlemek için sadece görsel benzerlik kullanıldık. Benzerlerin seçilmesiyle onaların benzerlerine ulaşarak ürünler arasında bir gezinti imkanınıda verdik.

Nasıl yaptığımıza gelirsek, ticari bir çalışma olduğunda çok detaylı anlatamıyacağız ama kabaca bahsedelim.

Öncelikle 1200 civarında bayan ayakkabı  fotoğrafı bularak veri setimizi hazırladık. Sonra eğitilmiş bir caffe modeli ile öznitelik çıkardık. Bu özniteliklerin yakınlık dercesini belirlemek için En Yakın komşuluk algoritmasını kullandık. Ve sonuç; Yukarda videoda izleyebileceğiniz, derin öğrenme bazlı görsel ürün öneri ve ürünler arası gezinti uygulaması çıktı...

Pazar, Temmuz 10, 2016

Caffe ile Finetune - Eğitimin Transferi - Örneği

Caffe malumunuz bir derin öğrenme kütüphanesi. Daha önce bahsettiğimiz için bu yazımızda anlatmayacağız. Önceki yazımız okumamış olanlar
Caffe for Windows 

burdan okuyabilirler. Biz bu yazımızda eğitimin transferinden - finetune - bahsedeceğiz. Derin öğrenme için gerekenlerin başında büyük mikdarda ve çeşitlilikte veri. Ve bu veriyi uygun hızda eğititebilecek işlem gücü. Eldeki -evdeki- imkanlarla bu tür bir uygulamaya girişmek bu yüzden pek mümkün olmuyordu. İşte burda eğitimin transferi imdadımıza yetişiyor.

-Fine Tune- Eğitimin Transferi nedir ?   Eğitim Ağ yapısında giriş den çıkışa en az hata ile ulaştıran ağırlık değerlerinin bulunmasından ibarettir. Adım adım anlatmak gerekirse.
  1. Ağırlık değerleri başlangıçta belli metodlarla yada rastgele belirlenir. 
  2. Giriş verileri, ağırlıklar ile çalıştırılıp çıkış değerleri hesaplanır.
  3. Hesaplanan değerlerle gerçek değerler arasındaki fark hesaplanır.
  4. Eğer bu fark istenen küçüklükte ise eğitim tamamlanır.
  5. Fark istenenden büyük ise Farka  göre ağ boyunca geriye doğru ağırlıklar güncellenir
  6. 2. Adıma dönülür.
Fine Tune terimin tam tercümesi ince ayardır. Başka bir veri seti için uygun şekilde eğitilmiş ağın yapısındaki ağırlık değerlerinin  kısmen alınarak,  yeni  başka bir veri için daha kısa sürede eğitiminde kullanma işlemine eğitimin transeferi diyoruz.

Örnek :  Men vs Women Shoes  

Önce veri hazırlayalım. Amacımız Erkek-Kadın ayakkabısı ayrımını yapabilen bir sistem olsun. Veriler için Ayakkabı satan bir e-ticaret sitesine - shoes.com -  uğradık


http://www.shoes.com/

Kadın ve erkek ayakkabıları için 420 şer tane örnek resim aldık. Bunların %70 ini eğitim %30 unu test için kullanılacak şekilde ayarladık. 'convert_imageset' ile resimler 256x256 ebatına getirilip LMDB formatında veritabanına aktarıldı. 'compute_image_mean' ile eğitim için kullanacağımız veri tabanından ortalama matrisi çıkarıldı.

Bundan sonraki adım için daha önceden eğitilmiş bir model seçmek gerekiyor. Caffe-Model Zoo da pek çok  eğitilmiş hazır model bulmanız mümkün.  Biz GoogLeNet i kullandık.  Caffe ile gelen modellerden biri pek çok  finetune örneğide var.  mesela;

modelin eğitim için kullanılacak prototxt dosyasında  eğitim transferi için yapmamız gereken değişiklikler var.

Öncelikle Loss katmanı - genellikle softmax - öncesi "InnerProduct" katmanının adını değiştirin. Bağlantılı olduğu katmanlardaki  adlarıda unutmayın. Sonra "InnerProduct" katmanının çıkış sayısını  kendi uygulamamıza göre güncelleyin. bizde 2 sınıf olduğunda 2 yapıyoruz.

Sonrasında Güncellediğimiz "InnerProduct" katmanı haricindeki bütün katmanların öğrenme parametrelerini sıfırlıyoruz.  'blobs_lr'  yada  'lr_mult' diye geçen parametreler.  Bu katmanların öğrenme parametrelerini sıfırlayarak eğitim transferi esnasında değişmemesini sağlıyoruz. Çünkü transfer ettiğimiz ağırlıklarda bu katmanlardan geliyor.

Bizim Örneğimizde çıkış sayımız iki olduğundan 'top-5 accuracy'  katmanları yani ilk 5 tahminin doğruluk oranını hesaplayan kısımlarında bir anlamı kalmıyor onlarıda kaldırıyoruz.

Veri giriş dosyalarımızı ve ortalama matris bilgisini data katmanına yazıyoruz. Artık model dosyamız kullanıma hazırdır.

Eğitim için kullanılacak olan solver prototxt dosyasında sadece başlangıç öğrenme hızını normalde olması gereken dendaha düşüğünü seçiyoruz. Eğitimde ilk başta birz daha büyük bir öğrenme hızı ile başlanır. Sonra eğitimde ileri safhalar geçtikçe öğrenme hızı azaltılır. Biz Eğitim transferi yaptığımızdan adını değiştirdiğimiz katman haricinde zaten eğitilmiş bir yapımız vardır. Bu yüzden daha düşük hızla başlıyoruz.

Eğitim transferide bir çeşit eğitimdir. Tıpkı eğitimdeki gibi caffe programını çağırıyoruz.

caffe train -solver solver-fine.prototxt -weights bvlc_googlenet.caffemodel -gpu 0

  Sonuç:

 İmkanımız kısıtlı olduğunda uzun boylu denemler yapamadık.  800 iterasyonla  0.768  başarı oranına - top 1 accuracy - eriştik.


  Modeli kullanıp sonuçları analiz edelim.


Eğitilmiş modeli doğrulamak için yine aynı siteden eğitim için kullanmadığımız resimlerden topladık 112 adetlik bu doğrulama verimizde 55 tane erkek ayakkabısı ve 57 adet kadın ayakkabısı vardı.

Kısa bir python programı yazdık ve doğrulama programı ile çalıştırdık.
 Erkek ayakkabılarından  55 tanesinin 37 tanesi doğru sınıflandırılmış
Kadın ayakkabılarından  57 tanesinin 49 tanesi doğru sınıflandırılmış
Ortalama Tahmin doğruluğu % 76.8

Yanlış sınıflandırlan resimlere bir bakalım.
 Kadın ayakkabısı zannedilen  Erkek ayakkabıları


 Erkek ayakkabısı zannedilen  Kadın ayakkabıları



 Resimlerden görüleceği gibi model haksızda sayılmaz.

Modelimizin doğruluğunu düzeltmek için kullanabileceğimiz bir başka faktörde ihtimal değeri. Model her iki sınıf içinde bir ihtimal değeri veriyor. yüksek olanı tahmin etti diyoruz. Lakin ihtimallerin bir birine yakın olması durumlarıda var
Mesela ;

Bu ayakkabı için Erkek : 0.45  Kadın = 0.55 diye ihtimal verilmiş.  Kadın ayakkabısı diye tahmin edilmiş ama erkek ayakkabısıymış

Bu ayakkabı için Erkek : 0.49  Kadın = 0.51 diye ihtimal verilmiş.  Kadın ayakkabısı diye tahmin edilmiş Kadın ayakkabısıymış ama ihtimali çok yakın. Muhtemelen bu modele çok benzer erkek ayakkabılarıda vardır.


Sonuç olarak; Başarı oranı çok yüksek gibi görünmeye bilir. Ve elbette daha çok veri ve bazı ince ayar ve denemelerle muhakak ki daha iyi sonuçlara ulaşılabilir. Fakat pek ala insan tarafından da karıştırılabilecek kadın ve erkek ayakkabı modelleri var. Normal olarak bizim modelimizde karıştırıyor.