Ara 182018
 
945 kez okundu

OpenCV ile Yüz Tanıma Bölüm 3-2

Önceki yazımda veri setimizi nasıl oluşturacağımızı anlatmıştım.

Bu kez veri setimizi Keras kullanarak eğiteceğiz. Sonra da yeni resimleri bu eğitilmiş veri setini kullanarak sınıflandıracağız.

3. ADIM – EĞİTİM

Projemize örnek olarak aldığımız çalışmada Adrian, Keras modellemesi için SmallerVGGNet sınıfını kullanıyor. Ben onun yerine daha basit bir model kullandım (vgg_like). Eğer isterseniz yazının sonundaki Referanslar bölümünde yer alan linkleri kullanarak SmallerVGGNet kodlarına ulaşabilirsiniz.

Lafı uzatmadan eğitim betiğimize geçelim. Betiğimizin adı: train.py

İşin içine eğitim girince bir sürü kütüphane ve modüle ihtiyaç duyuyoruz. Kullanacağımız kütüphaneler hakkında kabaca da olsa, bilgi sahibi olduğunuzu umuyorum. Yoksa bu yazıyı 1000-1500 kelimelik bir hacme sığdırmak olanaksız hale gelirdi.

İlk 27 satırımızda matplotlib, keras, sklearn, imutils, numpy, random, pickle, cv2 ve os kütüphanelerimizi içe aktarıyoruz. smallervggnet kütüphanesini de belki kullanırsınız diye listeden çıkarmadım.

Modeli daha basit tutmak amacıyla vgg_like() fonksiyonunu tanımladım. (VGGNet, 2014 yılındaki Imagenet Büyük Ölçekli Görsel Tanıma Yarışmasında çok iyi performans gösteren bir yapay sinir ağıdır. VGG (Visual Geometry Group) Oxford Üniversitesi Mühendislik Bilimleri Bölümünün bir alt birimidir.)

Eğitim için Doğrusal(Sequential) bir model kullanıyoruz – satır 30
Görsellerimiz 96×96 boyutlu ve 3 renk kanalına sahip.
Modelimize ilk önce bir Conv2D katmanı uyguluyoruz – satır 31
İkinci katmanımız yine Conv2D – satır 32
Üçüncü katmanda MaxPooling2D var – satır 33
34. satırdaki Dropout ile %25’lik giriş bilgisini devre dışı bırakıyoruz (overfitting engelleme).

Benzer işlemleri bir kez daha tekrarlıyoruz. Ama boyutlamalar biraz farklı. satır 36-39

Son aşamada modelimize önce Flatten(), sonra Dense() uyguluyoruz. satır 41-42
Dropout oranımız %50 satır 43
Son işlemimiz her zamanki gibi ‘softmax’ satır 44
45.satırda modelimizi geri döndürüyoruz.

47. satırda işlem başlangıç zamanını t0 olarak not ediyoruz. Bu değişkeni belirli aşamalarda geçen süreyi belirtmek için kullanacağız.

Satır 48-51’de sabitlerimizi tanımlıyoruz.

data ve labels boş birer listedir. satır 53-54

58. satırda görsel dosya yollarımızı bir listede topluyoruz (imagePaths).

imagePaths listesinin satırlarını karıştırırken, sonraki denemelerde de aynı rasgele değerleri elde edebilmek için seed değerini 42 olarak belirliyoruz. satır 60 (Bu değer herhangi bir başka sayı da olabilir. Önemli olan hep aynı başlatma değerini kullanmak.)

63. satırda görsel dosyalarını işlemeye başlıyoruz.
Dosyayı okuyoruz – satır 64
İmajı 96×96 olarak yeniden boyutlandırıyoruz – satır 65
İmajı bir dizi (array) haline dönüştürüyoruz – satır 66
Ve imaj dizisini data listesine ekliyoruz – satır 67

Dosya yolundan etiket bilgisini (sanatçı_kodu) ayrıştırıyoruz – satır 70
Etiket bilgisini labels listesine ekliyoruz – satır 71

data listesini elemanları 0 veya 1 olacak şekilde bir numpy dizisine çeviriyoruz – satır 75
Aynı şekilde labels listesini de bir numpy dizisi haline getiriyoruz – satır 76

Satır 81-82’de etiketleri sayısallaştırıyoruz.

Satır 85-86: data ve labels dizi elemanlarının %20’sini test, geri kalanını eğitim için ayırıyoruz.

Veri sayımız kısıtlı olduğu için data çoğullama (augmentation) işlemi yaptırıyoruz – satır 89-91 (Çoğullama sırasında döndürme, kaydırma, yükseklik değiştirme, kesme, büyütme ve yatay aynalama (flip) işlemleri yapılacak.)

Modelimizi vgg_like() fonksiyonu ile oluşturuyoruz – satır 99

model.summary(), model katmanlarımızın değişimini ayrıntılı bir şekilde açıklıyor. Bu özeti hem ekrana, hem de dosyaya kaydediyoruz. – satır 102-105

Optimizasyon işlemi için Adam da yaygın bir şekilde kullanılıyor. Benim yaptığım denemelerde SGD daha iyi sonuçlar almamı sağladı. Her ikisini de deneyebilirsiniz. Satır 108

110. satırda modelimizi derliyoruz.

Eğitim işlemleri (satır 116-120) için bir kaç dakika bekliyoruz.

Eğitim tamamlandığında, önce modelimizi (satır 124), sonra da etiketlerimizi (satır 128-130) kaydediyoruz.

Son aşama olarak, eğitim işlemlerimiz sırasında hesaplanan kayıp ve doğruluk değerlerini grafiğe döküyor ve plot.png adıyla kaydediyoruz. – satır 135-146

OpenCV ile Yüz Tanıma Bölüm 3-2

Artık sınıflandırma işlemlerimize geçebiliriz. Ama daha önce model özetimize kısaca bir göz atsak iyi olacak:

Conv2D katman çıkış boyutlarında 2 piksellik küçülme yaratıyor.
MaxPooling2D ise (2,2) oranları ile her iki yönde boyutları yarıya indiriyor.
Flatten işlemi katmanı tek boyutlu bir diziye dönüştürür.
Dropout input değerlerinden bir bölümünü işlem dışı bırakır. Böylece overfitting olasılığı azalır.

4. ADIM – SINIFLANDIRMA

Sınıflandırma işlemlerinde eğitim aşamasında kullanmadığımız görsellerden yararlanacağız. Her sanatçı için birer görsel seçtik ve bunları kontrol klasörünün altına kopyaladık.

İlk 7 satırda gerekli kütüphaneleri içeri aktarıyoruz.

imajlar listesi sınıflandıracağımız fotoğrafları tutuyor. satır 10

Sınıflandırma işlemlerini check_image() fonksiyonu ile yapacağız (satır 12). Her görsel ayrı ayrı işleme sokulacak.

Satır 13-16’da imajımızı 96×96 piksel boyutlarına küçültüyor ve modelimize uygun bir numpy dizisine dönüştürüyoruz.

Satır 19 ve 20’de eğitim sonunda kaydettiğimiz model ve etiket bilgilerini belleğe alıyoruz.

Modele göre bulunan tahmin ve olası doğruluk derecesini saptıyor; etiket değerini alıyoruz. satır 23-25

