Wprowadzenie do szacowania ruchu z przepływem optycznym
Posted on
w tym tutorialu zanurkujemy w podstawy przepływu optycznego, przyjrzymy się niektórym jego zastosowaniom i zaimplementujemy jego dwa główne warianty (rzadki i gęsty). Krótko omówimy również nowsze podejścia wykorzystujące głębokie uczenie się i obiecujące przyszłe kierunki.
Ostatnie przełomy w badaniach wizji komputerowej pozwoliły maszynom postrzegać otaczający świat za pomocą takich technik, jak wykrywanie obiektów do wykrywania instancji obiektów należących do określonej klasy i segmentacja semantyczna do klasyfikacji pikseli.
jednak, do przetwarzania wejścia wideo w czasie rzeczywistym, większość implementacji tych technik adresuje tylko relacje obiektów w tej samej klatce \((x, y)\) z pominięciem informacji o czasie \((t)\). Innymi słowy, oceniają każdą klatkę niezależnie, tak jakby były to zupełnie niepowiązane obrazy, dla każdego przebiegu. Co jednak, jeśli potrzebujemy relacji między kolejnymi klatkami, na przykład chcemy śledzić ruch pojazdów w klatkach, aby oszacować jego aktualną prędkość i przewidzieć jego położenie w następnej klatce?
lub, alternatywnie, co zrobić, jeśli potrzebujemy informacji o ludzkich relacjach pozowania między kolejnymi klatkami, aby rozpoznać ludzkie działania, takie jak Łucznictwo, baseball i koszykówka?
w tym samouczku dowiemy się, czym jest przepływ optyczny, jak wdrożyć jego dwa główne warianty (rzadki i gęsty), a także uzyskać duży obraz nowszych podejść obejmujących głębokie uczenie się i obiecujące przyszłe kierunki.
Co To jest przepływ optyczny? Implementing Sparse Optical Flow Implementing Dense Optical Flow Deep learning and beyond
Zacznijmy od wysokiego poziomu zrozumienia przepływu optycznego. Przepływ optyczny to ruch obiektów między kolejnymi klatkami sekwencji, spowodowany względnym ruchem między obiektem a kamerą. Problem przepływu optycznego można wyrazić jako:
gdzie między kolejnymi klatkami możemy wyrazić intensywność obrazu \((I)\) jako funkcję spacji \((x, y)\) i czas \((t)\). Innymi słowy, jeśli weźmiemy pierwszy obrazek \(I (x, y, t)\) i przesuniemy jego piksele o \((dx, dy)\) nad \(t\) czasem, otrzymamy nowy obrazek \(I(x + dx, y + dy, t + dt)\).
Po pierwsze, Zakładamy, że intensywność pikseli obiektu jest stała między kolejnymi klatkami.
Po Drugie, bierzemy aproksymację szeregów Taylora RHS i usuwamy wspólne terminy.
Po Trzecie, dzielimy przez \(dt\), aby uzyskać równanie przepływu optycznego:
gdzie \(u = dx/DT\) i \(v = dy / dt\).
\(dI/DX, dI/dy\) i \(dI / DT\) to gradienty obrazu wzdłuż osi poziomej, osi pionowej i czasu. Stąd kończymy z problemem przepływu optycznego, czyli rozwiązaniem \(u (DX/dt)\) i \(v (dy/dt)\) w celu określenia ruchu w czasie. Możesz zauważyć, że nie możemy bezpośrednio rozwiązać równania przepływu optycznego dla \(u\) I \(v\), ponieważ istnieje tylko jedno równanie dla dwóch nieznanych zmiennych. Zaimplementujemy niektóre metody, takie jak metoda Lucas-Kanade, aby rozwiązać ten problem.
oszczędny vs gęsty przepływ optyczny
oszczędny przepływ optyczny daje wektorom przepływu pewne „interesujące cechy” (powiedzmy kilka pikseli obrazujących krawędzie lub rogi obiektu) w ramce, podczas gdy gęsty przepływ optyczny, który daje wektory przepływu całej ramki (wszystkie piksele) – do jednego wektora przepływu na piksel. Jak można się domyślić, gęsty przepływ optyczny ma wyższą dokładność kosztem powolnego / kosztownego obliczeniowo.
implementacja Sparse Optical Flow
Sparse optical flow wybiera niewielki zestaw funkcji pikseli (np. ciekawe funkcje, takie jak krawędzie i narożniki) do śledzenia jego wektorów prędkości (ruchu). Wyodrębnione funkcje są przekazywane w funkcji przepływu optycznego od klatki do klatki, aby zapewnić śledzenie tych samych punktów. Istnieją różne implementacje rzadkiego przepływu optycznego, w tym metoda Lucasa-Kanade, metoda Horna-Schuncka, metoda Buxtona–Buxtona i inne. Do implementacji będziemy używać metody Lucas-Kanade z OpenCV, otwartoźródłową biblioteką algorytmów wizji komputerowej.
Konfigurowanie środowiska
Jeśli nie masz jeszcze zainstalowanego OpenCV, otwórz Terminal i uruchom:
pip install opencv-python
teraz Sklonuj repozytorium samouczka, uruchamiając:
następnie otwórz repozytorium sparse-starter.py za pomocą edytora tekstu. Będziemy pisać cały kod w tym Pliku Pythona.
Konfigurowanie OpenCV do odczytu wideo i konfigurowanie parametrów
Shi-Tomasi Corner Detector – wybieranie pikseli do śledzenia
w celu realizacji rzadkiego przepływu optycznego śledzimy tylko ruch zestawu funkcji pikseli. Funkcje w obrazach są punktami zainteresowania, które prezentują bogate informacje o treści obrazu. Na przykład takimi cechami mogą być punkty obrazu, które są niezmienne dla zmian translacji, skali, obrotu i intensywności, takich jak narożniki.
Detektor narożny Shi-Tomasi jest bardzo podobny do popularnego detektora narożnego Harrisa, który może być zaimplementowany za pomocą następujących trzech procedur:
określanie okien (małych łat obrazu) z dużymi gradientami (zmiany intensywności obrazu) po przetłumaczeniu w kierunkach \(x\) i \(y\).
dla każdego okna Oblicz wynik \(R\).
w zależności od wartości \(R\), każde okno jest klasyfikowane jako płaskie, krawędź lub narożnik.
Jeśli chcesz dowiedzieć się więcej na temat matematycznego wyjaśnienia krok po kroku detektora narożnego Harrisa, przejrzyj te slajdy.
Shi i Tomasi zrobili później małą, ale skuteczną modyfikację detektora narożnego Harrisa w swoim papierze Good Features to Track.
zmiana polega na równaniu, w którym obliczany jest wynik \(R\). W detektorze narożnym Harrisa funkcja punktowania jest dana przez:
co zasadniczo oznacza, że jeśli \(R\) jest większa niż próg, jest klasyfikowana jako róg. Poniższe zestawienie porównuje funkcje punktowe Harrisa (po lewej) i Shi-Tomasiego (po prawej) w przestrzeni \(λ1-λ2\).
dla Shi-Tomasi, tylko wtedy, gdy \(λ1\) i \(λ2\) są powyżej minimalnego progu \(λmin\), okno jest klasyfikowane jako narożnik.
dokumentacja implementacji Shi-Tomasi przez OpenCV poprzez goodFeaturesToTrack() znajduje się tutaj.
śledzenie konkretnych obiektów
mogą istnieć scenariusze, w których chcesz śledzić tylko określony obiekt zainteresowania (powiedzmy śledzenie określonej osoby) lub jedną kategorię obiektów (jak wszystkie pojazdy 2-kołowe w ruchu drogowym). Możesz łatwo zmodyfikować kod, aby śledzić piksele pożądanych obiektów, zmieniając zmiennąprev.
Możesz również połączyć wykrywanie obiektów z tą metodą, aby oszacować przepływ pikseli w wykrytych obwiedniach. W ten sposób możesz śledzić wszystkie obiekty określonego typu/kategorii w filmie.
Lucas-Kanade: Sparse Optical Flow
Lucas i Kanade zaproponowali skuteczną technikę szacowania ruchu interesujących elementów poprzez porównanie dwóch kolejnych klatek w swojej pracy iteracyjnej Techniki Rejestracji obrazu z aplikacją do widzenia stereoskopowego. Metoda Lucasa-Kanade działa w oparciu o następujące założenia:
dwie kolejne klatki są oddzielone małym przyrostem czasowym (\(dt\)) tak, że obiekty nie są znacznie przesunięte (innymi słowy, metoda działa najlepiej z wolno poruszającymi się obiektami).
ramka przedstawia „naturalną” scenę z teksturowanymi obiektami eksponującymi odcienie szarości, które zmieniają się płynnie.
Po pierwsze, zgodnie z tymi założeniami, możemy wziąć małe okno 3×3 (sąsiedztwo) wokół cech wykrywanych przez Shi-Tomasiego i założyć, że wszystkie dziewięć punktów ma ten sam ruch.