Skocz do zawartości

Detekcja ludzi (ludzkiego ciała) na obrazie z kamery przy użyciu biblioteki OpenCV (Python)


FlyingDutch

Pomocna odpowiedź

Cześć,

od kilku dni testuję wykrywanie ludzi w obrazie wideo z kamery przy użyciu biblioteki "OpenCV" (z bibliotekami8 python'a). Zacząłem od "kaskadowego Klasyfikatora Haar'a", który dobrze sprawdza się przy detekcji twarzy - patrz link:

https://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_Object_Detection_Face_Detection_Haar_Cascade_Classifiers.php

Niestety przy wykrywaniu ludzi (lub części ludzkiego ciała) wyniki nie są zadawalające.  Jako drugi algorytm spróbowałem użycia deskryptora HOG (Histogram of Oriented Gradients) razem z algorytmem SVM (Support Vector Machines) - patrz linki:

https://learnopencv.com/histogram-of-oriented-gradients/

https://www.thepythoncode.com/article/hog-feature-extraction-in-python

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_ml/py_svm/py_svm_index.html

Użyłem wcześniej wytrenowanego SVM z deskryptorem HOG'a zainstalowanego razem z opencv -jak w tutorialu poniżej:

https://www.pyimagesearch.com/2015/11/09/pedestrian-detection-opencv/

Według mnie poprawność wykrywania ludzi (zarówno false-positive jak i nie wykrycia ludzi) w danych (zdjęciach) na których algorytm nie był szkolony wynosi pomiędzy sześćdziesiąt a siedemdziesiąt procent. To trochę za mało do moich potrzeb, dlatego chciałbym doszkolić algorytm SVM, aby pewność poprawnej detekcji ludzkiego ciała wynosiła co najmniej 90 procent.  Czy ktoś z Was próbował "doszkolić" SVM (z OpenCV) na swoich przykładach - jeśli tak to może mogę liczyć na jakieś podpowiedzi (czy linki). Z danych które znalazłem w sieci ten tutorial wydaje mi się najbardziej obiecujący:

https://stackoverflow.com/questions/57598104/training-of-svm-and-prediction-using-opencv-with-python

Próbował może ktoś robić podobną detekcję z użyciem konwolucyjnych sieci neuronowych CNN z frameworka Keras (razem z tensorflow), jeśli tak jakie były wyniki?

Tutaj link do danych treningowych który znalazłem:

https://paperswithcode.com/datasets

BTW: czy u Was gdy uruchamiacie programy z wykorzystaniem biblioteki OpenCV na Raspbbery PI 4 lub Raspbbery Pi Compute Module 4 bardzo mocno przegrzewa się CPU?

Pozdrawiam

 

Link do komentarza
Share on other sites

@FlyingDutch Nie robiłem wykrywania ludzi za pomocą OpenCV więc niewiele pomogę, ale z mojego doświadczenia odnośnie tej biblioteki i wydajności Raspberry Pi obawiam się, że na zbyt wiele nie powinieneś raczej liczyć. Z tego co wiem obecnie najlepsze rezultaty w detekcji i segmentacji obrazu uzyskuje się za pomocą głębokich sieci neuronowych i wydaje mi się to o wiele lepszym kierunkiem działania. W przypadku Raspberry możesz dodać TPU, przykładowo https://botland.com.pl/google-coral/16911-google-coral-usb-accelerator-akcelerator-edge-tpu-ml-arm-cortex-m0-842776110077.html Wtedy wykrywanie postaci nie powinno stanowić problemu. Pewnie nawet pozycję danej osoby będziesz mógł wykryć 😉 https://github.com/google-coral/project-bodypix

  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@FlyingDutch Z ciekawości, czy możesz zdradzić gdzie zostanie wykorzystana detekcja, nad którą pracujesz? Czy będziesz dalej szukał innego rozwiązania, które zadowoli Cię pod względem skuteczności i będzie jednocześnie wystarczająco "lekkie" dla RPI? Co z czasem analizy - jest określona jego maksymalna wartość?

Właśnie eksperymentuję sobie z tensorflow-lite na RPI 4B 2GB (mój poziom to absolutnie początkujący) i właśnie udało mi się uruchomić example estymowania pozycji ciała i punktów charakterystycznych (https://www.tensorflow.org/lite/examples/pose_estimation/overview); wydajność wynosi około 2-3 FPS 😉

  • Lubię! 1
Link do komentarza
Share on other sites

6 godzin temu, FlyingDutch napisał:

pracuję nad prototypem lampy do automatycznej sterylizacji wind za pomocą nadfioletu (UVC). Lampa jest wyposażona w dwa czujniki ruchu IR ale to nie zabezpiecza przed np. takim scenariuszem, gdy osoba wejdzeie do windy z innymi ludźmi, stanie gdzies w kącie i np. straci przytomność. RPI z kamerą o kącie widzenia 160 stopni to dodatkowe zabezpieczenie, aby nie uruchomić 30-sto minutowego cyklu serylizacji z lampy UV gdy człowiek jest w środku windy. RPI i kamera oraz dwa czujniki ruchu IR są wbudowane w obudowie lampy. Odnośnie drugiego pytania - tak będę szukał takiego rozwiązania które będzie odpowiednio dokładne i wydajne - bajprawdopodobniej zakończy się na sieci neuronowej konwolucyjnej (CNN) zaimplementowanej z użyciem Keras'a (i tensorflow lite jako rubtime dla wyszkolonej CNN). Odnośnie wydajności to wystarczy mi jeden cykl testowania obecności na kilkanaście sekund.

Dziękuję, bardzo ciekawe - zastanawia mnie jednak (takie pytanie laika), czy do takiej detekcji można byłoby też użyć maty "przyklejonej" do podłogi w windzie tak, aby z drugiej strony znajdowała się matryca belek tensometrycznych ;) Chyba, że pozostaje kwestia "RPI i kamera oraz dwa czujniki ruchu IR są wbudowane w obudowie lampy" czyli całe rozwiązanie musi być integralne, co dyskwalifikuje mój pomysł ;) Nurtuje mnie jeszcze jedno pytanie (przepraszam za dociekliwość) - czy wiesz, jakie będzie wnętrze windy? Bo jeśli tak, to dość łatwo prowadzić detekcję nie tyle jest człowiek<>nie ma człowieka; co winda jest pusta<>w windzie znajduje się cokolwiek np. przez odejmowanie jednego obrazu od drugiego - chyba, że całość musi działać w dowolnym środowisku, to faktycznie ten pomysł też nie ma sensu :)

 

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, wn2001 napisał:

