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..






56 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
  5. Hocam paylaşım güzel teşekkürler ancak 77-87 satırları arasında line var onu programın en başında mı tanımladınız çalıştıramıyorum programı eksik kod kısımları mı var acaba program da tamamını paylaşmanız mümkünmüdür. Teşekkürler

    YanıtlaSil
  6. Evet "line" değişkeni en başta tanımlı olması gerek. Parça parça koymamın sebebi kodu çalıştırmak isterken detayına daha çok inip daha iyi anlaşılmasını sğlamak...

    YanıtlaSil
  7. could you please share code with me ? Akash.patel@wobot.ai
    thanks

    YanıtlaSil
  8. code please....... bell906@naver.com

    YanıtlaSil
    Yanıtlar
    1. Hi, I have sent you an email, you can find the file as attachment

      Sil
    2. Even if I erase the line, it counts

      Sil
  9. Merhaba hocam.Kodu rica edeibilirmiyim.researcherman.asszy@gmail.com

    YanıtlaSil
    Yanıtlar
    1. Merhaba, açıklamaları okuyup parça parça verdiğim kodları yazarsan hem anlamış hem de koda ulaşmış olacaksın aslında. Sırf bu sebeple kodu direkt koymadım ve Türk arkadaşlara göndermemiştim. Herneyse mailine gönderdim şimdi, İyi çalışmalar

      Sil
    2. teşekkürler hocam.Bende anlamaya çalışıyorum.Fakat dilede çok hakim olmadığım için bağlantıyı iyi kurmadım.

      Sil
    3. hocam frame_empty kısmında benim sıkıntı çıktı.Orada tam yapcağımız şeyi anlamadım.frame_empty no such file hatası verdi.Burada frame_empty manual olarak mı oluşturcaz.Ne tip oluşturacağız bir de.

      Sil
    4. frame_empty videodaki alanın boş bir fotoğrafı olacak, yani videoda insan yokken bir fotoğraf alıp onu direk array olarak ya da görüntü olarak bilgisayara kaydedeceksiniz. Daha sonra bu boş görüntüyü referans olarak kullanmak için background alma işlemine ilk o boş görüntüyü veriyoruz.

      Sil
  10. kodu benimle de paylaşmanız mümkün mü e mail adresim sabihahazal@gmail.com

    YanıtlaSil
  11. hocam kodu paylaşabılırmısınız

    YanıtlaSil
  12. Pchocpchocam41@gmail.com
    Hocam atamızın banada yazıcam yinede ama sen at

    YanıtlaSil
  13. Öncelikle elinize sağlık çok teşekkür ederim Kodu eğer mümkünse benimle de paylaşabilir misiniz? Şimdiden çok teşekkür ederim.
    serifecelikbas@yahoo.com

    YanıtlaSil
  14. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  15. merhaba kodu paylaşabilir misiniz.Teşekkürler.
    firatugur@gizia.com

    YanıtlaSil
  16. hocam kodu paylaşabılırmısınız
    firatugur@gizia.com

    YanıtlaSil
  17. Öncelikle bu güzel çalışmanızdan dolayı tebrik ve detaylı anlatımınızdan dolayı teşekkür ederim. Rica etsem kodu bizimle de paylaşır mısınız.... scaryevent704@gmail.com
    Teşekkürler.

    YanıtlaSil
  18. Kodunuzu paylaşırsanız sevinirim. Teşekkürler. remzigurfidan@gmail.com

    YanıtlaSil
  19. Merhaba,kodu paylaşabilir misiniz? komastasmamasita@gmail.com

    YanıtlaSil
  20. hocam kodu paylaşabilirseniz sevinirim.
    caneryldrim@gmail.com

    YanıtlaSil
  21. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  22. Hocam biz liseli bir grup olarak 3 gündür kodunuz üstünde kafa yoruyoruz ama oturtamadığımız bazı bölümler var boş frame kısmın halletik giren çıkan değişkenlerini ve çizgi değişkenini düzelttik ama hala farklı değerler alıyoruz proje kodlarını yollama ihtimaliniz var mıdır ? diyecektim.Teşekkür

    YanıtlaSil
  23. MERHABA TASARIM PROJEM İÇİN ARAŞTIRMA YAPIYORUM.KODDA ANLAMADIĞIM BAZI KISIMLAR VAR KODU YOLLAYABİLİR MİSİNİZ ? TEŞEKKÜRLER
    gmz.ozturk99@gmail.com

    YanıtlaSil
  24. Merhaba. Projem için kodları paylaşabilir misiniz?
    sky_berk@hotmail.com

    YanıtlaSil
  25. Merhaba. Projem için kodları paylaşabilir misiniz? Şimdiden çok teşekkür ederim.
    memoc2133m@gmail.com

    YanıtlaSil
  26. Merhaba hocam elinize sağlık.
    kodları benimlede paylaşabilirmisiniz.
    by.tedirgin@gmail.com

    YanıtlaSil
  27. Hocam merhaba kodları benimle de paylaşabilir misiniz? baranselaydn@gmail.com

    YanıtlaSil
  28. Hocam merhaba içerikleriniz gerçekten çok güzel.Rica etsem opencv ile kisi sayma sourcesini gönderebilir misiniz? aliturkdogdu.00@gmail.com

    YanıtlaSil
  29. Merhaba hocam, eskik kısımları oturamıyorum opencv de yeniyim 2 gündür kodunuza bakıyorum fakat hala çözüm bulamadım. Kodu rica etsem paylaşır mısınız? poyraztalha410@gmail.com

    YanıtlaSil
  30. Hocam kodu benimle paylaşma imkanınız var mı, çok teşekkürler
    zelihafedayi@gmail.com

    YanıtlaSil
  31. muhammetalisonmez@gmail.com kodu atarsanız çok sevinirim

    YanıtlaSil
  32. Hocam rica etsem kodları paylaşabilir misiniz ? şimdiden çok teşekkür ederim. vyslgdr@gmail.com

    YanıtlaSil
  33. (nvalkrc.63@gmail.com)
    Rica etsem kodu paylaşabilir misiniz?

    YanıtlaSil
  34. (james6123211@gmail.com)
    Hocam öncellikle nasılsınız? Umarım iyisinizdir. Beni soracak olursanız ben çok iyiyim. Kendimi geliştirmek için sayfanızı sıkça takip ediyorum. Rica etsem kodları paylaşabilir misiniz? Mailim üstte yazıyor. Şimdiden teşekkür ederim.

    YanıtlaSil
    Yanıtlar
    1. Merhaba, daha önce yazan arkadaşlara dönüş yapamamıştım, seninle birlikte onlara da mail attım. İyi çalışmalar

      Sil
  35. Hocam merhaba, acaba kodların eksik kısımlarıyla beraber gorkemsevinc41@hotmail.com adresine gönderebilir misiniz. Şimdiden çok teşekkür ederim.

    YanıtlaSil
  36. Merhaba hocam, rica etsem kodların tümünü cumalieneskarabulut@gmail.com adresine gönderebilir misiniz? şimdiden teşekkür ederim sağlıklı günler.

    YanıtlaSil
  37. Merhaba hocam, rica etsem kodların tümünü bhrbrl98@gmail.com adresine gönderebilir misiniz? şimdiden çok teşekkür ederim

    YanıtlaSil
  38. Selamlar hocam. Rica etsem kodların tamamını bende alabilir miyim? e-posta adresi: ahmet8788@hotmail.com

    YanıtlaSil
    Yanıtlar
    1. Buradaki kodlara bakıp kendiniz yazamadı iseniz size Udemy kurslarımı öneriyorum? Hem bu kod hem de daha fazlası orada mevcut :)

      (Not: 2. linkteki kursta aradığınız örnek mevcut)

      https://www.udemy.com/course/python-ile-goruntu-isleme/

      https://www.udemy.com/course/python-uygulamal-egitim-opencvkeraspandas/

      Sil
    2. merhaba hocam
      Traceback (most recent call last):
      File "C:/Users/kbgem/PycharmProjects/pythonProject8/magazagirisi.py", line 8, in
      frame_empty = np.load(path + "frame_empty")
      NameError: name 'path' is not defined

      böyle bir hata alıyorum yardımcı olur musunuz?

      Sil
  39. Merhaba Hocam, source codu rica etsem paylaşabilir misiniz?
    e-mail : hilalurun07@gmail.com

    YanıtlaSil
  40. Emeğinize sağlık hocam. Kodu derledim ancak bir takım hatalar alıyorum. Acaba source code rica etsem paylaşabilir misiniz?
    eraydogan3534@gmail.com

    YanıtlaSil
  41. Hocam elinize sağlık. Gayet güzel bir çalışma olmuş. Udemy'e baktım kodu yazamadım. Kodu eposta adresime gönderebilir misiniz ? sarkovic17@gmail.com

    YanıtlaSil
  42. Hocam Merhabalar,
    Elinize sağlık çalışmalarınız çok faydalı. Mümkünse kodu email adresime gönderebilir misiniz?
    ramoking449@gmail.com

    YanıtlaSil
  43. Hello, can u please send the source code.....serhatsisli353@gmail.com

    YanıtlaSil
  44. abi allah aşkına kodu gönderir misin. 2 gün içinde proje için lazım. Çok hayra geçersin abi. lütfennn.......aktemuryigit@gmail.com

    YanıtlaSil