Co przetwarza oprogramowanie wizyjne oparte na zdarzeniach?
Kamera eventowa raportuje zmiany jasności, zamiast dostarczać konwencjonalną klatkę wideo w każdym odstępie czasu. Zdekodowane zdarzenie zazwyczaj identyfikuje piksel, polaryzację i znacznik czasu. Twoja aplikacja musi zachować znaczenie tych pól poprzez pozyskiwanie, filtrowanie, rejestrowanie i wnioskowanie. The porównanie oparte na zdarzeniach i klatkach wyjaśnia, kiedy ten model danych jest przydatny.
Rozróżnij trzy formaty w projekcie: kodowanie czujnika lub transportu, zdekodowana reprezentacja zdarzenia używana przez oprogramowanie oraz reprezentacja przekazywana do algorytmu. Plik zawierający nieprzetworzone pakiety czujników, szereg zdekodowanych zdarzeń i zakumulowany obraz służą różnym celom. Konwersja między nimi może zmienić wykorzystanie pamięci, koszt przetwarzania i informacje o taktowaniu dostępne w dalszej części procesu.
| Reprezentacja | Przydatne dla | Pytanie o integrację |
|---|---|---|
| Surowe pakiety lub nagranie dostawcy | Odtwarzanie zachowania akwizycji i dekodowania | Czy zastosowany dekoder może odczytać dokładnie tę wersję urządzenia i formatu? |
| Odszyfrowane wydarzenia | Filtrowanie, analiza czasu i algorytmy natywne dla zdarzeń | Jaka jest jednostka znacznika czasu, dziedzina zegara i konwencja współrzędnych? |
| Powierzchnie czasu lub tensory wokselowe | Algorytmy wymagające uporządkowanej reprezentacji czasowej | Które ustawienia historii, kategoryzacji i normalizacji należy odtworzyć? |
| Skumulowane obrazy zdarzeń | Wizualizacja lub kompatybilny etap przetwarzania oparty na obrazie | Jak duże opóźnienia i straty informacji wprowadza okno akumulacji? |
Jak ocenić kamerę eventową SDK
Zacznij od dokładnego czujnika, oprogramowania sprzętowego aparatu i platformy hosta. Demonstracja na komputerze stacjonarnym nie zapewnia obsługi wbudowanego obrazu Linux, procesora ARM ani licencji produkcyjnej. Zapytaj dostawcę o obsługiwane systemy operacyjne, architekturę procesora, warunki redystrybucji i wymagania dotyczące interfejsu kamery. Przed zatwierdzeniem płyty bazowej dla modułu obliczeniowego sprawdź aplikację na zamierzonej platformie.
- Nabycie: wykrywanie urządzeń, konfiguracja, dekodowanie i raportowanie błędów.
- Czas: pochodzenie znacznika czasu, obsługa najazdów, wyzwalacze zewnętrzne i wyrównanie wielu urządzeń.
- Powtarzalność: nagrań, eksportu konfiguracji i zidentyfikowanej wersji oprogramowania.
- Wdrożenie: operacja bezgłowa, obsługiwane pliki binarne, zachowanie podczas ponownego uruchamiania i warunki licencji.
- Obserwowalność: liczba zdarzeń, głębokość kolejki, utracone dane i wykorzystanie zasobów hosta.
Utwórz potok z wyraźnymi granicami czasu
Trzymaj akwizycję oddzielnie od kosztownej wizualizacji, zapisu na dysku i wnioskowania o modelu. W przeciwnym razie powolny konsument może opóźnić nowe dane przed uruchomieniem algorytmu. Zdefiniuj ograniczoną kolejkę i jawne zasady przeciążenia. Upuszczenie najstarszego okna, zmniejszenie obszaru zainteresowania i zatrzymanie się z błędem ma różne konsekwencje; wybierz zachowanie, które pasuje do zastosowania i zapisz, kiedy to nastąpi.
Użyj znaczników czasu czujników, aby opisać, kiedy miały miejsce obserwacje, oraz monotonicznego zegara hosta, aby zmierzyć czas trwania przetwarzania. Odejmowanie znaczników czasu od niepowiązanych zegarów nie powoduje prawidłowego opóźnienia od końca do końca. Jeśli kamera musi być połączona z kamerą IMU lub konwencjonalną, należy ustalić zależność zegara i proces kalibracji opisany w naszym przewodnik synchronizacji fuzji czujników.
Mały przykład nagrania-kontroli
Poniższy przykład języka Python zlicza zdekodowane zdarzenia w obsługiwanym nagraniu i raportuje zakres ich znaczników czasu. Wykorzystuje udokumentowane przesyłanie strumieniowe Metavision API i wymaga kompatybilnej instalacji i nagrywania SDK. Jest to przykład inspekcji, a nie test porównawczy kamery ALVEXIS lub detektor.
import argparse
from metavision_sdk_stream import Camera, CameraStreamSlicer
parser = argparse.ArgumentParser()
parser.add_argument("recording")
args = parser.parse_args()
source = Camera.from_file(args.recording)
count, first_us, last_us = 0, None, None
for batch in CameraStreamSlicer(source.move()):
events = batch.events
if events.size:
start = int(events["t"][0])
end = int(events["t"][-1])
first_us = start if first_us is None else min(first_us, start)
last_us = end if last_us is None else max(last_us, end)
count += int(events.size)
span_s = 0.0 if first_us is None else (last_us - first_us) / 1_000_000
print({"events": count, "event_timestamp_span_s": span_s})
Zakres znacznika czasu obejmuje zdarzenie od pierwszego do ostatniego zaobserwowanego zdarzenia; nie mierzy czasu trwania pliku, opóźnienia pozyskiwania ani przepustowości przetwarzania. Puste okresy i resetowanie zegara wymagają osobnej obsługi w produkcji. Zachowaj konfigurację urządzenia i metadane zapisu obok pliku, aby drugi inżynier mógł odtworzyć interpretację.
Sprawdź ciche sceny, ruchliwe sceny i odzyskiwanie po awarii
Przetestuj scenę nieruchomą, reprezentatywny ruch i scenę celowo wymagającą. Migotanie, wibracje kamery i teksturowany ruch mogą powodować bardzo różne wskaźniki zdarzeń. Zapisz zarówno typowe zachowanie, jak i najgorszy przypadek, który zaobserwowałeś. Powtórz tę czynność przy aktywnej pamięci masowej i komunikacji, ponieważ te obciążenia konkurują o pamięć i czas procesora.
| Testuj | Nagraj | Decyzja, którą wspiera |
|---|---|---|
| Odtwórz ponownie to samo nagranie | Konfiguracja, różnice wyjściowe i czas przetwarzania | Czy zmianę oprogramowania można ocenić w sposób powtarzalny? |
| Zwiększ aktywność sceny | Głębokość kolejki, utrata zdarzeń i wiek danych wyjściowych | Czy system pozostaje użyteczny pod obciążeniem szczytowym? |
| Zmień okno przetwarzania | Dokładność aplikacji i opóźnienie między czujnikiem a wyjściem | Który kompromis w zakresie czasu/szczegółów spełnia wymagania? |
| Odłącz i ponownie podłącz urządzenie | Czas przywracania, reset zegara i ciągłość nagrywania | Czy wdrożona usługa może zostać przywrócona w przewidywalny sposób? |
Gdy algorytm korzysta z sieci neuronowej, przed wyborem akceleratora sprawdź wynikowy tensor i obsługiwane operatory. Kamera zdarzeń nie wymaga automatycznie NPU, a NPU nie akceptuje automatycznie strumienia zdarzeń. Nasz Przewodnik po architekturze FPGA, NPU i MPU oddziela usługi pozyskiwania, wstępnego przetwarzania, wnioskowania i aplikacji.
Pytania przed wyborem stosu oprogramowania
Czy mogę używać normalnego modelu widzenia komputerowego?
Dopiero po zdefiniowaniu kompatybilnej reprezentacji wejściowej i sprawdzeniu jej zachowania. Gromadzenie zdarzeń w obrazach może pozwolić na ponowne wykorzystanie etapu przetwarzania obrazu, ale zmienia rozkład danych i dodaje okno czasowe. Oceń kompletny wniosek na podstawie reprezentatywnych danych.
Czy działająca wersja demonstracyjna laptopa potwierdza wbudowaną kompatybilność?
Nie. Potwierdź architekturę procesora, system operacyjny, interfejs czujnika, sterownik, licencję SDK i stałe wykorzystanie zasobów rzeczywistej platformy docelowej.
Co wysłać na rozmowę integracyjną?
Wyślij numer referencyjny kamery lub czujnika, przykładowe nagranie, zamierzony wynik, akceptowalne opóźnienie, platformę hosta, interfejs i środowisko wdrożenia. Dane te sprawiają, że dyskusja jest na tyle konkretna, że pozwala zidentyfikować pierwsze zagrożenia związane z integracją.
Referencje techniczne
- Prophesee: pierwsze kroki ze streamingiem w Pythonie API
- Prorok: odczytywanie zdarzeń z kamer i plików
- Gallego i in.: Wizja oparta na zdarzeniach — ankieta
Przykłady dostawców opisują ich własny obsługiwany ekosystem. Potwierdź kompatybilność i licencję dla wybranego urządzenia i wdrożenia.