Sınıflandırma sonucunu genişliğini 400 pikselle sınırlandırdığımız imajımızın üzerine işliyoruz. satır 28-33

İşlenmiş imajı ekranda gösterip diske kaydettikten sonra bir tuşa basılmasını bekliyoruz. satır 35-38

Tuşa basıldığında belleği temizliyoruz: satır 39

check_image() fonksiyonumuzu her resim için ayrı ayrı çağıran döngümüz satır 42-45 arasında.

Elde ettiğim görüntüler aşağıda:

OpenCV ile Yüz Tanıma Bölüm 3-2

OpenCV ile Yüz Tanıma Bölüm 3-2

OpenCV ile Yüz Tanıma Bölüm 3-2

SmallerVGGNet kullanarak yaptığım denemelerde daha yüksek sayısal doğruluk oranlarına ulaştım ama, yapılan tahminlerin pek çoğu aslında hatalıydı. Bu, veri kümemizin çok dar olmasından kaynaklanmış olabilir.

Aynı eğitim setini yüz saptama fonksiyonlarıyla birlikte kullanarak grup fotoğraflarından çoklu yüz tanıma işlemleri gerçekleştirmek mümkün olabilir.

Açıklamalara böyle bir blog yazısında daha kapsamlı bir şekilde girmek mümkün olmuyor. Sorularınız varsa, yorum alanından iletebilirsiniz.

Bu tür çalışmalar çok geniş bir kapsama alanına sahip. Yapılan işlemler ve elde edilen sonuçlar deneysel nitelikte. Bu yüzden, bu tür konulara ilgi duyuyorsanız, siz de kendi modellerinizi geliştirin. Mümkünse veri kümeleri oluşturun. Deneyin. Yorumlayın.

Elbette hala öğrenecek çok şey var. Ama yapabileceğimiz şeyler de pek çok…

Önemli olan, hangi düzeyde olursak olalım, deneysel bakış açımızı yitirmemek ve hevesimizi kaybetmemek… Hata yapmak bizi korkutmasın. Hatalar, kullanmasını bilenler için en etkin yol göstericilerdir.

Yeni yazılarda buluşmak üzere…

Beni izlemeye devam edin.

Ahmet Aksoy

Referanslar:
https://github.com/kjaisingh/pokemon-classifier/blob/master/pyimagesearch/smallervggnet.py
https://www.pyimagesearch.com/2018/04/16/keras-and-convolutional-neural-networks-cnns/
https://hackernoon.com/learning-keras-by-implementing-vgg16-from-scratch-d036733f2d5
http://www.robots.ox.ac.uk/~vgg/research/very_deep/

Ara 172018
 
1.195 kez okundu

OpenCV ile Yüz Tanıma Bölüm 3-1

Bu yazımda 3 Yeşilçam emektarının fotoğraflarını içeren küçük bir veri setini oluşturmak için gerekli işlemleri ele alacağım. Eğitim ve sınıflandırma işlemleri ise bir sonraki yazımın konusu olacak.

OpenCV ile Yüz Tanıma Bölüm 3-1

Orijinal kodları yine PyimageSearch web sitesinden edinmek mümkün. Adrian, anime karakterleri kullanmış. Ben ise Yeşilçam karakterlerini tercih ettim. Ayrıca kodları biraz daha basitleştirdim ve gerekli yerlerini Türkçeleştirdim.

Veri seti için Google üzerinden ulaşabildiğim fotoğrafların sayısı hiç ummadığım kadar düşük çıktı. Oysa çok fazla fotoğrafa ulaşabileceğimi umuyordum. Bu proje için 3 sanatçımızın toplam 147 farklı fotoğrafına ulaşabildim. Sayının azlığına rağmen sınıflandırma değerleri fena değil.

Projemizde 4 ayrı betiğimiz var:
1- Dosyadaki linklerin okunup, ilgili imaj dosyalarının internetten indirilip kaydedilmesi
2- Kaydedilen dosyaların denetlenerek, içeriği aynı olan dosyaların teke düşürülmesi
3- Veri setinin eğitilmesi
4- Eğitilmiş veri seti bilgilerini kullanarak örnek dosyaların sınıflandırılması

VERİ SETİMİZİ OLUŞTURMAK

Sanatçılarımız: Türkan Şoray, Sadri Alışık ve Cüneyt Arkın. Amacım sadece çalışma yöntemini örneklemek olduğu için sayıyı daha fazla arttırmadım. Belki ileride, bu veri setini genişletip çok daha zengin ve işlevsel bir projeye dönüştürmek mümkün olabilir.

1. ADIM – VERİ SETİNİN OLUŞTURULMASI

İnternet üzerinden ulaştığım görsel linklerini, “linkler.txt” isimli bir metin dosyasına kaydettim. Bu dosyayı linkler.txt adresinden indirebilir veya tamamen kendiniz oluşturabilirsiniz.
Dosya yapısı şöyle:
sanatçı_kodu,link1
sanatçı_kodu,link2

Sanatçı kodları aynı zamanda data klasörünün içindeki klasörlerin de adlarıdır. O nedenle kodlarda Türkçe karakter kullanmadım. Kodlar ve klasör isimleri şu şekildedir:
c_arkin
s_alisik
t_soray

Betik kodlarını kısa tutmak için data klasörünü ve onun altındaki klasörleri kendim oluşturdum.

Çalışma klasörümüzün adı “yesilcam”. Alt dizin yapısı da şu şekilde:
yesilcam
|–data
| |–c_arkin
| |–s_alisik
| |–t_soray
|–kontrol
|–__pycache__

Önce ilk betiğimizi (resim_indir.py) inceleyelim:

skimage kütüphanesi, imaj dosyalarımızı doğrudan internet üzerinden okuyabilmek için gerekli. Ancak bu kütüphane RGB renk sistemini kullanıyor. Bu yüzden 22 nolu satır ile renk sistemini OpenCV’nin kullandığı BGR sistemine çeviriyoruz.

Linkleri tutan dosyamızın adı “linkler.txt”.

Sorunsuz okunan dosya sayısını tutmak için ok, sorunluları saymak içinse hata değişkenlerini kullanıyoruz.

kac sözlük değişkeni, her sanatçı için dosya isimlerini ayrı ayrı sayılaştırmamızı sağlıyor.

Satırları tek tek okuyoruz. # ile başlayan veya boyu 3 karakterden kısa olan satırları atlıyoruz.

İşlenecek satırları “,” ile parçalıyoruz. İlk parçada sanatçı kodu bulunuyor. Normalde ikinci parçanın link adresini tutması lazım. Ancak, sayıları az olsa da, bazı link adreslerinde “,” işaretinin kullanıldığına rastlayabiliriz. Bu nedenle -eğer varsa- 3. parçayı 2. parçaya ekleyerek doğru adresi elde ediyoruz.

17. satırda başlattığımız try bloğu, hatalı okumalardan kaçınmamızı sağlıyor.

kim değişkeni sanatçı kodunu, url ise imaj adresini saklıyor.

kac anahtarları içinde kim stringi yoksa, ilk kez tanımlanacak demektir. Başlangıç değeri olarak 1 atıyoruz.

21. satırda dosyamızı internet üzerinden okuyor; 2. satırda renk sistemini BGR haline çeviriyor ve 23. satırda okuduğumuz imajı görselleştiriyoruz.

