Lab 09 - Filtr Kalmana
Lab. 09 - Filtr Kalmana
1. Cel zajęć
Celem zajęć jest poznanie podstaw zastosowania filtra Kalmana na przykładzie użycia biblioteki MediaPipe.
2. Przygotowanie środowiska
Do zajęć nie będzie konieczny Docker. Niezbędna będzie jednak kamera internetowa lub nagranie. Trzeba również zainstalować bibliotekę MediaPipe oraz OpenCV:
pip3 install mediapipe
pip3 install opencv-python
3. Filtr Kalmana
Jest to algorytm rekurencyjnego wyznaczania stanu obiektu na podstawie obserwacji i predykcji (wejścia i wyjścia układu). Do działania filtra konieczny jest znany model obiektu (np. dla toczącej się piłki są to wzory na położenie, prędkość i przyspieszenie w zależności od czasu).4. Mediapipe
Biblioteka od Google, która oferuje wiele rozwiązań z dziedziny Machine Learningu możliwych do uruchomienia na powszechnie dostępnym sprzęcie (np. na telefonach komórkowych).
Na zajęciach będziemy używać modułu Hand Landmarker. Przykładowe działanie przedstawiono poniżej.
Jak widać, czasami ręka przestaje być wykrywana. Dzieje się tak, ponieważ moduł hands działa jako One-Shot Detector, używa jednej klatki nagrania/jednego zdjęcia (co prawda ma możliwość trackingu, ale ważne jest, żeby co najmniej część dłoni była widoczna).
5. Definicja problemu
Należy uruchomić detektor dłoni z biblioteki MediaPipe oraz dodać do niego filtr Kalmana z biblioteki OpenCV tak, aby była możliwa predykcja położenia dłoni nawet, jeśli ta zniknie z pola widzenia kamery. Dodatkowo, predykcja punktów dłoni powinna być stabilniejsza.
Bez filtru Kalmana | Z fltrem Kalmana |
6. Filtr Kalmana w OpenCV
Aby przygotować filtr Kalmana z OpenCV sugerowane jest obudowanie go dodatkową klasą (np. poprzez dziedziczenie)
Konieczne będzie utworzenie filtru, który ma 4 parametry dynamiki (x, y, Vx, Vy) oraz 2 pomiary (x, y).
Przykładową implementację filtru można znaleźć tutaj.
Proszę pamiętać, że dla każdego landmarka (wykrywanego fragmentu dłoni) konieczne jest utworzenie osobnej instancji filtra.
Proszę pamiętać, że w momencie, kiedy nie mamy żadnej informacji (dłoń jest poza obrazem) z mediapipe, powinniśmy pominąć krok: self.kalman.correct(input_points)
lub równoznaczny.
7. MediaPipe w Pythonie
Przykładowe użycie MediaPipe w Pythonie można znaleźć tutaj, a wskazówki pracy tutaj.
Proszę nie zmieniać opcji running_mode na inną niż IMAGE.
Obraz z kamery na mp.Image
można zamienić następująco:
= mp.Image(image_format=mp.ImageFormat.SRGB, data=frame) img
Do współrzędnej x
pierwszego wykrytego landmarku możemy się dostać następująco:
0][0].x detection_result.hand_landmarks[
8. Zadanie do samodzielnej realizacji
- Zmodyfikuj przykład tak, aby każde wyjście z mediapipe było przetwarzane przez filtry Kalmana.
- Zmodyfikuj filtr tak, aby dt nie było stałe, tylko zależało od różnicy czasu między klatkami.
- Dodaj możliwość rysowania po wideo przy użyciu zaciśniętych kciuka i palca wskazującego i nagraj efekt działania. Możliwe jest uruchomienie na własnym przykładzie lub na nagraniu. (przykład poniżej)
Na eKursy proszę wgrać: - skrypt Pythona realizujący zadanie (rozszerzenie .txt) - nagranie z działania (max. 100MB)
Autor: Kamil Młodzikowski