Dziękuję, bardzo ciekawe - zastanawia mnie jednak (takie pytanie laika), czy do takiej detekcji można byłoby też użyć maty "przyklejonej" do podłogi w windzie tak, aby z drugiej strony znajdowała się matryca belek tensometrycznych 😉 Chyba, że pozostaje kwestia "RPI i kamera oraz dwa czujniki ruchu IR są wbudowane w obudowie lampy" czyli całe rozwiązanie musi być integralne, co dyskwalifikuje mój pomysł 😉 Nurtuje mnie jeszcze jedno pytanie (przepraszam za dociekliwość) - czy wiesz, jakie będzie wnętrze windy? Bo jeśli tak, to dość łatwo prowadzić detekcję nie tyle jest człowiek<>nie ma człowieka; co winda jest pusta<>w windzie znajduje się cokolwiek np. przez odejmowanie jednego obrazu od drugiego - chyba, że całość musi działać w dowolnym środowisku, to faktycznie ten pomysł też nie ma sensu 🙂

1) Jest tak jak opisałeś - przepisy nie pozwalają na ingerencję w budowę windy. Rozwiązanie musi być małe, zwarte i wandalo-odporne (i może być instalowane wyłącznie na jednej ze ścian windy).

2) Nie - nie wiem dlatego prosta detekcja obiektów odpada. Wykrywane byłyby plamy np. po ketchupie na podłodze, czy ścianach, błoto na podłodze itp'

Odnośnie wyników uczenia algorytmu SVM, które dzisiaj ćwiczyłem - chyba wiem co jest przyczyną częstych false-positive. Jak zaobserwowałem najwięcej false-positive jest dla długich pionowych linii na obrazie (np. ściany budynków, drzewa, pionowe krawędzie na ścianach). Z tego co doczytałem to wersja SVM w OpenCV jest liniowa tzn. oddziela przykłady należące do dwóch przeciwnych kategorii człowiek/nie człowiek hiperpłaszczyzną (odpowiednik płaszczyzny w przestrzeni trójwymiarowej) w wielowymiarowej przestrzeni parametrów (cech), które algorytm bierze pod uwagę. W przykładach uczących jest wiele podobnych przykładów pozytywnych i negatywnych np. budynek bez ludzi i ludzie przy budynku, które niewiele się różnią. Gdyby była tu wersja SVM z nieliniowym jądrem (takie można używać w MATLABie), gdzie oddziela się dwie kategorie danych zakrzywioną płaszczyzną prawdopodobnie działało by to lepiej (ale wymagałoby jeszcze więcej mocy obliczeniowej).

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Czytałem to jakieś czterdzieści lat temu i szczegółów nie pamiętam, ale chodziło o puszczenie pinga ultradźwiękowego i sprawdzanie, co się nam odbiło. Każdy przedmiot wprowadzony do pomieszczenia powinien wygenerować dość silne różnice między sygnałem z pustej windy a windy z czymś... czy to nie byłoby prostsze? Bo nie jestem pewien, czy algorytm będzie w stanie rozpoznać człowieka siedzącego pod ścianą w kapeluszu nasuniętym na oczy (taki stereotyp Meksykanina pod kaktusem)...