24. satırdaki tuş kontrolü, gerektiğinde, Esc tuşuna basarak döngüyü kırabilmemizi sağlıyor. Bu satır aynı zamanda görselleştirme işlemleri için de gerekli.

27-36 satırlarını kullanarak dosyayı data klasörü altındaki sanatçı klasörüne (kim) kaydediyoruz. Dosya isimlendirmesinde bir çakışma olması ihtimalini dikkate alıyor, ama bu sayının 100’den fazla olmasına izin vermiyoruz. (Dikkat! Eğer kendi veri setinizi oluşturacaksanız, kullanacağınız link sayısını dikkate almak için bu sınırı değiştirmeniz gerekebilir.)

41. satırda son işlem olarak bilgisayar belleğini temizliyoruz.

İmajlar farklı boyutlarda olduğu için işlenmeleri farklı süreler gerektirebiliyor.

(Not: Çalışmalarımı Pycharm üzerinde yapıyor ve çalıştırıyorum. Ancak bu betiği terminal üzerinden çalıştırmak zorunda kaldım. Aynı durum sizin başınıza da gelebilir. Betiği çalıştırmak için Pycharm’ın terminal modunu kullanabilirsiniz.)

2. ADIM – İMAJ TEKRARLARININ ÖNLENMESİ

Bu betiğimizde doğrudan md5 hesaplamak yerine imagehash kütüphanesindeki dhash() metodunu uyguluyoruz. Bu metod hash hesabını imajları belli bir boyuta indirip gri renge çevirdikten sonra yapıyor. Yeniden boyutlandırma biraz zaman alıyor olsa da sonuçlar daha güvenilir.

İkinci betiğimizde os, PIL ve imagehash kütüphanelerini kullanıyoruz.

hash() fonksiyonumuzda okuma işlemini PIL.Image modülü ile gerçekleştiriyor ve elde edilen imaja imagehash.dhash() işlemini uyguluyoruz. (Doğrudan md5 hesabı yaptığımızda birbirine çok benzer bazı imajlar gözden kaçabiliyor.)

Tekrarlanan imaj dosyaları tekrar_sil() fonksiyonunun içinde temizleniyor.

19. satırda path değişkenimizle aktarılan klasör yolu bir döngü yapısı içinde kök, klasör ve dosya bileşenlerine ayrıştırılıyor ve her bir dosya için hash() değeri hesaplanıp, hash_dict sözlük değişkeninde saklanıyor. Eğer eşdeğer hash değeri (key) bulunursa, aynı anahtarın karşılığına mükerrer dosyanın adı ekleniyor. Böylece len(hash_dict[k]) değeri birden büyük olan kayıtlar, mükerrer dosyaları tutuyor.

25-30 satırları mükerrer dosyaların silinmesini sağlıyor.

34. satırda data klasörünü işleme sokuyoruz. Böylece onun altındaki tüm klasör ve dosyaları taramış oluyoruz.

Sizi daha fazla yormamak ve veri setini hazırlamanız zaman tanımak için bu yazıyı burada kesiyorum. Bir sonraki yazımda, oluşturduğumuz veri setini önce eğiteceğiz, sonra da eğitim setinde yer almayan kontrol görsellerinin kime ait olduğunu sorgulayacağız.

Beni izlemeye devam edin.

Ahmet Aksoy

Referanslar:

https://www.pyimagesearch.com/

Ara 092018
 
2.859 kez okundu

OpenCV ile Yüz Tanıma Bölüm 2

OpenCV Yüz Tanıma 2

Bu bölümde 3 ayrı betik kullanıyoruz:
1- veri toplama: 01_face_dataset.py
2- eğitim: 02_face_training.py
3- uygulama: 03_face_recognition.py

Orijinal kodlara https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826 adresinden ulaşabilirsiniz.

Ben veri kümesini yeniden oluşturdum. Türkçe karakterlerin görüntülenebilmesi için gerekli düzenlemeyi yaptım ve bazı mesajları Türkçeleştirdim.

İlk betikte input() komutunu # ile devre dışı bıraktım. Yeni bir yüz tanıtırken face_id sayısını doğrudan tanımladım. Örneğimizde 4 yüz tanımlı. Her yüz için 30 kare dataset klasörüne kaydedildi. Siz de kendi verilerinizi kaydetmeli ve eğitmelisiniz.

İlk betiğimizde cv2 ve os kütüphanelerini kullanıyoruz.

Görüntüleri webcam üzerinden elde edeceğiz. Görüntülerimizin eni 640, yüksekliği 480 piksel olarak tanımlandı (satır 5 ve 6).

7 nolu satırda cepheden yüz sınıflandırıcısını tanımlıyoruz.

face_id yüz görüntülerini eğiteceğimiz kullanıcı numarasını belirtiyoruz. Eğer input() satırını kullanmak isterseniz 9.satırın başındaki # işaretini silip, 10. satırın başına # eklemelisiniz.

count değişkenini görüntü sayısını takip etmek için kullanacağız.

Kayıt işlemlerimiz 15. satırdaki sonsuz while döngüsüyle başlıyor.

16. satırda kamera görüntüsünü alıyoruz. ret değişkeni işlevsizdir. Bu değişken video dosyasından okuma yaparken işimize yarıyor.

Görüntü karesini griye çevirip içindeki yüzleri saptıyoruz. (Satır 18 ve 19.)

Aslında her karede sadece 1 kişiye ait tek bir yüz bulunmalı. Yine de burada bir döngü kullanıyoruz. Aslında döngüdeki enbüyük dikdörtgeni seçsek daha doğru olurdu. Ama kodu gereksiz yere uzatmamak için bu tür ayrıntılara girmiyoruz.

Yakalanan her yüz için count değerini 1 arttırıyor (satır 22) ve yüz görüntüsünü dataset klasörüne kaydediyoruz. Kaydedilen görüntünün boyutları yüzün boyutları ile aynı. Yani webcam tarafından yakalanan görüntünün tümünü kullanmıyoruz. (Satır 24)

25.satırda kamera görüntüsünü (tamamını) ekrana yansıtıyoruz.

k değişkeni ile 100 milisaniye içinde bir tuşa basılıp basılmadığını kontrol ediyoruz.

Eğer ‘Esc’ tuşuna basıldıysa (sayısal karşılığı 27 olan tuş) döngüyü kırıyor, basılmadıysa bu kez count değerinin 30’u aşıp aşmadığını denetliyoruz. Sayı 30’u aştıysa döngüyü yine kırıyoruz. Çünkü her kişi için 30 görüntü kaydediyoruz.

Son iki satırda kamerayı serbest bırakıyor ve belleği temizliyoruz.

“dataset” klasörünün içine bakarsanız, verdiğiniz kullanıcı numarasına karşılık gelen 30 adet resim göreceksiniz.

Kullanıcı sayısını (yüz görüntülerini kaydedeceğiniz kişi sayısını) istediğiniz kadar arttırabilirsiniz. (Elbette en az bir kişi olmalı!)

Verilerimizi tamamladığımızda işimiz bitmiyor. Şimdi bu veri kümesini eğitmemiz lazım. İkinci betiğimizin işlevi bu!

İkinci -eğitim- betiğimizde opencv ve os yanısıra numpy ve pillow kütüphanelerini kullanıyoruz.

