İçeriğe geç

İstanbul’u izliyorum gözlerim kapalı

Eğer yüksek bir tepedeyseniz ve karşınızda bulunduğunuz yerden daha yüksek binalar yoksa tek bir bakışta İstanbul’un büyük bir kısmını görebilirsiniz; Lakin amacınız İstanbul’u sadece izlemek değil gördüklerinizi not almak, yüzlerce insanı aynı anda takip etmek, çıkarımda bulunmak gibi uğraştırıcı işlerse bu biraz zor(hatta imkansız).

İllüstrasyon :  Matt Vogt

İstanbul Büyükşehir Belediyesi yüksek bir tepeye çıkmadan İstanbul’u izlememiz için önemli yerlere turistik kameralar koymuş ve bunları herkese açık bir şekilde yayınlıyor. Mobese ‘nin de ondan pek aşağı kalır bir yanı yok. Mobese İstanbul’da hemen hemen her yerdeki trafik kameralarını halka açık bir şekilde kendi websitesinde yayınlıyor. Hatta 30 Temmuz 2013 tarihinde (daha o zamanlar 13 yaşındayım dalga geçmeyin :D) İstanbul’da bütün turistik kameraları tek bir yazılımdan izleyecek bir yazılım yapıp insanlarla paylaşmıştım.

Artık İstanbul’u daha kolay ve istediğim her yerden izleyebilirim; Fakat her şey o kadar hızlı akıyor ki gözlerim hiç bir şeyi seçemiyor. Oysa görmek demek bir şeyin varlığını seçmek anlamlandırmak değil midir? Belki 13 yaşımda bir kenarda bıraktığım işi daha da geliştirebilirim. O zaman bu yazının devamında Person Of İnterest’te olduğu gibi bir makine yaratmaya çalışacağım.

Bölüm 1: Nesneleri algılamak

Amerika ‘yı baştan keşfetmeye gerek yok internette onlarca hazır kütüphaneler, verisetleri var. Çalışırken bu kütüphaneler ve verisetleri üzerinden çalışacağım. Kütüphane olarak OpenCV(olmazsa olmaz) ve NumPY kütüphanesinden faydalanacağım. Objeleri algılamak için hazır eğitilmiş Yolov3 verisetinden faydalanacağım. Verisetlerini https://pjreddie.com/darknet/yolo/ adresinden indirebilirsiniz. Aynı zamanda Darknet adında CPU ve GPU hesaplamalarını destekleyen, hızlı kurulum imkanı sağlayan bir framework var isterseniz onu kullanabilirsiniz; Fakat ben bu projede kullanmayacağım.

yolo real time object detection ile ilgili görsel sonucu
Yolo Logo

Yolov3.weights , Yolov3.cfg ve coco dosyalarımı indiriyorum. Belki derin öğrenme ile bağlantısı olmayan ama ilgisi olan okuyucular vardır. Bu sebeple dosyaların ne işe yaradığını açıklama gereği hissetim.Burada Yolov3.weights daha önceden eğitilmiş 9000+ verisetlerini içeriyor. Yolov3.cfg yapılandırma dosyalarını temsil ediyor yani CNN mimarisini , anchor boxlerini,class sayılarını, öğrenme oranını, optimizasyon tekniğini, input boyutlarını , olasılık puanını ve batch boyutlarını içeriyor. Coco dosyası algılanacak objelerin isimlerinin tutulduğu dosya oluyor.Terimleri olabildiğince Türkçe yazmaya çalıştım;Fakat terimleri anlamıyorsanız veya bilgi sahibi değilseniz internetten araştırarak daha fazla sonuç elde edebilirsiniz.

