cardstream
O projekcie

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.

Rachunek

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:

Klatka po klatce 54 000

zapytań o identyfikację: jedno na klatkę, w większości z pytaniem, na które odpowiedź padła przed chwilą.

Z cardstream ~100

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.

Opieka nad projektem

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.

Zasady

O czym kodowi nie wolno zapomnieć

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Notatki z praktyki

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.

Kod źródłowy i wkład

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.