Veri klasörümüzün adı ‘dataset’. Bu bilgiyi path değişkeninde tutuyoruz.

Veri kümemizin eğitimini cv2.face.LBPHFaceRecognizer_create() komutuyla oluşturduğumuz recognizer (satır 7) üzerinden yapacağız.

Görüntülerdeki yüz alanlarını ayırmak için yine ‘haarcascade_frontalface_default.xml’ filtresinden yararlanacağız. Filtre değişkenimizin adı: detector. (satır 8)

Görüntü etiketlerimizi almak için getImagesAndLabels() fonksiyonunu kullanıyoruz.

ImagePaths listesi, path klasörü içinde yer alan dosyaların listesidir.

faceSamples listesi yüz görüntülerini, ids listesi ise her bir görüntünün etiketini tutacak.

imagePaths listesindeki her bir elemanı (dosya adını) kullanarak ilgili resmi okuyup griye dönüştürüyor ve PIL_img değişkenine atıyoruz (satır 15). Sonra bu görüntüleri 8 bitlik pozitif tamsayılardan oluşan bir numpy dizisi (array) haline dönüştürüyoruz (satır 16).

17 numaralı satırda, dosya adından kişi numarasını ayırıp, bir tam sayı olarak id değişkenine atıyoruz.

img_numpy görüntü numpy dizisinde bulunan yüz alanlarını bulup faces listesine atıyoruz. Yüzleri içeren listeyi döngüye sokup her bir görüntüyü faceSamples, ona karşılık gelen etiketi ise ids listesine ekliyoruz.

Fonksiyonumuz faceSamples ve ids listelerini döndürüyor.

24 numaralı satırda faces ve ids listeleri oluşturuluyor.

25 nolu satırda ise veri kümemizi eğitiyoruz.

Eğitilmiş veriseti bilgileri 27. satırda trainer klasörü içindeki trainer.yml dosyasına kaydediliyor. Bu dosyayı son betiğimizdeki görüntüleri sınıflandırırken kullanacağız.

Son betiğimiz şöyle:

Kamera görüntülerindeki yüzleri yakalayıp kime ait olduklarını belirten betiğimiz bu. Kullanacağımız kütüphaneler opencv, numpy ve pillow.

print_utf8_text() fonksiyonunu bir önceki yazımda anlatmıştım. Türkçe karakterleri bu fonksiyon aracılığıyla bastırıyoruz.

Yüz tanıma nesnemiz recognizer‘a trainer.yml dosyası aracılığıyla eğitilmiş verisetimizi yüklüyoruz (satır 18 ve 19).

Canlı kamera görüntülerindeki yüzleri de yine haarcascade_frontalface_default.xml filtresi aracılığıyla yakalayacağız. Filtre değişkenimiz faceCascade (satır 20 ve 21).

22 nolu satırda orijinal betikte kullanılan font tanımlanıyor. Biz bu fontu da kullanacağız.

Kişi numaraları id değikeninde tutulacak. (Satır 24)

Etiketleri (isimleri) ise names listesiyle tanımlıyoruz.

Web kamerasının görüntüsünü cam değişkenine aktarıyoruz ve görüntü boyutlarını 1000 ve 800 piksel olarak ayarlıyoruz. (Bu değerleri 640 ve 480 olarak da bırakabilirdik.)

minW ve minH değişkenleri yakalanan yüz dikdörtgenlerinin boyutu için alt sınır değerleridir (satır 33 ve 34). Bu değerleri kendi ortamınıza göre değiştirebilirsiniz.

35 nolu satırda sonsuz döngümüz başlıyor.

36. satırda kamera görüntüsünü okuyor, 38. satırda bu görüntüyü grileştiriyoruz.

40 nolu satırda görüntü karesindeki tüm yüzleri yakalıyor; 46. satırda ise bu yüz dikdörtgenlerini bir döngü içinde işleme sokuyoruz.

recognizer.predict() metodu id ve confidence değerlerini döndürüyor. id kişi numarası; confidence ise yapılan saptamanın tahmini doğruluk oranıdır (satır 48).

id ve confidence değişkenlerini print için uygun hale getiriyoruz (satır 50-55).

58 nolu satırda kişi ismini UTF-8 kullanarak (Türkçe karakterleri doğru şekilde yansıtarak), 60 nolu satırda ise belirtilen kişinin tahmini doğruluk oranını standart font ile görüntüye işliyoruz.

Görüntünün ekrana yansıtılması 62 nolu satırda.

Döngümüz yine Esc veya q tuşlarından birine basıldığında kırılıyor.

Döngü kırıldığında web kamerayı sonlandıyor ve belleği temizliyoruz (satır 68-69).

Bu betiğin çalışmasını gösteren örnek video aşağıda.

Bu yazı, açıklamaları olabildiğince kısa tutsam da biraz uzunca oldu. Umarım yeterince açıklayıcıdır. Sorularınız için yorum alanını kullanabilirsiniz.

Bir sonraki yazımda yine yüz tanıma olacak. Ancak veri kümemizi oluşturmak ve eğitmek için farklı yöntemler kullanacağız.

Beni izlemeye devam edin.

Ahmet Aksoy

Kas 272018
 
1.698 kez okundu

OpenCV ile Dünyayı Yeniden Keşfetmek

OpenCVOpenCV kütüphanesi’ni 1999 yılında Intel’den Gary Bradsky başlattı ve ilk sürümü 2000 yılında yayınlandı. Daha sonra bu çalışmalara Vadim Pisarevsky de katıldı. Halen OpenCV’nin Bilgisayar Görmesi ve Makina Öğrenmesi çalışmalarına yönelik desteği artarak devam etmektedir. (1)

OpenCV kütüphanesi hem C++, Python ve Java gibi dilleri; hem de Linux, Windows, OS X, Android ve iOS gibi platformları desteklemektedir. Kütüphane çalışmaları açık kaynaklıdır ve https://www.opencv.org/ sitesi üzerinden paylaşılmaktadır. Son sürüm OpenCV 4.0, 20 Kasım 2018 tarihinde duyurulmuştur.

Kütüphane ile ilgili daha ayrıntılı bilgilere ulaşmak isterseniz, kendi sitesine bir göz atmanızda yarar görüyorum.

Söz konusu kütüphanenin pratik kullanımına yönelik güzel örnekler paylaşan bir site daha var: https://www.pyimagesearch.com/ Her ne kadar arka planda kitap ve kurs pazarlaması bulunsa da, açık şekilde paylaşılan kod ve açıklamaları mutlaka izlemenizi öneririm. Olanaklarınız elveriyorsa Adrian Rosebrock’un kitaplarını almayı, ya da online kurslarına katılmayı düşünebilirsiniz. Elbette bunun için yeterli düzeyde İngilizce bilgisine ihtiyacınız olacak.

Bu ve izleyen bazı yazılarımda PyImageSearch veya benzer siteler tarafından paylaşılan kimi kodları temel alan bazı çalışmalar yayınlamayı düşünüyorum. Bu çalışmaları test ettiğim bilgisayarımda Ubuntu 18.04 işletim sistemi yüklü. Python sürümü 3.6. GPU destekli Tensorflow kurulumundaki sorunları aşmak için gerektiğinde Anaconda da kullanıyorum. IDE sistemim: güncel Pycharm Community sürümü. Örneklerde kullandığım OpenCV sürümü 3.4.3.

