Chodzi o to, by pytać raz na kartę, a nie raz na klatkę
Rozpoznawanie kart już działa. Wystarczy skierować dobry model na kartę kolekcjonerską, a nazwa, set i numer wracają po mniej więcej pół sekundy. Kłopot zaczyna się przy wideo, i to nie techniczny: zawodzi sama skala.
Wideo to głównie powtórzenia. Karta trzymana przez cztery sekundy przy piętnastu klatkach na sekundę to sześćdziesiąt zdjęć jednej karty, a sześćdziesiąt pytań do endpointu identyfikacji daje sześćdziesiąt razy tę samą odpowiedź. Każde naiwne rozwiązanie do analizy streamów robi dokładnie to i dlatego o takiej analizie mówi się, że stać na nią tylko platformę z dużym finansowaniem.
cardstream powstał po to, żeby te powtórzenia usunąć. To niewielka maszyna stanów między Twoim wideo a zapytaniem o rozpoznanie, zbudowana niemal w całości z sygnałów, które wylicza samodzielnie: czy obraz się uspokoił, czy to ta sama karta co przed chwilą, czy w kadrze w ogóle jest karta. Zapytanie wychodzi wtedy, gdy znieruchomieje naprawdę nowa karta, i tylko wtedy. Cała reszta działa na sprzęcie, który już masz.
Jedno zapytanie na kartę, nie na klatkę
Godzina transmisji przy piętnastu klatkach na sekundę (to górna granica szybkości, dla której projekt jest sprawdzony) i mniej więcej sto różnych kart pokazanych do obiektywu. Dwa sposoby analizy dokładnie tego samego wideo:
zapytań o identyfikację: jedno na klatkę, w większości z pytaniem, na które odpowiedź padła przed chwilą.
zapytań o identyfikację: jedno na każdą nową kartę, bez względu na liczbę klatek na sekundę i na to, jak długo trzymasz kartę w górze.
Około 540× mniej zapytań, i ta różnica nie jest sztuczką z liczbami: na niej opiera się cały projekt. Trzymasz kartę nieruchomo, licznik stoi. Kamera pracuje szybciej, licznik stoi. Liczba zapytań podąża za pokazanymi kartami, a nie za godzinami streamu.
Kto dba o to, żeby działał
Zbudowany przez ludzi, którzy wdrażają rozpoznawanie na co dzień
cardstream to dzieło zespołu, który w firmie Ximilar odpowiada za rozpoznawanie przedmiotów kolekcjonerskich. Endpointy identyfikacji, do których wysyła zapytania, to te same, które działają u nas produkcyjnie, więc klientem i usługą opiekują się ci sami ludzie.
Pracujemy jawnie
Cały pakiet jest w serwisie GitHub: maszyna stanów, oba warianty wdrożenia i interfejs w przeglądarce. Żaden element logiki decyzyjnej nie chowa się za usługą, do której nie da się zajrzeć.
Testowany bez sieci
Cały zestaw testów działa offline, a pliki modeli i zapytania HTTP zastępują atrapy. Sforkuj repozytorium na laptopie bez klucza API, a i tak sprawdzisz, czy coś się zepsuło.
O czym kodowi nie wolno zapomnieć
-
Jedno zapytanie na kartę, nie na klatkę
Od tego zaczyna się każda decyzja projektowa. Jeśli sygnał da się wyliczyć lokalnie, działa przed tym jednym zapytaniem, które opuszcza komputer.
-
Jedna kopia logiki decyzyjnej
To, kiedy pytać, mieszka w dokładnie jednym module. Nie jest rozsiane po sterowniku, transporcie i interfejsie, gdzie trzy osoby mogłyby to zmienić na trzy sposoby: to jeden plik, do przeczytania za jednym posiedzeniem.
-
Sterowniki to tylko cienka warstwa
Szeregowanie, logowanie i operacje wejścia-wyjścia należą do sterownika. To, co liczy się jako nowa karta, należy do silnika. Zmiana sposobu dostarczania klatek nigdy po cichu nie zmienia tego, kiedy wychodzi zapytanie.
-
Nic nie blokuje pętli klatek
Dekodowanie, detekcja, HTTP i dysk działają poza pętlą. Wolna identyfikacja kończy się pominiętą klatką, a nigdy streamem z narastającym opóźnieniem.
-
Bez uzależnienia od dostawcy, także od nas
Zapytanie o identyfikację to jeden wymienny krok za małym interfejsem. Każda bramka, każde ograniczenie częstotliwości i każda pamięć podręczna działają dalej, nawet gdy skierujesz je w zupełnie inne miejsce.
-
Domyślnie na własnym sprzęcie
Twój sprzęt, Twój klucz, Twoje wideo. W trybie klienckim komputer opuszcza wyłącznie jeden wycinek na każdą nową kartę, chyba że zdecydujesz się zapisywać transmisję na własnym koncie Ximilar.
Czego nauczyły nas karty
Część tych rzeczy jest na tyle nieintuicyjna, że zapisujemy je tam, gdzie znajdzie je następna osoba: w repozytorium, obok kodu, którego dotyczą.
Pomocna wskazówka może kosztować dokładność
Podanie endpointowi gry, z której pochodzi karta, wyłącza jego własny klasyfikator systemu pisma i endpoint przyjmuje wtedy wartość latin, więc japońska karta po cichu dopasowuje się do swojej angielskiej wersji. To zmierzone, a nie zgadnięte, i dlatego ustawienie gry bez systemu pisma jest traktowane jako błąd.
Nieco luźniejszy wycinek dopasowuje się lepiej
Ciasne cięcie wokół karty wygląda dobrze, a wypada gorzej. Wysyłany wycinek ma celowo zostawiony margines, bo odrobina kontekstu wygrywa z czystą krawędzią.
Lepiej się podnieść, niż udawać
Gdy zapytanie wisi dłużej niż limit czasu, przetwarzanie samo się odblokowuje i idzie dalej, zamiast czekać na wynik, który może nigdy nie nadejść. To ograniczenie jest opisane w repozytorium, a nie zamiecione pod dywan.
Czytaj, uruchamiaj, przysyłaj poprawki
Repozytorium jest publiczne: jeden instalowalny pakiet w języku Python z niezależnymi dodatkami (extras) i interfejsem w przeglądarce. Wagi lokalizatora i modelu embeddingów są nasze: wytrenowane przez nas i publikowane na licencji Apache-2.0 razem z wydaniami. Zgłoszenia i pull requesty są mile widziane, zwłaszcza relacje z prawdziwych transmisji, bo wychodzą w nich rzeczy, których nie pokaże żadne stanowisko testowe.
Samo rozpoznawanie to endpoint Ximilar i tak już zostanie: to ta część, za którą stoi baza kart. Wszystko dookoła możesz zmieniać do woli.
Open source. Na własnym sprzęcie. Twój stream, Twoje zasady.
Żadnej platformy pośrodku, żadnych licencji na stanowisko: podłącz API Ximilar albo własny system identyfikacji, a cardstream zapyta raz na każdą nową kartę zamiast raz na klatkę. Robisz breaki na Whatnot, prowadzisz transmisję w stylu Fanatics Live albo streamujesz z własnego setupu do live commerce? Uruchom cardstream jeszcze dziś wieczorem, na sprzęcie, który już masz.