Wednesday, December 13, 2017

Video - 13/12

Monday, December 4, 2017

Optik Karakter Tanıma (Optical Character Recognition -OCR-) - 2

Thursday, November 23, 2017

Serviste İşleyen Komut Satırı - tmux

Bir Unix servis makinasına giriş yaptık, uzun süreli bir süreç (process) isletmek istiyoruz, ama giriş yapılan komut satırını açık bırakmak istemiyoruz (dizüstü kapatılacak, kalkılıp gidilecek, vs).

İlk seçim komutu arka plana atarak (background process) olarak işletmek, 

nohup sh komut.sh > /bir/log/dizini/log.out & 

& işareti ile süreç arka plana atıldı, çıktılar log dosyasına gidiyor. 

Bir diger secim tmux. Kurmak icin 

sudo apt-get install tmux

Tmux ile oturum acmak icin 

tmux

Bu oturumlar makinadan çıkılsa bile açık dururlar, kıyasla ssh, telnet ile giriş yaptığımızda yeni bir komut ortamına gireriz, çıkınca da ortam bitirilir, tmux durumunda komut ortamı sürekli açık kalır. Üstteki komut bizi bir pencereye götürür, orada uzun sürecek işlemi başlatabiliriz, ve işlem devam ederken 

CTRL-b d 

ile çıkabiliriz. Makinadan da çıkabiliriz, işlem devam edecektir, makinaya tekrar ssh ile girince 

tmux list-sessions

ile oturumlari listeleyebiliriz. Mesela "0" oturumu var, 

tmux attach -t 0

ile aynı ekrana bağlanırız, işleyen programı tekrar görürüz.

Diğer komutlar için alttaki kaynağa bakılabilir,

Kaynak


Sunday, November 5, 2017

MathJax: Web Sayfalarinda Javascript ile Matematik Formülleri

LaTeX ile yazilan matematik formullerinin HTML icinde gosterilebilmesi icin MathJax Javascript kutuphanesi var. Gerekli JS dosyalari diger HTML, CSS dosyalari ile birlikte ayni dizinde olur, gerektikce servis makinasindan alinir, ve formul grafiginin uretilmesi icin islem zaten Javascript ile kullanicinin tarayicisinda yapilir.

Kurmak icin GH'dan kod alinir, 


Depo icinde gereken dosya / dizinler

config/
extensions/
jax/
MathJax.js

Bu dosyalar sayfalarla beraber web servis makinasindan servis edilecek. Simdi bu dosyalarla ayni seviyede olan bir HTML dosyasi icinde

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {inlineMath: [["$","$"],["\\(","\\)"]]}
  });
</script>
<script type="text/javascript" src="MathJax.js?config=TeX-AMS_HTML-full"></script>

</head>
<body>

<p>
Eğer $a \ne 0$ olursa  \(ax^2 + bx + c = 0\) denkleminin çözümü iki tanedir
ve bunlar $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$
</p>

</body>
</html>

Bu dosya tarayicida gosterilince 


MathJax yaklasimi guzel cunku ek bir "uretme komutu"na gerek duymuyor - kod HTML icinde, bildigimiz LaTeX olarak kaliyor, servis tarafinda neredeyse hic islem yapilmiyor, sayfayi gormek isteyen kisinin bilgisayari gerekli islemi yaparak formulu goruyor. 

Monday, October 30, 2017

YOLO - Evrişimsel Derin Ağlar ile Hızlı Obje Tanıma (Object Recognition)

Evrişimsel Derin Ağlar ile obje tanıma alanında hızlı gelişmeler oluyor. Yapay görüş (computer vision) zaten derin öğrenmenin "geri dönüşünün" ilk gözlendiği alandı, MNIST sayı tanıma problemindeki en iyi hata oranı bir DYSA ile alınmıştı, ardından araçlar, yaklaşımlarda ilerlemeler oldu, şimdi R-CNN, Mask R-CNN ile obje tanımakta ilerlemeler kaydedildi. Evrişimsel derin yapı obje tanımada verimli bir şekilde kullanılabilmeye başlandı.

Yeni ve çok hızlı işleyen bir başka yaklaşım YOLO. Kısaltma "sadece bir kere bakarız (you only look once)" cümlesinden türetilmiş, söylenmek istenen insanların tek bir karedeki görüntüde olan objeleri hızlı bir şekilde bir bakışta bulabilmesi. YOLO'nun amacı bu hıza erişmek.

https://pjreddie.com/darknet/yolo/