Adrian Rosebrock, betiklerinde komut modunu kullanmayı seviyor. Bense parametreleri dışarıdan vermek yerine betiğin içine gömmeyi daha fazla tercih ediyorum. Ayrıca, çok mecbur kalmadıkça ekrana print ettirdiğim ifadelerde geçen Türkçe karakterlerin “olması gerektiği gibi” görünmesini de önemsiyorum.

Lafı daha fazla uzatmadan ilk örneğimizi kodlayalım. Bu örnek bir başka siteden: https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826

Betiğimiz webcam görüntülerini tarayıp ekrana yansıtmaktadır.

cap = cv2.VideoCapture(0) satırı, varsayılan webcam cihazını aktif hale getirerek, görüntüleri yakalamasını sağlamaktadır.

cap.set() metodu ile görüntünün en ve yükseklik değerleri belirleniyor.

Sonsuz while döngümüzün içinde görüntü yakalama işlemi cap.read() metodu tarafından gerçekleştirilmekte ve “frame” değişkenine aktarılmaktadır. “ret” değeri okuma işleminin başarılı olup olmadığını saptamaktadır.

cv2.flip() metodu, webcam görüntünüz tepetaklak ise işe yarayacaktır. Eğer webcam görüntünüz normalse, bu satırı -benim yaptığım gibi- devre dışı bırakmanız gerekir.

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) satırı ile “frame” görüntüsünü “GRİ” renge çeviriyoruz.

cv2.COLOR_BGRGRAY parametresindeki “BGR” harfleri (B)lue-(G)reen-(R)ed (mavi-yeşil-kırmızı) kelimelerinden türetilmiştir. OpenCV RGB yerine BGR renk sistemini kullanmaktadır.

cv2.imshow() metodu imajları görünür hale getirmek için kullanılır. “frame” ve “gray” imajlarını ayrı ayrı görselleştiriyoruz.

OpenCV sisteminde olay yakalama mekanizması cv2.waitkey() metodu ile başlatılır. Bu metod kullanılmazsa ne görüntüleme, ne de tuş yakalama olayları gerçekleşebilir.

Döngüyü kırmak için ‘Esc’ veya ‘q’ tuşlarını tanımlıyoruz. Bu tuşlardan herhangi biri tıklandığında döngümüz kırılıyor; cap nesnesi sebest bırakılıyor ve oluşturulan tüm pencereler bellekten temizleniyor.

Eğer istersek görüntü karelerini webcam cihazımız yerine herhangi bir video dosyasından da aynı şekilde okuyabiliriz. Sonraki yazılarımda bu tür örnekleri de ele alacağım.

Örnek betiğimizden gördüğümüz gibi, OpenCV işlerimizi olağanüstü derecede kolaylaştırmaktadır.

Bu kütüphaneyi bir PC veya dizüstü üzerinde olduğu gibi, Raspberry Pi gibi mikro bilgisayarlar üzerinde de çalıştırabilmekteyiz. Bu konuyu da daha sonra ele alacağım.

Eğer bilgisayarınızda OpenCV zaten kuruluysa, örneğimizi de kolayca çalıştırmış olmalısınız.

Ama bu kütüphaneyi ilk kez kuracaksanız, işiniz o kadar kolay olmayabilir. Çünkü bu kütüphane çok geniş bir alana el attığı için pek çok başka kütüphanenin varlığına ihtiyaç duyar. Öncelikle bu kütüphanelerin kurulup hazır hale getirilmesi gerekiyor.

Bu yazıyı daha fazla uzatmamak için OpenCV kurulumunu bir sonraki yazımda ele alacağım.

Beni izlemeye devam edin.

Ahmet Aksoy

(1) – https://docs.opencv.org/3.4/d0/de3/tutorial_py_intro.html

  tarafından 12:12 itibariyle gönderildi.
Eyl 162018
 
pösteki saymak
825 kez okundu

Pösteki Saymak

Sizce, tek bir Türkçe kelime kökünden yapım ve çekim ekleri kullanarak en fazla kaç kelime türetilebilir?

Tam 5081 kelime. Bu kelimelerin türetildiği kök: et.

Bu sayının büyüklüğünde aynı kökün hem yüklem hem de isim olması elbette etkilidir.

Yazının sonunda “et” kökünden türemiş sözcüklerin bazılarını vereceğim.(Hepsini vermek yazıyı gereksiz yere uzatacaktır.)

İkinci sıradaki çok kullanılan kökümüz “ol” yüklemidir. Ondan türeyen kelime sayısı: 3536.

Aşağıdaki grafikte en verimli 20 Türkçe kökü görüyorsunuz.

pösteki saymak

Sözcük türetmede kullanılan ekleri de benzer şekilde ayrıştırıp, frekanslarını buldum. En fazla kullanılan ilk iki ek “ler” ve “leri” ekleri. Onları “ları” ve “lar” izliyor. Onların peşinden gelenlerin çoğunluğunu yine çoğul eklerinin çeşitlemeleri oluşturuyor.

Sözcük türetiminde en fazla kullanılan ilk 20 eki de aşağıdaki grafikte görebilirsiniz:

pösteki saymak

Sözkonusu sayıları elde ederken bir milyon altı yüz altı bin yedi yüz yirmi iki (1,606,722) kelime içeren, kısmen denetlenmiş bir listeden yararlandım. Bu listeden çıkan tekil kök sayısı 20910. Tekil ek sayısı ise 77815.

Son günlerde Türkçe sözcüklerin kök ve eklerine ayrılması çalışmalarına yeniden yoğunlaştım. Bunda Yavuz Kömeçoğlu ve Birol Kuyumcu’nun yayınladığı örnek kodun büyük etkisi oldu: https://github.com/deeplearningturkiye/kelime_kok_ayirici
Seq2seq yöntemiyle çalışan bu kodlar 5572 kelime ve kökünü içeren bir verisetini eğitiyor ve test ediyor. Başarı oranı %97.

Aynı sistemi, kelime sayısını 42600 civarına çıkararak tekrarladım. Bu kez başarı oranı 93.6 oldu.

Parametrelerle oynayarak başarı oranı biraz daha yükseltilebilir sanırım. Ama her bir deneme GPU’lu bir makinede bile bazen saatler sürüyor.

Türkçe Doğal Dil İşleme (NLP) çalışmalarında kök ayırıcı olarak bu sistemden yararlanmak mümkün. Küçük hatalar bu tür çalışmalarda kolaylıkla hoş görülebilir.

Ancak, bu başarı düzeyleri beni bir türlü tatmin etmiyor. Çünkü ben, aslında, yazım hatalarını otomatik olarak -dışarıdan- denetleyen bir sistem geliştirme peşindeyim. Hedefim “SIFIR HATA”!

İşte burada yeni -ve çok daha basit- bir yöntem kullanmanın çok daha verimli olacağına inanıyorum: denetimden geçmiş, doğru ve güvenilir bir kelime listesi kullanmak.