Link do komentarza
Share on other sites

25 minut temu, ethanak napisał:

Czytałem to jakieś czterdzieści lat temu i szczegółów nie pamiętam, ale chodziło o puszczenie pinga ultradźwiękowego i sprawdzanie, co się nam odbiło. Każdy przedmiot wprowadzony do pomieszczenia powinien wygenerować dość silne różnice między sygnałem z pustej windy a windy z czymś... czy to nie byłoby prostsze? Bo nie jestem pewien, czy algorytm będzie w stanie rozpoznać człowieka siedzącego pod ścianą w kapeluszu nasuniętym na oczy (taki stereotyp Meksykanina pod kaktusem)...

Albo takie alarmy samochodowe, które generują falę stojącą i wykrywają jej zaburzenie...

  • Lubię! 1
Link do komentarza
Share on other sites

15 godzin temu, ethanak napisał:

Czytałem to jakieś czterdzieści lat temu i szczegółów nie pamiętam, ale chodziło o puszczenie pinga ultradźwiękowego i sprawdzanie, co się nam odbiło. Każdy przedmiot wprowadzony do pomieszczenia powinien wygenerować dość silne różnice między sygnałem z pustej windy a windy z czymś... czy to nie byłoby prostsze? Bo nie jestem pewien, czy algorytm będzie w stanie rozpoznać człowieka siedzącego pod ścianą w kapeluszu nasuniętym na oczy (taki stereotyp Meksykanina pod kaktusem)...

Cześć,

testowałem coś podobnego (oraz także zmianę pojemności pomieszczenia) i wyniki nie były zachęcające. Jeśi chodzi o Meksykanina pod kaktusem tp powinien rozpoznać, bo algorytm nie jest szkolony aby rozpoznawać tylko twarz, ale i inne części ciała.

Pozdrawiam

Link do komentarza
Share on other sites

16 minut temu, FlyingDutch napisał:

algorytm nie jest szkolony aby rozpoznawać tylko twarz, ale i inne części ciała.

Ja bym na wszelki wypadek sprawdził jak wygląda siedzący człowiek z osłonięta głową, niewidocznymi dłońmi i podkurczonymi nogami widziany przez kamerę z góry. Tak, wiem że to rzadki przypadek, ale całkiem możliwy (zasłabnięcie w windzie).

  • Lubię! 1
Link do komentarza
Share on other sites

51 minut temu, ethanak napisał:

Ja bym na wszelki wypadek sprawdził jak wygląda siedzący człowiek z osłonięta głową, niewidocznymi dłońmi i podkurczonymi nogami widziany przez kamerę z góry. Tak, wiem że to rzadki przypadek, ale całkiem możliwy (zasłabnięcie w windzie).

Właśnie przed takim przypadkiem ta kamera ma zabezpieczać, więc przygotowałem sporo zdjęć uczących dla takiego przypadku, gdzie w kadrze widać część sylwetki ciała (są nawet zdjęcia bez głowy), a człowiek leży na podłodze w różnych pozach. Gdy potem testuje takie przypadki - na innych zdjęciach niż te użyte do treningu wykrywa je bezbłędnie. Moim problemem są false-positive, czyli przypadki, gdzie nie ma człowieka na zdjęciu a algorytmowi wydaje się, że on tam jest. Poza tym trzeba pamiętać, że w urządzeniu są dwa dobrze działające czujniki ruchu, więc jeśli osoba leżąca na podłodze będzie się ruszać (nawet nie jakoś intensywnie) to te czujniki ruchu ją wykryją.

@ethanak, jeśli możesz to prześlij mi zdjęcie takiego Meksykania w kapeluszu to sprawdzimy, czy algorytm go wykryje, czy nie 🙂

Pozdrawiam

Link do komentarza
Share on other sites

@FlyingDutch Skoro kamera jest w stałym położeniu, widok pustej windy chyba nie powinien się zmieniać - nie licząc oczywiście oświetlenia. Więc może zamiast wykrywać sylwetkę byłoby łatwiej i bezpieczniej wykrywać cokolwiek co nie jest tym podstawowym widokiem? Wydaje mi się, że rozpoczęcie sterylizacji gdy ktoś znajduje się w windzie może stanowić zagrożenie i będzie ono o wiele większe niż zaniechanie sterylizacji po zostawieniu np. torebki.

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.