YOLO tasarımcılarına göre görüntü karesini solda sağa taramak (ve o sırada ufak bir kutu içine düşen piksellere bakmak), ya da obje yeri hakkında teklif üretmek (r-cnn) gerekli değil. Tüm kare ve o karedeki tüm obje tipleri, yerleri hakkında global bir karar verilebilir.


Yöntem aslında basit: tüm görüntü önce S x S parçaya bölünür  (S=7 diyelim), ve tüm bu parçalar ile B tane obje arasında bir regresyon ilişkisi kurulur. Tabii denetimli bir eğitimden bahsediyoruz, elde görüntü, ve o görüntüdeki objeler, onların yerleri, büyüklüğü bilgisi olmalı. Bu eğitim verisi açık şekilde mevcut, o problem değil, ünlü Pascal VOC verisi bunlardan biri. Regresyon hedefi olan objeler x,y,w,h,g değerleri ile temsil ediliyor, x,y objenin parçaya göre yeri, w,h genişliği ve yüksekliği, g ise obje hakkındaki bir güven değeri. Ayrıca bir diğer regresyon her parçanın C tane obje tipi için bir kategorizasyon tahmini yapması. Eğer B=2, C=20 ise, yani her parça iki tane objeyi tahmin ediyor ve elimizde 20 tane kategori var ise S x S (B * 5 + C) formülü, 7 * 7 * (2 * 5 + 2) büyüklüğünde bir tensor var demektir. Bu tensor tahmin hedefi bu arada, yani bir regresyonda y ~ x dediğimizde kullanılan y.


Hedef için verilen kaynak parça içine düşen pikseller, daha doğrusu bu piksellerin evrişimden geçirilmiş hali. Bu evrişim tabakası oldukca standart, ünlü MNİST için kullanılan DYSA tabakalarından pek farklı değil.

Bu kadar. Üstteki bağlantıda kod ve önceden eğitilmiş bir DYSA'nın ağırlık değerleri bulunabilir. Verilen kodu denedik, sonuçlar iyi. Altta trafik lambası ve dur işareti üzerinde işlettiğimiz deneyin sonuçları görülüyor. Sadece eğitilmiş YSA'nın ağırlıklarını indirdik, kodu derledik ve başka hiçbir ek işlem yapmadan bu tanıma yapıldı.



YOLO yaklaşımını TensorFlow ile yapan bazı kodlar altta,

https://github.com/nilboy/tensorflow-yolo

https://github.com/hizhangp/yolo_tensorflow

Başka TF kodları da Github'da var.. YOLO C++ ile yazılmış, bu arkadaşlar TF Python ile aynı işi yapmışlar, kimisi üstteki aynı DYSA ağırlıklarını olduğu gibi kullanabildiğini iddia ediyor. TF bilindiği gibi Android üzerinde de işler, yani cep telefonunu tutup sak diye bir karedeki tüm objeleri tanıyabildiğimiz bir uygulama yazmak mümkün. Orijinal kod ile arkadaşlar saniyede 40 kareden daha fazlasını işleyebildiklerini söylüyorlar, o zaman canlı bir şekilde video da işlenebilir demektir.

Ekler

Eğitim sırasında hangi parça hangi obje ile eşlenir? Eğitim verisindeki obje etrafındaki kutunun orta noktasına bakılır, bu orta nokta hangi parça içine düşüyorsa, o parça ile obje arasında ilişki kurulur. Peki bir obje ile alakası olmayan parçalar ne yapılır? Onlara da kendileri merkezli B tane "obje" ile ilişki kurulur fakat bu ilişkideki güven katsayısı sıfır olarak verilir, yani böylece "orada obje yok" demiş oluyoruz.

DYSA yapısına bakarsak ardı ardına evrişim ve max havuz (pool) katmanları görüyoruz.

Evrişim katmanlarındaki notasyon, mesela 7 x 7 x 64-s2 anlami 7 x 7 boyutunda 64 tane filtre uygulanıyor ve bu filtreler her uygulama sonrası 2 hücre kenara kaydırılıyor (stride).

Mimaride tamamen bağlanmış (fully connected) katmandan bir önceki 7 x 7 x 1024 boyutlarındaki tensor, girdi imajının işlene işlene oluşturulmuş son hali. Bu tensorda her imaj parçası 1024 kanallik bir vektör haline gelmiştir. Mesela üstten 2. soldan 1. parçanın verisi bu tensorda [1,0,:] ile erişiliyor olabilirdi, ve bu 1024 öğeli vektör o parçayı temsil eden girdidir. Sonuç tensor'u ile regresyona sokulan bu veridir.

Bağlantılar

http://machinethink.net/blog/object-detection-with-yolo/ - bilgilendirici bir yazı

https://youtu.be/NM6lrxy0bxs - YOLO tasarımcısının video'su