Skocz do zawartości

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


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 to post
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 to post
Share on other sites

@FlyingDutch A czy myślałeś o TensorFlow Lite? Korzystałem z tego poradnika - tu słowa podziękowania za inspirację dla Kolegi @lukasz-dev 😉

Wiem, że nie jest to dokładnie to, czego szukasz i nie jestem w stanie powiedzieć, jaka jest skuteczność dla obiektów typu "person", ale muszę przyznać, że byłem pozytywnie zaskoczony 😉 Wprawdzie dostępny przykład to detekcja wraz z pozycją kilkudziesięciu różnych klas obiektów, a nie prosta klasyfikacja zero-jeden, ale i tak jest to wydajność rzędu 4-5 FPS dla RPi 4B 2GB (PS po kilkunastu minutach działania takiego example OpenCV/TFlite temperatura procesora (tylko radiator) wynosi u mnie 56 stopni C). Podaję jeszcze link: https://www.tensorflow.org/lite/examples - pierwsza zakładka to właśnie "klasyfikacja", jest też link do gotowego przykładu dla RPi 😉

PS Rozumiem, że inna niż RPi platforma sprzętowa, np. Jetson Nano, nie wchodzi w grę (pytam z ciekawości)? 🙂

Edytowano przez wn2001
literówka :)
  • Lubię! 2
Link to post
Share on other sites

Cześć,

dziękuję kolegom za odpowiedzi. Docelowo będę robił tą detekcję korzystając z sieci CNN i Keras'a (oraz TensorFlow Lite jako runtime). Przedtem jednak chciałem  sprawdzić jak to wygląda przy użyciu biblioteki OpenCV i według mnie szału nie ma (przynajmniej jeśli chodzi o wstępnie wytrenowane klasyfikatory). Co do platformy to w grę nie wchodzi nic innego niż Raspbbery PI Compute Module 4 (jeden z modeli). Istnienia akceleratorów (TPU) jestem świadom jednak ich koszt jest za duży dla tego rozwiązania.

Pozdrawiam

  • Lubię! 2
Link to post
Share on other sites
(edytowany)

Cześć,

dzisiaj udało mi się "dotrenować" domyślny klasyfikator HOG'a i jest dużo lepiej jeśli chodzi o detekcję. Niestety plik xml z opisem klasyfikatora mocno urósł i na moim laptopie MSI z dwunasto-rdzeniowym procesorem Intela mam wysycenie CPU równe 100 procent (co pewnie zabiłoby RPI 😉)

Trenować algorytm próbowałem zgodnie z tym tutorialem:

https://answers.opencv.org/question/10374/how-to-training-hog-and-use-my-hogdescriptor/?answer=80994

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 2
Link to post
Share on other sites

@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 to post
Share on other sites
(edytowany)
16 godzin temu, wn2001 napisał:

@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ść?

Cześć,

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.

Update: dzisiaj wytrenowałem SVM + HOGDescriptor na kilku tysiacach przykładów (3000 pozytywów i 3000 negatywów). Przygotowanie próbek zajmuje dużo czasu bo wszystkie przykłady pozytywne i negatywne muszą mieć dokładnie równe wymiary, bo inaczej program uczący się wykłada. W przypadku datasetów dostepnych w sieci wymiary, a nawet proporcje są często różna i trzeba to obrabiać co zajmuje sporo czasu. Co zaobserwowałem SVM+HOG Descriptor uczony na większej ilości przykładów ma tendencje do większej ilości false-positive. Praktycznie robi detekcję przykładów pozytywnych prawie ze stu procentową dokładnością, niestety dla przykładów negatywnych jest za dużo błędnych detekcji. Próbowałem z kilkoma różnymi parametrami uczenia jednak z nimi wszystkimi tendencja jest taka, że im wiecej przykłaów uczących (pozytywnych i negatywnych) tym więcej false-positive podczas detekcji.

Nie wiem może moje dane uczące są za bardzo podobne do siebie, ale raczej dzisiaj się już poddaje z OpenCV. Od jutra zabieram się za CNN implementowaną w Kerasie.

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 2
Link to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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