Elimde iki milyona yakın sözcük barındıran ve kısmen denetlenmiş bir liste var. Bu haliyle bile oldukça iyi sonuçlar veriyor. (https://drive.google.com/drive/folders/0B_iRLUok9_qqOFozeHNFMjRHTVk adresinde paylaştığım derlem dosyalarından siz de böyle bir liste oluşturabilirsiniz.)

Aynı listeyi kök ayrımında kullanılacak şekilde geliştirmek de mümkün.

İşte bu tür çalışmaların hemen hepsi, “pösteki saymak” kavramıyla örtüşebilecek nitelikte… Çok fazla emek, sabır ve dikkat gerektiriyor. Üstelik bu çabanın “Türkçe dilgisi” ile de yoğrulmuş olması şart. Türkçe bilgime her ne kadar güveniyor olsam da, bu konunun akademik uzmanı değilim. Umuyorum ki, bir gün “bu işlerin uzmanları” da taşın altına elini koyar.

Çalışmalarımı -şimdilik- kendi kişisel emek ve bilgilerimi kullanarak gerçekleştiriyorum. “SIFIR HATA” hedefime ulaşana kadar da sürdüreceğim.

Liste (aslında sözlük) yöntemini kullanarak çözümlemeye çalıştığım kaynakların pek çoğu aşırı derecede kirli. Bu kaynakların pek çoğu tarayıcı kullanılarak sayısallaştırılmış. Bu sırada, uygulamalardaki Türkçe uyum sorunları nedeniyle pek çok yazım hatası oluşmuş. İnsan beyni bu tür hataları kolaylıkla tolere edebilse de, temiz ve güvenilir bilgi derleme açısından işler büyük ölçüde zorlaşıyor.

Bir kaç kez gönüllü ekip oluşturmayı denedik, ama sonuç alamadık.

Şimdi, yaptığım çalışmalardan elde ettiğim sonuçları -veya bir kısmını- kaynaklara ekleyerek – bir tür forward propagation ve backward propagation yöntemiyle- daha sağlıklı sonuçlar elde etmeye çalışıyorum. İşin içine insan emeği girince, çalışmalar yavaşlıyor ister istemez. Ama sonuçtan memnunum.

Kelimeleri ayrıştırıp görselleştirdiğim Python kodları şöyle:

Bunlar da “et” sözcüğünden türetme yapan eklerden bazıları:
et
edebildi
edebildik
edebildikleri
edebildikleridir
edebildiklerim
edebildiklerimden
edebildiklerime
edebildiklerimi
edebildiklerimiz
edebildiklerimizden
edebildiklerimizdi
edebildiklerimize
edebildiklerimizi
edebildiklerimizin
edebildiklerince
edebildiklerinde
edebildiklerinden
edebildiklerine
edebildiklerini
edebildiklerinin
edebildikleriydi
edebildikleriyle
edebildikse
edebildikten
edebildiler
edebildilerse
edebildim
edebildin
edebildiniz
edebildiydi
edebildiyse
edebildiysek
edebildiysem
edebildiysen
edebildiyseniz

Liste uzayıp gidiyor…

Çalışmalarımın gelişimini ve aldığım sonuçları bu sayfalarda yeri geldikçe paylaşmaya devam edeceğim.
Yeni yazılarımdan haberdar olmak istiyorsanız, Sayfanın en altındaki “Beni yeni yazılarda e-posta ile bilgilendir” seçeneğini işaretleyin.

Ahmet Aksoy

Ağu 272018
 
Doların falı
1.821 kez okundu

Doların Falına Bakmak

Son günlerin en çok merak uyandıran konularından biri, elbette “dolardaki yükseliş” konusudur. En can alıcı soru: “Acaba dolar kaç liraya kadar yükselecek?”

Bu konuya bir nebze olsun katkıda bulunmak için, ben de doların falına bakayım dedim!…

Aslında faldan falan anlamasam da, elimde güzel bir fal bakma sistemi var. Facebook tarafından geliştirilmiş: fbprophet. Kullanımı olağanüstü kolay. Pandas ve numpy ile entegre edebiliyor; matplotlib ile sonuçları görselleştirebiliyorsunuz. Zaman serileri için çok pratik bir araç. Python 3.6.5 ile sorunsuz çalışıyor.

USDTRY günlük tarihsel verisini https://tr.investing.com sitesinden indirdim.
İndirdiğim verisetinde “Tarih”,”Şimdi”,”Açılış”,”Yüksek”,”Düşük”,”Fark %” kolonları var. Ben sadece “Tarih” ve “Şimdi” kolonlarını kullandım.

Grafikleri anlamlı bir şekilde yorumlayabilmek için elbette yeterli ekonomi bilgisine sahip olmak gerekiyor. Ben, böyle bir birikime sahip değilim. Yine de, ekonomi bilgisinden bağımsız olarak, ilginç birkaç bilgiye erişebildim:
1. Tarihsel bilgi aralığını çok geniş veya çok dar tutunca sonuçlar anlamsızlaşıyor.
2. 2 ila 5 yıllık dönemlerin eksterpolasyonu daha anlamlı görünüyor.
3. Doların ne yapacağını sadece eldeki tarihsel veriyi kullanarak kestirmek mümkün değil. (Bu işi ekonomistlere bırakmak yerinde olacak.)

Projede 3 ayrı dönemi inceledim: 2012, 2014 ve 2016 yılından günümüze kadarki dönemler.

1. dönem: 01.01.2016 – 24.08.2018 arası. Bu döneme göre 2019 yıl başında oluşacak dolar değeri yaklaşık 9.00 TL.

Doların falı

2016-2018 dönemi


2. dönem: 01.01.2014 – 24.08.2018 arası. Bu döneme göre 2019 yıl başında oluşacak dolar değeri yaklaşık 6.50 TL.
Doların falı

2014-2018 dönemi


3. dönem: 01.01.2012 – 24.08.2018 arası. Bu döneme göre 2019 yıl başında oluşacak dolar değeri yaklaşık 5.20 TL.
Doların falı

2012-2018 dönemi

Hangi senaryoyu seçeceğiniz, tamamen size kalmış.

Ben falda çıkanı söyledim sadece.

Bunlar da kodlarımız:

Ahmet Aksoy

  tarafından 15:13 itibariyle gönderildi.
Ağu 102018
 
849 kez okundu

Kaçıncı Yeni

Kaçıncı Yeni

1950’li yıllarda edebiyat sahnesine giren “2. Yeni” şiir akımı, bir tepkiyi dile getiriyordu. Bu tepki, Varlık Dergisi etrafında Orhan Veli ve arkadaşlarının başlattığı Garip akımına karşıydı. Eş zamanlı olarak, 2. Dünya Savaşının tetiklediği bunalım ortamlarından filizlenen dadaizm ve varoluşçuluk gibi akımlardan esinlendi.

Bu akımın önde gelen isimleri Cemal Süreya, İlhan Berk, Edip Cansever, Ece Ayhan, Turgut Uyar, Ülkü Tamer ve Sezai Karakoç gibi isimlerdi.

İkinci yenicilerin sloganı “şiir için şiir”dir. Onlar için söz sanatları, kelime oyunları ve hayal dünyası ön plandadır. Bu yüzden mesajlarını doğrudan doğruya vermek yerine imgeleri ve metaforları kullanmayı tercih ettiler.

Bazı 2. yeni şiirleri peşpeşe dizilmiş, ilgisiz sözcüklerden oluşan anlamsız bir biçim gibi görünür. Cümleler belirsiz veya devriktir. Hatta hiç cümle yoktur.

İşte Ece Ayhan’dan birkaç dize:

geçer sokaktan bakışsız bir
Kedi Kara.
Çuvalında yeni ölmüş bir çocuk.
Kanatları sığmamış.
Bağırır Eskici Dede.
Bir korsan gemisi! girmiş körfeze

Biraz kargalarlı, aykırı düşüncelerdir.

Peki bunları niye anlatıyorum?

Çünkü, Tensorflow ile “Char-RNN” yöntemini kullanarak oluşturduğum örnekler bir bakıma bu “2. Yeni” şiirlerine benziyor.
Ancak bu sonucu yaratan baş etmen, sistemi eğitmek amacıyla kullandığım veri kümesinin yeterli büyüklüğe sahip olmayışıdır.
Bir diğer etken ise verilerin içinde yer alan dizim hatalarıdır. Bu durumu ne yazık ki sonradan farkettim. Bütün dizeleri tek tek gözden geçirip düzeltmeye çalışmak, olağanüstü bir çaba ve zaman gerektiriyor.

Yine de, durumu biraz olsun hafifletmek amacıyla “geçersiz sözcük barındıran dizeleri” silen bir süzgeç kullandım. Bu sayede elde ettiğim tüm dizeler, tamamiyle geçerli Türkçe sözcüklerden oluşmaktadır.

İşte benim haylaz öğrencinin dile getirdiği bazı dizeler:

Ne herşey evleri
kağıttan görüyorum
Mutlaka kalacaktı bana inat
İstememiş, sokaklarımız

Kan deniz öyle biri
Anlama gittiğimiz yok
Ben ayı açık sızlar,
umuttan ömrümüz

Kaygılar her şeyleri yerinde

Yağmurları sis böyle düştüm
perde, ilk zamanmış bütün
Ve bu zaman bir güllerden
Aşktı
Acısıyla kaybettiğim karanlıkta

Sonuçların ileride daha fazla anlamsal bütünlük kazanacağını umuyorum. Bunu sağlamak için, öncelikle eğittiğim veri kümesini daha büyük boyutlu ve sorunsuz dizelerden oluşan bir yapıya kavuşturmam gerek. Bu da uzunca bir zamana ihtiyaç duyacak.
Şimdilik, geçici bir yöntem olarak, elde ettiğim ayıklanmış dizeleri mevcut veri kümesine ekleyip, yeniden eğitiyorum. Bu tekrarların ne kadar yarar sağlayacağını zaman gösterecek. Sonuçları yine burada, sizlerle paylaşacağım.

Veri kümesini eğitmek için kullandığım Python kodlarını daha önce paylaşmıştım: http://python.gurmezin.com/tensorflow-ile-acemi-siirler/. Orijinal kodlara, https://github.com/sherjilozair/char-rnn-tensorflow adresinden ulaşabilirsiniz.

Bu çalışmada Python 3.6.5 kullandım. Tensorflow sürümü 1.5.0. 6GB belleği olan GPU ile eğitim işlemi yaklaşık 15 dakika sürüyor.

Veri kümesini internet üzerinden rasgele derlediğim için, şimdilik paylaşmam mümkün değil. İleride, paylaşılabilecek bir veri kümesi oluşturma şansı elde edersem, elbette o veri kümesini sizlerle de paylaşacağım.

Soru, öneri ve eleştirileriniz için yorum alanını kullanabilirsiniz.

Tekrar görüşmek üzere,

Ahmet Aksoy

Oca 212018
 
11.856 kez okundu

OpenCV ile Yüz Tanıma

OpenCVOpenCV kütüphanesi BSD lisansı ile yayınlanan bir kütüphane. Hem akademik, hem de ticari kullanıma açık. Kütüphanenin asıl odaklandığı konu gerçek zamanlı uygulamalar için hızlı ve etkin hesaplama araç ve yöntemlerinin geliştirilmesi.

En son sürümü OpenCV 3.4, 23 Aralık 2017 tarihinde duyurulan kütüphane, bugüne kadar yaklaşık 11 milyon kez indirilmiş. Github üzerinde 25,988 opencv projesi mevcut. Bunlardan 6193 adedi Python ile yapılmış.

Bu yazımda size bir github projesini tanıtacağım: https://github.com/ageitgey/face_recognition/

İnsan yüzlerini tanımak amacıyla geliştirilmiş bir proje bu. MIT lisansıyla paylaşılıyor. Güncel.

Bu projeyi Ubuntu 16.04 üzerinde, Python 3.5.2 ile test ettim.

Tek resim üzerinde olduğu gibi, video kareleri ve webcam görüntüleri üzerinde de verimli bir şekilde çalışıyor.

Yüz tanıma kodlarını çalıştırmak için gereken kurulumların nasıl yapılacağı proje sayfasında ayrıntılı bir şekilde anlatılmış. Ben tekrarlamayacağım.

Proje sayfasında verilen örnek kodların hepsini tek tek test ettim. Hepsi çalışır durumda. Sadece webcam ile görüntü tarama kodlarında küçük bir değişiklik yapmam gerekti. Çünkü benim bilgisayarımın webcam kamerası görüntüleri tepetaklak gösteriyor. Sizin bilgisayarınızda benimki gibi bir sorun yoksa, eklediğim düzeltme işlemine de gerek duymayacaksınız.

Önce kodları paylaşayım (Bu kodlar, kendisine bir resim dosyasıyla tanıtılan yüzü, gerçek zamanlı webcam görüntülerinde yakalayıp işaretliyor. Orijinal kodlarda ‘obama.jpg’ kullanılmakta. Aynı kodların başka görseller üzerinde de etkin bir şekilde çalıştığını göstermek amacıyla kendi resmimi tanıttım.) :

Kodları test ettiğim bilgisayardaki sistem ve kütüphaneler şöyle:
Ubuntu 16.04
Python 3.5.2
OpenCV 3.2.0
face-recognition 1.0.0

Kodlar çok açık ve anlaşılır şekilde yazılmış. Ayrıntıya girmeyeceğim. Betiği durdurmak istediğinizde ‘q’ butonuna basmanız yeterli.

Aynı kodları test etmek için siz de kendi fotoğrafınızı kullanabilirsiniz.

Videoda betiğin nasıl çalıştığını görmek mümkün. Tanıtım fotoğrafımda gözlük yok. Ama gözlük taktığımda bile tanıma sorunu olmuyor. Yüzün orta bölümünde büyükçe bir bölüm kapatılırsa, tanıma ancak o zaman engelleniyor.

Şu anda elimde Raspberry Pi için kamera olmadığından testlerimi sadece dizüstü bilgisayarımda yaptım. Uygun bir zamanda aynı işlemleri Raspberry Pi üzerinde de tekrarlayacağım.

Beni izlemeye devam edin.

Ahmet Aksoy

Referanslar:

Oca 172018
 
2.898 kez okundu

Tensorflow ile Acemi Şiirler

Bu yazımda internet üzerinden rasgele derlenmiş şiirler kullanarak eğittiğim sistemden aldığım -şiirimsi- çıktıları paylaşacağım.

şiirimsi tensorflow

Henüz abartılı bir sonuç beklemeyin. Nasıl ki bir bebeğin konuşmayı öğrenmesi için belli bir zamana ihtiyacı varsa, makine öğrenmesi sistemlerinin de öğrenmek için zamana ve çabaya ihtiyacı var.

Bu çalışmada Kullandığım veri seti internet üzerinden rasgele toplanmış yaklaşık 70 bin dize içeriyor. Bu veri özel bir denetimden geçmedi. Şair veya biçem konusunda herhangi bir ayrım uygulanmadı. Tek kaygı, dişe dokunur sonuçlar elde edebilmek için veri boyutunun en az 1 milyon karakter olması gereğiydi. (Bu bir kural olmasa da, bir çok uzmanın önerisi bu yönde.) Kullandığım veri setinin boyutu yaklaşık 2MB.

Program, Tensorflow kütüphanesiyle karakter düzeyli RNN (Recurrent Neural Network) eğitimi yapıyor.

Raspberry Pi 3 üzerinde Tensorflow kurulumunu “Raspberry Pi ile Tensorflow 2” başlıklı yazımda ele almıştım. Tensorflow 1.1.0, Python 3.4 üzerinde sorunsuz bir şekilde çalışıyor. (Halen en son Tensorflow sürüm numarası 1.5)

Eğitim çalışmasında Sherjil Ozair’in github deposundaki kodlarını kullandım: https://github.com/sherjilozair/char-rnn-tensorflow

Eğitim için Python 2 veya Python 3 kullanmak mümkün. Ancak Tensorflow sürümü en az 1.0 olmalıdır.

EĞİTİM İŞLEMLERİ

Eğitim işlemi

komutuyla yapılıyor. Eğer herhangi bir parametre vermezseniz, otomatik olarak “Tiny Shakespeare” verisi kullanılıyor. İsterseniz, internet üzerinden başka veri setleri de bulup indirebilirsiniz.

Sanal ortam üzerindeki kendi eğitim çalışmamda şu kodları kullandım:

Tensorflow

Her batch işlemi yaklaşık .25 saniye tutuyor. Toplam 40050 batch olduğuna göre yaklaşık 10 bin saniyelik bir eğitim süresi olacak. Yani 3 saate yakın bir süre.

Bilgisayarım 4 çekirdekli bir i5. Ancak tam yükte aşırı ısındığından, çökmemesi için işlemcileri 2.53GHz yerine 2.40GHz hızla çalıştırabiliyorum. Aynı işlemler Raspberry Pi 3 üzerinde 8 kat daha fazla bir zamana ihtiyaç duyuyor. Bu yüzden tek bir Raspberry Pi ile bu tür bir eğitim yapmak pek de verimli değil.

Ancak, bir başka bilgisayarda eğitilmiş veri setini Raspi’ye aktarıp, kullanabilirsiniz. Ben de bu yöntemi tercih ediyorum.

SONUÇLAR

Eğitilmiş bir veri setini kullanarak sonuç elde etmek için verilecek komut şu:

Yukarıdaki komuttan da anlaşılacağı gibi, eğitilmiş veri “save/siirler” klasöründe bulunuyor.

Dizüstü bilgisayarımda eğittiğim veriyi Raspberry Pi 3 üzerine “rsync” komutu ile çektim ve raporladım:

Raspberry Pi 3 üzerinde rapor alma işlemi bile yaklaşık 30 saniye sürüyor.

Bir örnek daha:

Çok daha büyük bir veri seti ve -tercihen- GPU kullanabilen bir bilgisayarda eğitilmiş veri setleriyle çok daha anlamlı sonuçlar elde etmek mümkün olabilir.

Eğer güçlü bir bilgisayara sahipseniz veya sabırlı biriyseniz siz de kendi veri kümelerinizi eğitebilirsiniz.

Ahmet Aksoy

Referanslar:

Ara 162017
 
Raspberry Pi ve Makine Öğrenmesi
1.567 kez okundu

Raspberry Pi ve Makine Öğrenmesi

Yeni bir startup olan Jetpac, görsel tanıma yazılımı Deepbelief’i farklı sistem ve cihazlar üzerinde kolayca kurulup kullanılabilir hale getirdi. Bu girişim, Raspberry Pi ve Makine Öğrenmesi açısından da önemli bir kazanım olacak gibi görünüyor.

DeepBelief sistemini Linux, iOS, OSX, Android, Raspberry Pi ve Javascript üzerinde kullanmak mümkün.

Bu yazımda DeepBelief’in Raspberry Pi üzerinde kurulumunu ve çalıştırılmasını ele alacağım.

Aynı konu http://www.instructables.com/id/Machine-learning-with-Raspberry-Pi/ adresinde işlenmiş. Ancak orada verilen direktifler benim kullandığım Raspberry Pi B+ v1.2 üzerinde biraz sorun yarattı. Ama bu sorunun çözümü de var.

Şimdi en başından başlayarak aşamalar halinde işlemlerimize geçelim:

1. Önce Raspi’ye bağlanalım: (Ben Ubuntu 16.04 üzerinde ssh komutuyla bağlanıyorum. Siz de kendi sisteminizin gerektirdiği şekilde veya cihazınıza klavye, fare ve ekran bağlayarak çalışabilirsiniz.)

Uzaktan bağlanabilmek için Raspinin IP numarasını bilmeniz gerekir. Bu amaçla

komutunu kullanabilirsiniz. sudo kullanırsanız, root yetkisiyle daha ayrıntılı bir rapor alırsınız.

2. GPU kullanımı için bellek tanımlama:

Dosyanın sonuna aşağıdaki satırı ekleyelim:

3. Bellekte yaptığımız değişikliğin sistem tarafından algılanması için cihazımızı yeniden başlatalım:

4. Raspinin kendini yeniden başlatması birkaç dakika sürebilir. Yeteri kadar bekledikten sonra yeniden bağlanalım.

5. Dosyalarımızı github üzerinden indireceğimiz için git uygulamasını kurmamız gerekiyor.

6. Artık DeepBeliefSDK dosyalarını indirip kurulumunu yapabiliriz.

7. Kurulumu yaptık. Sonucu denetlemek için örnek uygulamayı çalıştıralım:

Eğer herşey yolunda gittiyse 998 satırlık bir rapor elde edeceksiniz.

Ya da benim gibi “Can’t open device file: /var/lib/jpcnn/char_dev” mesajını alacaksınız. Bu hata mesajından kurtulmak için aşağıdaki komutları verin:

Artık uygulamamızı yeniden çalıştırabiliriz:

Elde edeceğimiz rapor resimdekine benzeyecektir.

Raspberry Pi ve Makine Öğrenmesi

deepbelief uygulaması, herhangi bir parametre verilmeden çalıştırıldığı zaman “lena.png” dosyasını varsayılan olarak yükler ve öntanımlı imagenet nesneleriyle karşılaştırarak benzerlik oranlarını bulur.

Raporda sıra no, benzerlik olasılığı ve nesne etiketi sıralanır.
En büyük olasılığa sahip olan görüntülerle eşleşme gerçekleşmiştir diyebiliriz.
Eğer sonuçları olasılık değerine göre sıralarsak, benzerlikleri yorumlamamız daha kolay olur.

İstediğiniz bir başka görseli taratmak isterseniz, adını parametre olarak vermek gerekir. Örneğin “cicek.jpg” dosyasını taratmak istediğimizde vereceğimiz komut şöyledir:

DeepBelief sistemini Ubuntu üzerinde kurmak çok daha kolay oluyor. Siz de kendi sisteminizde deneyin.

Ahmet Aksoy

Referanslar: