cardstream
Open source Technologia Ximilar Wersja beta

Identyfikacja kart, na jaką zasługują Twoje streamy. Zbudowana dla breaków, openingów i sprzedaży na żywo.

cardstream ogląda Twój break, opening albo transmisję i identyfikuje każdą kartę kolekcjonerską w chwili, gdy pojawia się w kadrze: nazwa, set i pewność, na żywo. Analizuj swoje streamy sprzedażowe systemem śledzenia kart stworzonym dla streamerów, którzy chcą wiedzieć więcej.

Co identyfikuje

Od Pokémon po Magic: The Gathering

Wybierz kategorię dla danej transmisji, a cały silnik pójdzie za nią: detekcja, bramki i zapytanie o identyfikację od razu celują we właściwy endpoint. Każde dopasowanie wraca z nazwą, setem, kodem setu, numerem karty, serią i rokiem.

🃏

Kolekcjonerskie gry karciane

collectibles/v2/tcg_id
Ximilar Dostępne

Single z TCG, nowe i vintage, prosto ze streamu. Endpoint czyta ilustrację, ramkę i tekst, więc karta jest identyfikowana z tego samego obrazu, na który patrzą Twoi widzowie: bez wypatrywania symbolu setu i bez mrużenia oczu nad numerem karty.

  • Pokémon
  • Magic: The Gathering
  • Yu-Gi-Oh!
  • One Piece
  • Lorcana
  • Digimon
  • Dragon Ball Super
  • Flesh and Blood
  • Star Wars Unlimited
  • Star Wars Destiny
  • MetaZoo
  • Riftbound
  • Weiss Schwarz
  • Union Arena
  • Force of Will
  • Grand Archive
  • Vanguard
  • Marvel Champions
  • Sorcery
  • Final Fantasy
  • Gundam
  • Duel Masters
  • Naruto Mythos
  • Hololive
  • Garbage Pail Kids
🏅

Karty sportowe sport_id

Karty rookie, parallele, inserty i autografy ze wszystkich najważniejszych dyscyplin (baseball, koszykówka, futbol amerykański, piłka nożna, hokej i inne): dokładnie ta karta, ten set i ten rok.

Wkrótce
🧊

Ocenione karty w slabach slab_id

Czyta etykietę na etui ocenionej karty: karta zamknięta w slabie PSA, BGS lub CGC zostaje zidentyfikowana bez rozbijania etui.

Wkrótce
📚

Komiksy comics_id

Okładki identyfikowane tak samo jak karty: tytuł, numer i rok, z jednej nieruchomej klatki.

Wkrótce
Bez przywiązania do jednego dostawcy

Podłącz komercyjny system rozpoznawania albo własny

Wszystko, co rozstrzyga, czy w ogóle pytać, dzieje się przed samą identyfikacją: detekcja, bramka ruchu i bramka tożsamości działają lokalnie i nie zależą od dostawcy. Samo zapytanie to jeden wymienny krok: standardowo Ximilar, komercyjna usługa identyfikacji kart albo model wytrenowany samodzielnie i uruchomiony na własnym sprzęcie.

To jeden mały interfejs: wchodzi wycinek karty, wychodzi dopasowanie. Zaimplementuj IdentifyTarget, a każda bramka, każde ograniczenie częstotliwości i każdy próg przed nim działają dokładnie tak jak wcześniej: nadal jeden wycinek na każdą nową kartę, bez względu na to, kto odpowiada.

# własny system rozpoznawania, ten sam silnik
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# tak czy inaczej jeden wycinek na każdą nową kartę
$ cardstream-web --detector rfdetr
Dlaczego cardstream.ai?

Jedno zapytanie na kartę, nie na klatkę

Chodzi o to, by analiza streamu ograniczała się do zapytań, które naprawdę mówią coś nowego. Alternatywa open source dla zamkniętych usług SaaS do rozpoznawania kart: żadnej platformy pośrodku, żadnych licencji na stanowisko. Twój sprzęt, Twój klucz API i maszyna stanów, która pyta tylko wtedy, gdy karta w kadrze jest naprawdę nowa.

54 000 → ~100
zapytań do API na godzinę

Naiwne rozwiązanie działające klatka po klatce przy 15 fps wysyła 54 000 zapytań o identyfikację na godzinę. cardstream wysyła jedno na każdą pokazaną kartę, czyli około stu w ciągu tej samej godziny.

540×
mniej zapytań o identyfikację

Ta sama godzina, to samo wideo, te same karty: 54 000 zapytań kontra mniej więcej 100. Bramki ruchu i tożsamości działają lokalnie, na Twoim sprzęcie, a zapytanie wychodzi dopiero wtedy, gdy w kadrze znieruchomieje naprawdę nowa karta.

0 $
opłat za platformę

Bez abonamentu SaaS, bez opłat za stanowisko, bez uzależnienia od dostawcy. Postaw wszystko u siebie, razem z identyfikacją, albo podłącz API Ximilar.

Funkcje

Wszystko, czego potrzebuje stream z kartami

Współprowadzący, który nie przegapi żadnej karty: dla sprzedających na żywo na platformach w stylu Whatnot i Fanatics Live, do box breaków, streamów sklepów z kartami i katalogowania kolekcji. Wszędzie tam, gdzie przed kamerą lądują kartoniki.

⚡

Rozpoznana, gdy tylko wejdzie w kadr

Bez przycisku skanowania. Bez czekania. Po prostu pokaż kartę: od kartonika do nazwy karty mija mniej więcej pół sekundy, a nazwa, set i pewność pojawiają się na żywo na streamie.

🎯

Jedno zapytanie na kartę

Bramka ruchu i oparta na embeddingach bramka tożsamości działają lokalnie, na Twoim procesorze. Trzymasz kartę nieruchomo: zero powtórnych zapytań. Zmieniasz kartę: dokładnie jedno nowe.

📡

Dowolne źródło streamu

Kamera internetowa, pliki wideo, RTSP, RTMP i SRT: pobierane przez cardstream albo wysyłane prosto z OBS dzięki --listen. Do tego klatki JPEG przez WebSocket dla nietypowych setupów.

🔌

Dowolny backend identyfikacji

Standardowo Ximilar collectibles/v2. Ten sam silnik możesz też skierować na komercyjny system rozpoznawania kart albo na własny, samodzielnie wytrenowany i hostowany.

🧠

Własne modele mile widziane

Wagi lokalizatora są nasze: dostrojony model segmentacji RF-DETR na licencji Apache-2.0, pobierany przez instalator. Detektory zwracające prostokąty (RF-DETR, RT-DETRv2) też są obsługiwane, jeśli wolisz własny eksport.

🔓

Open source, na własnym sprzęcie

Jeden pakiet w języku Python na liberalnej licencji. Czytaj kod, forkuj go, uruchamiaj na własnym sprzęcie. Twój klucz, Twoje dane, Twoja infrastruktura.

Jak to działa

Dość sprytny, by wiedzieć, kiedy nie pytać API

Między Twoim streamem a API stoi maszyna stanów. Każda klatka przechodzi przez DecisionCore, jedną maszynę stanów działającą lokalnie, a trzy lokalne bramki decydują, kiedy ten jeden krok z API jest naprawdę uzasadniony.

1

Detekcja

lokalnie · bez zapytań

Znajduje czworokąt karty i przygotowuje czysty, wyprostowany wycinek. Lokalna bramka ruchu ogranicza jej częstotliwość na trzech poziomach: ruch, nieruchoma karta, pusty kadr.

2

Bramka ruchu

lokalnie · bez zapytań

Tania średnia różnica między klatkami. Dopiero gdy obraz jest spokojny przez N klatek, karta zasługuje na bliższe spojrzenie. Wciąż się rusza? Czekamy.

3

Bramka tożsamości

lokalnie · bez zapytań

Porównanie embeddingów odpowiada na jedno pytanie: czy to ta sama karta co przed chwilą? Ta sama karta → jeszcze raz wynik z pamięci podręcznej.

4

Identyfikacja

ximilar · 1 zapytanie

Dopiero naprawdę nowa, nieruchoma karta uruchamia zapytanie o identyfikację do API Ximilar: asynchronicznie, po krótkiej zwłoce, poza pętlą klatek. Wynik wraca na żywo.

Dla streamerów, breakerów i sklepów

Streamujesz w pojedynkę?

Jedna osoba, jedna kamera, jedna długa noc breaków. Żeby wiedzieć, jaka karta jest na ekranie, nie trzeba mieć zespołu inżynierów. Podłącz stream, który i tak już prowadzisz, i pozwól, by cardstream analizował go na żywo, bez względu na to, czy sprzedajesz na którejś z platform, czy prosto z własnego kanału.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • własna strona

Żadnego dostępu do konta, żadnych kluczy API platform sprzedażowych, żadnego bota na czacie i żadnych powiązań z którąkolwiek z tych platform. cardstream czyta Twoje wideo i nic więcej.

01

Streamujesz już z OBS

Dodaj jedno wyjście więcej obok tego, które zasila Twoją transmisję. Kupujący widzą dokładnie to samo co wcześniej, a kopia tego samego obrazu trafia do programu cardstream i każda karta, która ląduje na stole, zostaje po drodze zidentyfikowana. Poniższy tryb nasłuchu wymaga systemowego programu ffmpeg. Możesz też całkiem pominąć drugie wyjście i pozwolić, by cardstream czytał kamerę wirtualną OBS jak zwykłą kamerę internetową.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# tu skieruj drugie wyjście OBS
02

Albo kamera, którą masz już na stole

Kamera nad stołem, grabber wideo, telefon w roli kamery internetowej: cokolwiek, pod czym otwierasz boostery i pokazujesz karty. Analiza działa na komputerze obok kamery, więc domyślnie pokój opuszcza tylko jeden wycinek na kartę.

$ cardstream-web --source 0
# kamera internetowa · interfejs w przeglądarce na localhost
03

Albo cokolwiek, co ma adres URL

Enkodery, miksery wideo, restreamery, drugie studio na drugim końcu miasta. Pobieranie przez RTSP, RTMP i SRT, a do tego klatki JPEG przez WebSocket, gdy setup jest własnej roboty.

$ cardstream-web \
      --source rtsp://studio/stream1

Nakładka na żywo

Nazwa, set i pewność pojawiają się w chwili, gdy karta znieruchomieje: gotowe do odczytania na głos albo do wkomponowania z powrotem w scenę.

Każda karta zapisana

Bieżąca historia wszystkiego, co pokazujesz: miniatura każdej karty i czas, jaki spędziła na streamie. Zapisz ją na swoim koncie Ximilar i przejrzyj transmisję następnego ranka: co się sprzedało i ile było warte.

Na siły i kieszeń jednej osoby

Bez opłat za platformę, bez licencji na stanowisko. Trzygodzinna transmisja to garść zapytań o identyfikację, a nie jedno na każdą klatkę.

Cardstream Cloud

Twoja transmisja, zapisana i gotowa do przejrzenia

cardstream działa na Twoim komputerze i domyślnie niczego nie przechowuje. Dodaj jedną flagę, a każda pokazana karta trafi też do sesji na Twoim koncie Ximilar: z ceną, czasem na ekranie i wycinkiem, z którego została zidentyfikowana. Po transmisji otwórz aplikację Ximilar i sprawdź, ile to wszystko było warte.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# wypisuje id sesji i zapisuje w trakcie transmisji
Zapisana sesja w aplikacji Ximilar: pokazane produkty, płatne zapytania do API, wartość rynkowa, średni czas na ekranie, najcenniejsze produkty i najczęstsze sety.

Transmisja w liczbach

Pokazane produkty, płatne zapytania do API, wartość rynkowa i średni czas na ekranie dla każdej sesji, a obok najcenniejsze produkty i najczęstsze sety.

Każda karta ze zdjęciem

Każdy wiersz zachowuje kartę, set, numer, cenę i wycinek, z którego została zidentyfikowana. Przeszukuj listę po produkcie lub secie i filtruj sesje według statusu, platformy i daty.

Zrób z tego własną ewidencję

Oznacz, co się sprzedało, dodaj notatkę, popraw błędne dopasowanie albo jego cenę, usuń fałszywe. Nazwij sesję i dołącz własne metadane: numer licytacji, koszty, kupujących.

Wróć tam, gdzie transmisja się urwała

Restart w trakcie transmisji? Podaj id sesji zamiast NEW, a transmisja potoczy się dalej w tej samej sesji, nawet jeśli została już zamknięta. Flaga --ximilar-workspace zapisuje ją w przestrzeni roboczej zespołu.

Domyślnie wyłączone: bez --ximilar-stream Twój komputer opuszcza wyłącznie zapytanie o identyfikację. Zapisywanie wymaga usługi Cardstream na koncie Ximilar. Płatne jest tylko rozpoczęcie sesji, a --no-ximilar-stream-images ogranicza zapis do tekstu.

Szybki start

Od zera do identyfikacji na żywo w 3 krokach

1

Zainstaluj

Virtualenv, wheel z wydania (ze sprawdzoną sumą kontrolną), wagi modeli i oba polecenia w Twoim PATH. Użyj skryptu, zainstaluj ten sam wheel z PyPI przez pip (wagi pobiera się osobno) albo sklonuj repozytorium i zbuduj wszystko samodzielnie. Docker i Windows znajdziesz na stronie pobierania.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# inne sposoby instalacji → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # albo: uv tool install 'cardstream[client,onnx]'
# wheel nie zawiera wag: rozpakuj dwa archiwa z cardstream.ai/models
# i wskaż je flagami:
$ cardstream-web --segmentor-model segmentation_model/onnx/model.onnx \
    --embed-model similarity_model/onnx/model.onnx
$ git clone https://github.com/Ximilar-com/cardstream && cd cardstream
$ ./scripts/build-from-source.sh --models
$ source .venv/bin/activate
2

Podłącz system identyfikacji

Standardowo Ximilar collectibles/v2: klucz z ximilar.com to jedyne dane dostępowe, jakich potrzebuje cały system. Ten sam krok możesz też skierować na własny system rozpoznawania.

$ export XIMILAR_API_KEY=your-key
3

Skieruj kamerę na kartę

Otwórz interfejs w przeglądarce z obrazem z kamery internetowej albo podaj mu swoją transmisję: przez RTSP, który pobierze samodzielnie, albo przez RTMP wysyłany prosto z OBS. Cały wieczór otwierasz jeden set? Podaj go z góry, a endpoint przestanie zgadywać: angielskie karty Pokémon z setu CRI to trzy rzeczy mniej, w których można się pomylić. Ustawiaj --alphabet zawsze, gdy ustawiasz --game, bo podanie gry z góry wyłącza w endpoincie własne wykrywanie systemu pisma. Dodaj --price-stats, a każde dopasowanie przyniesie też ceny rynkowe w USD: medianę, przedział i ostatnią sprzedaż, na karcie i w historii. Dodaj --ximilar-stream NEW, żeby zapisać transmisję na swoim koncie Ximilar i przejrzeć ją później.

$ cardstream-web
# → http://127.0.0.1:8001 (pokaż kartę do kamery)

# Angielskie karty Pokémon, jeden set (CRI - Chaos Rising), z cenami rynkowymi w USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

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.