Lab 09 - Filtr Kalmana

Lab. 09 - Filtr Kalmana

Przykład wyszukiwania cech podczas działania ORB-SLAM3

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).
Schemat korzystania z Filtru Kalmana. źródło

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.

Hand Landmarker

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:

img = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)

Do współrzędnej x pierwszego wykrytego landmarku możemy się dostać następująco:

detection_result.hand_landmarks[0][0].x

8. Zadanie do samodzielnej realizacji

Na eKursy proszę wgrać: - skrypt Pythona realizujący zadanie (rozszerzenie .txt) - nagranie z działania (max. 100MB)

Drawing with MediaPipe

Autor: Kamil Młodzikowski