30 Ağustos 2016 Salı

Python - OPENCV ile kişi sayma


Bu yazı kapsamında Python ile OPENCV kütüphanesini kullanarak tavana yerleştirilmiş bir kameradan elde edilen görüntüler ile hareket eden nesneleri (bizim örneğimizde kişileri) saymaya çalıştık. Bunun için kullanacağımız algoritmanın temel adımlarını şu şekilde sıralayabiliriz;


1- Background Subtraction : Sabit bir arka plandan her gelen yeni görüntüyü çıkararak görüntüde (videoda) değişen kısımların yani hareketli nesnelerin belirlenmesi

2- Object Tracking : Belirlenen bu ön plandaki nesnelerin takip edilmesi

3- People Counting : Takip edilen bu nesnelerin (hareketli kişilerin) belirli noktayı geçtiklerinde sayılması ve geçiş yönünün belirtilmesi

( Kullandığımız videoyu şuradan indirebilirsiniz.. )

Background Subtraction için OPENCV kütüphanesi içerisindeki fonksiyonlardan arka planının modellenmesinde Gaussian Mixture Model'in kullanıldığı cv2.BackgroundSubtractorMOG() fonksiyonunu kullanıyoruz.

Bunun için ilk olarak masaüstünde kayıtlı olan çekilen alanın boş bir görüntüsünü yüklüyoruz. Daha sonra ise videoyu yükleyip her bir gelen frame 'e backgroundsubtraction işlemini uyguluyoruz.





Daha sonra maskelenmiş bu görüntüye (fgmask) dilation işlemi uygulayıp, cv2.findContours fonksiyonu ile fark görüntüsündeki bulunan nesnelerin alanlarını bulup bu alanı çevreleyen bir dikdörtgen çizdiriyoruz.




Örnek bir fark görüntüsü (fgmask) şu şekildedir. (Boş görüntüden videonun her bir frame' nin farkının alınmış hali)

Bu aşamaya kadar Background Subtraction işlemini yapıp ön plandaki yeni nesneleri yani kişileri bulmuş ve bunları bir dikdörtgen içerisine almış olduk. Ayrıca o anki bulunan kişileri aldığımız dikdörtgenlerin koordinatlarını (bir başka deyişle kişilerin konumlarını) ve bir önceki frame 'de geçen kişilerin konumlarını iki farklı listede(contours_now ve contours_previous) saklıyoruz.

Devamında ise ard arda gelen iki frame arasında bulunan contour lardan hangisinin bir diğer frame'de önceki ile aynı kişiye ait olduğunu (yani tracking işlemi) bulmamız gerekiyor. Bunun için bulunulan andaki frame deki contour lar ile bir önceki görüntüdeki(contours_previous) contour ları karşılaştırıp uzaklık olarak birbirlerine en yakın olanların aynı kişi olduğunu farzediyoruz ve contour_now listesindeki kişilerin contours_previous listesinde aslında hangi kişiye denk geldiklerini bu şekilde belirleyip bu bilgiyi de bir başka listede(closest_contour_list)  saklıyoruz.



Böylece tracking işlemini geliştirdiğimiz basit, belki her zaman doğru olamayacak :) fakat iş de görebilecek bir algoritma ile çözmüş olduk. Ve son olarak videoda seçmiş olduğumuz bir orta noktaya (line) göre hareketin hangi yöne doğru olduğunu anlamaya çalışıyoruz. Başlangıçta People Counting diye adlandırdığımız bu problemi çözmek için ise; 'track' ettiğmiz kişilerin belirttiğimiz noktadan geçtikleri anda ard arda gelen frame lerdeki y koordinatlarına bakarak hangi yöne gittiklerini anlayıp buna göre ekranda sol üst köşede görüntülenen çıkan ya da gelen sayısını bir artırıyoruz.



Aşağıdaki video'da programın nasıl çalıştığını görüntüleyebilirsiniz. Geliştirilen algoritmada eksikler var mı var, yüzde yüz çalıştığını söyleyemeyiz.  Neler eklenebilir, hangi kısımları düzeltilmeli gibi şeylere değinmeyeceğim, sadece kaba taslak bir örnek uygulama gerçekleştirmiş oldum ve paylaşmak istedim. Eksikleri gedikleri de bu işe kafa yoran birisi yani meraklısı düzeltebilir..






5 yorum:

  1. İbrahim hocam,merhaba.ben byiyifikir@hotmail.com'adresinden Mehmetali
    opencv ile kişi sayma procenizdeki eksik satırlarıda paylaşmanız mümkünmü?
    (1-7),28,46,72,99,ve diğerleri

    YanıtlaSil
  2. İbrahim hocam,video'yu izledim,süpersiniz,maşallah.e2 tv kanalında person of interest adında bir film vardı,aklıma o geldi,videoyu izleyince.
    python yorumlayıcısı paralel işlemler(multithreding) yapılabiliyormu(java sanal makinada olduğu gibi),video'yu izleyince yapabiliyor,dedim,doğrusunu sizden öğrenmek isterim.

    YanıtlaSil
  3. İbrahim hocam,opencv kütüphanesini pythona nasıl ekliyoruz.visual studio c++'da cmake ile opencv kütüphanesini derledikten sonra visual studio'ya ekliyorduk.pythonda opencv kütüphanesini nasıl derleyip,ekliyoruz.

    YanıtlaSil
    Yanıtlar
    1. Python için conda dağımı var, bir çok kütüphane ekli geliyor gayet kullanışlı. https://www.continuum.io/downloads

      Şayet Conda ile Python 2.7 sürümünü yüklersen, terminalden aşağıdaki komut satırı ile tek bir komutta kolayca Opencv Yükleyebiliyorsun. Conda nın Python 3.4 sürümü galiba henüz Opencv desteklemiyor, hangi kütüphanelerin desteklendiğine dair ayrıntılı bilgi için (https://docs.continuum.io/anaconda/pkg-docs)


      conda install -c https://conda.binstar.org/menpo opencv

      Sil
  4. Bu yorum yazar tarafından silindi.

    YanıtlaSil