Python ‘da yazdığım 80 satırlık kod ile Yolo verisetlerimi işleyebiliyorum. (Yazı ilham vermek üzerine kurulu olduğu için bütün kodları paylaşmayacağım. Paylaştığım kodların bir kısmına buradan ulaşabilirsiniz : https://github.com/enisgetmez/Istanbul-Poi Fakat kendiniz yapmak isterseniz nasıl yapıldığını anlatmaya çalışacağım.)

Daha sonrasında bütün Mobese kameraları ve turistik kameraların adreslerini m3u8 formatında kaydedip, Python üzerinden sözlük olarak oluşturuyorum. Çünkü sadece seçtiğim kameralar anlık olarak ekranıma düşüp orda veriler işlensin istiyorum.

Yazılımı çalıştırdığımda aldığım sonuçları aşağıda gif olarak ekledim.Sonuçların hepsi gerçek zamanlı kameralardan alıp gerçek zamanlı işlenmiştir.

Sirkeci Deep Learning
FSM Köprüsü Deep Learning

Gördüğünüz gibi başarılı olarak kameralardan gelen görüntüleri anlık olarak işledik. Fakat ben sadece oradan geçen arabaları , insanları değil aynı zamanda insanların ruh hallerini algılamak istiyorum.

Bölüm 2: İnsanların ruh hallerini algılamak.

İnsanların ruh halini algılamak için bir çok metod var; ama hepsinin birbirine göre avantajları ve dezavantajları var. Örneğin ruh hallerini algılamak için Haar Cascade metodunu kullanabiliriz. Avantaj olarak işlemcimizi fazla yormaz daha hızlı sonuç verir. Dezavantaj olarak insan yüzünü sadece belirli bir açıdan gördüğünde algılar ve hata oranı normal derin öğrenme algoritmalarına göre çok yüksek.

emotional detection ile ilgili görsel sonucu

Github’ta biraz araştırma yaptıktan sonra Tensorflow , Keras gibi kütüphanelerle emotional detection yaptıklarını fark ettim. Bunların arasından işlemcimi diğerlerine göre daha az yoracak olan hazır bir yazılım buldum. Yazılımın genel mantığı yine haar cascade ile insan yüzünü tespit ediyor daha sonrasında Tensorflow ile hazır eğitilmiş yüz verilerini işleyip duygu analizini yapıyor.

Emotion Recognition

Duygu analizini Yolo ile birleştirdiğimde yukarıdaki gibi görüntü ile karşılaştım. Fakat burada en büyük sıkıntı çoğu insan farklı açılarda olduğu için cascade metodu her zaman insanların yüzünü algılayamıyor. Bu da işleri biraz zorlaştırıyor. Algoritma 1 saat içerisinde bize 20 tane yüz algılasa bile işimizi görür. Ondan dolayı fazla zorlamayacağım.

Şuan benim yerime bir yazılım insanları görüp algılayabiliyor ve güzel yanı gözleri hiç yorulmuyor. Benim için bu yetmez madem bu kadar şeyi algılayabiliyoruz. Bu verileri kullanarak problem tespitleri yapabiliriz.

Bölüm 3: Yazılımın problemleri algılaması

Yazılımımız yapay gözleri ile her şeyi görebiliyor;fakat sadece görüyor, izliyor. Kimse ona abilik yapmamış ondan kaza nedir? problem nedir? bilmiyor. Ona bir abilik yapalım ve belirli problemleri ve bu problemleri gördüğünde büyüklerine bildirmesini öğretelim. Burdan sonra artık yapay zeka yerine algoritmaların gücünden faydalanacağız.

araba kazası png ile ilgili görsel sonucu

İlk adım araba kazalarının tespitini algılamak olsun. Bunun için yapmamız gereken doğru açıdan arabaları gören bir kamera bulmamız. Eğer yeteri kadar eğimli değilse veya yatay düzlemde arabaları düz bir açıdan görüyorsa algoritmamız çalışmayacaktır. Fakat bütün Mobese kameraları hemen hemen minumum 45 derecelik açıyla yerleştirildiği için bu bizim için pek problem teşkil etmiyor.

Kaza durumunu tespit etmek için izleyeceğimiz yol Yolo veriseti ile çalışan yazılımımızın car ismine sahip objeleri algıladığında ve kare içine aldığında 2 kare birbiriyle kesişiyorsa burdan kaza olduğu sonucuna varacak.

Kaza tespit yazılımının animasyonu

Kaza tespiti için 8 satırlık ek bir kod yazdım. Artık algoritmam car ismine sahip 2 objenin karesi iç içe geçtiğinde bunu kaza olarak adlandıracak.

İkinci adımda izinsiz park tespiti yapacağım. Bunu yaparken geçen yıl yazmış olduğum işaretlediğim alan içerisinde bir yüz algıladığında alarm veren uygulamamı biraz daha evrimleştirip işaretlediğim alanlarda park edilince algılamasını sağlayacağım.

belirtilen alana izinsiz giriş tespiti (Eskiden yaptığım bir çalışma)

Bunu yaparken işaretleme işlemi için opencv fonksiyonlarından bir tanesi olan selectROI komutundan yararlanacağım. Bu komut ile görüntü üzerinde işaretleme yapabiliyorum. İşaretlenen alanın başlangıç x-y ve bitiş x-y kordinatlarını alıyorum. Daha sonrasında algılanan arabanın x ve y kordinatlarını işaretlenen alanımın kordinatları ile karşılaştırıp belirttiğim alana girip girmemiş olduğunu algılamış oluyorum. Park edip etmediğini algılamak için de bunu bir süre ile karşılaştırmam gerekiyor. Yazılımda tic toc olarak adlandırdığımız bir formül var. Bu formül belirttiğimiz alana birisi girdiği andan itibaren tic oluyor ve bir değişkene alana girdiği anın zamanını kaydediyor. Alandan çıktığında da toc oluyor ve tic olarak belirttiğimiz değişkenle zamanı karşılaştırıyor. Belirli bir sürenin üzerinde alan içerisinde kaldığında bunu park etmiş olarak algılıyor. Ben süreyi 10 dakika olarak belirledim.

Yasak park tespiti

SelectROI yöntemi ile yine yasak yere giriş kodunuda yazmış olduk aslında ondan onu tekrar anlatmıyorum. Belirlediğimiz alanlara giriş yapıldığında yazılımımız onu da algılamış olacak.

Bıçak Tespiti yapmak için yine yolo içerisinde hazır eğitilmiş olan knife nesnesi algılandığında alarm verdirteceğim. Yazdığım kodda algılanan objelerin kare işaretlenmesi için bir for döngüsü yazmıştım. For içerisinde her algılanan objenin ismini yazdırdığım için bir alt satırında kolaylıkça if else komutu ile algılanan objenin bıçak olup olmadığını sorgulayabiliyorum.

Bıçak tespit kod parçacığı

Artık yazılım bıçak algıladığında bana alarm verecek.

Buraya aslında karaya gemi veya tekne vurduğunda onu da algılamayı eklemek istiyordum;Fakat bunun için sabit bir kameraya ihtiyaç duyuyorum , deniz gören sabit bir kamera bulamadım. Ama dlib kütüphanesini kullanarak daha önceden hareketli objeleri işaretlediğimde takip eden bir yazılım yapmıştım. Aynı şekilde yeri hareket ediyormuş gibi gösterip seçtiğim alanın sabit kalmasını sağlayabilirim. Entegrasyonunu ileride yaparım şu anlık sadece fikir olarak kalsın. Bu şekilde geçen günlerde Sarıyer’de kıyıya vuran gemiyi daha önceden tespit edebilirdik.

Seçilen objeyi takip etmek(Eskiden yaptığım bir çalışma)
Karaköy vapur algılamak

Düşme tespiti yine kamera düz bir açıyla (yamuk takılmadığı sürece) yerleştirildiğinde algılanan objenin y uzunluğu x uzunluğundan fazlaysa düştüğünü algılayabiliriz.

Bölüm 4 : Yazılımın gördüklerini kaydetmesi

İlgili resim
temsili görüntü

Bunun için verileri bir Json dosyası olarak veya Excell olarak kaydedebilirim. ileride verileri farklı bir yerde kullanmayı planlamadığım için Excell olarak kaydedeceğim. Bunu yaparken openpypxl kütüphanesinden faydalanacağım. İhtiyacım olan veriler algılanan objelerin isimleri , X ve Y eksenindeki kordinatları , o anlık algılanan objenin ortamdaki sayısı, kaza durumu, tehlike durumu, zaman ve duygu durumu. Bu veriler ile daha sonradan sıcaklık haritası (insanlar en çok nereden geçmiş, hangi saatlerde ve hangi günlerde daha kalabalık , vb. verilere ulaşabilirim.)

Bu verileri aldığımda sonuç aşağıdaki gibi oluyor.

verilerin kaydedilmesi
tehlikeli durumların kaydedilmesi

Bölüm 5 : Verileri görselleştirmek, anlamlandırmak

Verileri görselleştirmek en sevdiğim konulardan bir tanesi. Yazılım verileri görselleştirerek bizim olayları daha iyi algılamamızı ve analiz etmemizi sağlayacak. Bunun için Matplotlib kütüphanesinden faydalanacağım.

İnsan grafiği(verileri sadece 1 gün topladığım için tutarlı olmayabilir.)

Kapanış

Artık her şeyi anlık olarak takip edip bana bildiren bir yazılım yapmış oldum. Bunu yaparken sizlere ilham vermesi için olabildiğince anlatmaya çalıştım. Umarım faydalı bir yazı olmuştur. Önümüzdeki günlerde eklediğim geliştirmeleri ve diğer verileri sosyal medya hesaplarımdan sizlerle paylaşıyor olurum. Bundan dolayı sosyal medya hesaplarımdan beni takip etmeyi unutmayın.

Tarih:Projelerim

14 Yorum

  1. Cevheri Cevheri

    Tebrikler çok güzel bir çalışma olmuş. Kodlarını şimdiden çok merak ediyorum. Umarım bir gün open source olur ve herkes birbirine katkı sunarak büyüyerek gelişir.

  2. Ahmet Kandemir PEHLİVANLI Ahmet Kandemir PEHLİVANLI

    Peki bir sorum olacak. Diyelim ki X kişisinin resimlerini öğrettiğimiz bir yazılım daha olsun. Peşinden de bu yazılımı sizin yazılıma entegre edelim. Sonrasında da Y kamerasından X kişisi görüldüğünde bize bildirim yapsın veya excel’e işlesin o bilgileri; hangi saatlerde geçtiği vs.

    Hatta daha da ileriye giderek o X kişisinin yanında birisi olduğunda da yine aynı excel dosyasına işlesin( kaza olup olmadığını anlayan algoritmada değişiklik yaparak, X kişisini gördükten sonra yanında A saniye boyunca yürüyen kişiyi kaydettirmek gibi).

    Sizce böyle bir şey mümkün müdür? Üzerinde çalışma yapmaya değer mi? Bunu sorma sebebim ise yazınız ilgimi çok çekti ve sizinki kadar kapsamlı olmasa da kendi çapımda da böyle bir işe kalkışmak istiyorum. Sınırlı bir C programlama bilgim var. Haliyle Pyton’a yatırım yapmam gerekecek. En azından bu proje ölü bir proje de olsa üzerinde çalışmamın bana ileride ne faydası olacak?

    • Elbette X kişisini tanımanız, takip etmeniz mümkün. Fakat bunun için doğru açıdan ve yakından gören kameralara ihtiyacınız var. Halka açık kameralardan bazıları çok yakından çekim yapabiliyor. Bu kameraları tespit edip üzerinde yazılımınızı çalıştırarak algılayabilirsiniz. Ama birden fazla kamerada aynı anda tespit yapmak isterseniz daha güçlü işlemcilere ihtiyacınız olacaktır. Ölü proje de olsa bir fikir üzerinde çalışmak sizin yaratıcılığınızı ve problem çözme yeteneğinizi geliştirir.

  3. Tebrik ederim çok güzel bir çalışma olmuş bizzat kendim okurken çok heyecanlandım.

  4. Tebrik ederim, bu tarz çalışmaları Türkçe okumak bile mutlu etmeye yetti. Projenin devamını dilerim.

  5. ilkay ilkay

    Merhaba ben githubda ki dosyalarını çalıştırdım fakat hata alıyorum nasıl çalışacak bu uygulama

  6. After study a number of the content in your website now, i genuinely appreciate your method of blogging. I bookmarked it to my bookmark web site list and will also be checking back soon. Pls have a look at my web site also and tell me what you think.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir