Kas 272018
 
1.899 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.
Ağu 102018
 
916 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 172018
 
3.002 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 312017
 
1.444 kez okundu

Raspberry Pi ile Tensorflow 2

Rasperry Pi ile Tensorflow birbirine oldukça yabancı konular gibi görünüyor. Ama uygulamada öyle değil.

Raspberry Pi ile Tensorflow makalesinde Tensorflow kurulumunu Raspberry Pi üzerinde denemiş, ama başarılı olamamıştım.

Aynı işlemleri bu kez Raspberry Pi 3 üzerinde denedim.

RPi 3 üzerine Raspian Strecth kurdum. Ön tanımlı Python3 sürümü 3.5.1. Oysa elimdeki Tensorflow kütüphanesi Python3.4 için derlenmiş.

Çözüm, Tensorflow kurulumunu sisteme değil, farklı bir sanal ortam üzerine yapmak…

İşlemler şöyle:

1. Sanal ortam için virtualenv paketini kuruyoruz:

2. Tensorflow sürüm uyumunu sağlamak için Python3.4 kuruyoruz:

3. Artık sanal ortamımızı oluşturabiliriz:

4. Sanal ortamımızı devreye sokalım. Böylece python komutu doğrudan python3.4 ile eşdeğer olsun:

5. Çalışma klasörümüze geçelim:

6. Şimdi Tensorflow kütüphanemizi indirelim:

7. Tensorflow’u sanal ortamda kuracağız. Bu nedenle sudo komutuna ihtiyacımız yok:

8. Kurulumu test edelim:

Yükleme sorunsuz gerçekleşiyor.
9. Son olarak mock modülünü de sanal sistemimize ekleyelim.

Raspberry Pi ile Tensorflow 2

Artık Tensorflow-1.1.0 kütüphanesiyle istediğimiz gibi çalışabiliriz.

Herşey yolunda!

Yavaş yavaş, Raspi 3 üzerinde Tensorflow projelerine girişebiliriz.

Beni izlemeye devam edin.

Ahmet Aksoy

Referanslar: