cardstream
Open Source Powered by Ximilar Beta-Version

Die beste Kartenerkennung für Livestreams. Gemacht für Breaks, Openings und Live-Shows.

cardstream schaut bei deinem Break, deinem Opening oder deiner Show zu und erkennt jede Sammelkarte, sobald sie ins Bild kommt: Name, Set und Konfidenz, live. Werte deine Live-Shopping-Streams mit Karten-Tracking aus. Für Streamer, die mehr wissen wollen.

Was es erkennt

Von Pokémon bis Magic: The Gathering

Wechsle die Kategorie pro Show, und die ganze Engine zieht mit: Detektion, Filter und Identifikationsaufruf zeigen alle auf den richtigen Endpunkt. Jeder Treffer kommt mit Name, Set, Set-Code, Kartennummer, Serie und Jahr zurück.

🃏

Sammelkartenspiele

collectibles/v2/tcg_id
Ximilar Verfügbar

Einzelkarten aus Sammelkartenspielen (TCG), modern wie Vintage, direkt aus dem Stream. Der Endpunkt liest Artwork, Rahmen und Text und erkennt die Karte auf demselben Bild, das deine Zuschauer sehen. Kein Suchen nach dem Set-Symbol, kein Entziffern der Kartennummer.

  • 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
🏅

Sportkarten sport_id

Rookies, Parallels, Inserts und Autogrammkarten aus allen großen Sportarten, von Baseball, Basketball und American Football bis Fußball und Eishockey: genau die Karte, genau das Set, genau das Jahr.

Demnächst
🧊

Gegradete Karten (Slabs) slab_id

Liest das Label auf dem Case: Die Karte in einem Slab von PSA, BGS oder CGC wird erkannt, ohne dass du ihn aufbrechen musst.

Demnächst
📚

Comics comics_id

Cover werden genauso erkannt wie Karten: Titel, Ausgabe und Jahr, aus einem einzigen ruhigen Frame.

Demnächst
Nicht an einen Anbieter gebunden

Schließ ein proprietäres Erkennungssystem an, oder dein eigenes

Alles, was darüber entscheidet, ob überhaupt aufgerufen wird, passiert vor der eigentlichen Identifikation: Detektion, Bewegungsfilter und Identitätsfilter laufen lokal und hängen von keinem Anbieter ab. Der Aufruf selbst ist ein einzelner, austauschbarer Schritt: Ximilar ab Werk, ein proprietärer Dienst zur Kartenerkennung oder ein Modell, das du selbst trainiert hast und auf eigener Hardware betreibst.

Es ist eine einzige kleine Schnittstelle: Ein Kartenausschnitt geht hinein, ein Treffer kommt heraus. Implementiere IdentifyTarget, und alle Filter, Drosselungen und Schwellenwerte davor arbeiten genau wie bisher. Es bleibt bei einem Ausschnitt pro neuer Karte, egal wer antwortet.

# dein eigenes Erkennungssystem, dieselbe Engine
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# so oder so: ein Ausschnitt pro neuer Karte
$ cardstream-web --detector rfdetr
Warum cardstream.ai?

Ein Aufruf pro Karte, nicht pro Frame

Es geht darum, die Stream-Analyse auf die Aufrufe zu beschränken, die dir wirklich etwas Neues sagen. Die Open-Source-Alternative zu geschlossenen SaaS-Diensten für Kartenerkennung: keine Plattform dazwischen, keine Lizenz pro Nutzer. Deine Hardware, dein API-Schlüssel und ein Zustandsautomat, der nur dann einen Aufruf absetzt, wenn die Karte im Bild wirklich neu ist.

54.000 → ~100
API-Aufrufe pro Stunde

Eine naive Pipeline, die bei 15 fps jeden Frame abfragt, löst 54.000 Identifikationen pro Stunde aus. cardstream löst eine pro neuer Karte aus, die du zeigst: rund hundert in derselben Stunde.

540×
weniger Identifikationsaufrufe

Dieselbe Stunde, dasselbe Video, dieselben Karten: 54.000 Aufrufe gegenüber rund 100. Bewegungs- und Identitätsfilter laufen lokal auf deiner eigenen Hardware. Ein Aufruf geht nur hinaus, wenn eine wirklich neue Karte ruhig im Bild liegt.

0 $
Plattformgebühr

Kein SaaS-Abo, kein Preis pro Nutzer, kein Lock-in. Hoste den ganzen Stack samt Identifikation selbst oder verbinde dich mit der Ximilar-API.

Funktionen

Alles, was eine Karten-Show im Stream braucht

Ein Co-Host, dem keine Karte entgeht: für Live-Commerce-Verkäufer auf Plattformen wie Whatnot und Fanatics Live, für Box-Breaks, Streams aus dem Kartenladen und das Katalogisieren von Sammlungen. Überall, wo eine Kamera auf Pappe trifft.

⚡

Erkannt, sobald sie im Bild ist

Kein Scan-Knopf. Kein Warten. Zeig einfach die Karte: Von der Pappe zum Kartennamen dauert es etwa eine halbe Sekunde, mit Name, Set und Konfidenz, live im Stream.

🎯

Ein Aufruf pro Karte

Ein Bewegungsfilter und ein Identitätsfilter auf Embedding-Basis laufen lokal auf deiner eigenen CPU. Halte eine Karte still: kein einziger wiederholter Aufruf. Wechsle die Karte: genau ein neuer Aufruf.

📡

Jede Stream-Quelle

Webcam, Videodateien, RTSP, RTMP und SRT: per Pull abgeholt oder mit --listen direkt aus OBS gesendet. Dazu WebSocket-JPEG-Feeds für Eigenbau-Setups.

🔌

Jedes Identifikations-Backend

Ximilar collectibles/v2 ab Werk. Oder du richtest dieselbe Engine auf ein proprietäres Erkennungssystem oder auf eines, das du selbst trainiert hast und betreibst.

🧠

Bring deine eigenen Modelle mit

Die Gewichte des Locators stammen von uns: ein feinabgestimmtes RF-DETR-Segmentierungsmodell unter Apache-2.0, das der Installer herunterlädt. Box-Detektoren (RF-DETR, RT-DETRv2) werden ebenfalls unterstützt, falls du lieber deinen eigenen Export mitbringst.

🔓

Open Source, selbst gehostet

Ein einziges Python-Paket unter einer freizügigen Lizenz. Lies es, forke es, betreib es auf deiner eigenen Hardware. Dein Schlüssel, deine Daten, deine Infrastruktur.

So funktioniert’s

Schlau genug zu wissen, wann die API nicht aufgerufen werden muss

Zwischen deinem Stream und der API steht ein Zustandsautomat. Jeder Frame läuft durch DecisionCore, einen einzigen, lokal laufenden Zustandsautomaten, und drei lokale Filter entscheiden, wann der eine API-Schritt wirklich nötig ist.

1

Detektion

lokal · kein Aufruf

Findet das Viereck der Karte und entzerrt es zu einem sauberen Ausschnitt. Der lokale Bewegungsfilter drosselt die Detektion in drei Stufen: Bewegung, ruhige Karte, leeres Bild.

2

Bewegungsfilter

lokal · kein Aufruf

Eine mittlere Frame-Differenz, die fast nichts kostet. Erst wenn die Szene N Frames lang ruhig ist, lohnt ein genauerer Blick auf die Karte. Noch in Bewegung? Warten.

3

Identitätsfilter

lokal · kein Aufruf

Ein Embedding-Vergleich beantwortet eine einzige Frage: Ist das dieselbe Karte wie eben? Dieselbe Karte → das zwischengespeicherte Ergebnis wird noch einmal ausgegeben.

4

Identifikation

ximilar · 1 Aufruf

Nur eine wirklich neue, ruhig liegende Karte löst eine Identifikation bei Ximilar aus: asynchron, entprellt, außerhalb der Frame-Schleife. Das Ergebnis kommt live zurück.

Für Streamer, Breaker und Shops

Du streamst allein?

Ein Mensch, eine Kamera, eine lange Nacht voller Breaks: Du solltest kein Entwicklerteam brauchen, um zu wissen, welche Karte gerade im Bild ist. Schließ den Stream an, den du ohnehin sendest, und lass cardstream ihn live auswerten, egal ob du auf einem Marktplatz verkaufst oder direkt über deinen eigenen Kanal.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • deine eigene Website

Kein Zugriff auf dein Konto, keine API-Schlüssel vom Marktplatz, kein Bot in deinem Chat, und keinerlei Verbindung zu einer dieser Plattformen. cardstream liest dein Video, sonst nichts.

01

Du streamst schon mit OBS

Füge neben der Ausgabe, die deine Show speist, eine weitere hinzu. Deine Käufer sehen genau das, was sie vorher gesehen haben. Eine Kopie desselben Signals landet bei cardstream, und jede Karte, die auf den Tisch kommt, wird im Vorbeigehen erkannt. Der Listener unten braucht ein systemweit installiertes ffmpeg. Oder du sparst dir die zweite Ausgabe ganz und lässt cardstream die virtuelle Kamera von OBS wie eine gewöhnliche Webcam lesen.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# richte das zweite Ziel von OBS hierhin
02

Oder die Kamera, die schon auf dem Tisch steht

Overhead-Kamera, Capture-Card, Handy als Webcam: das, worunter du ohnehin Booster öffnest und Karten zeigst. Die Analyse läuft auf dem Rechner neben der Kamera, also verlässt standardmäßig nichts außer einem Ausschnitt pro Karte den Raum.

$ cardstream-web --source 0
# Webcam · Browser-Oberfläche auf localhost
03

Oder alles, was eine URL hat

Encoder, Bildmischer, Restreamer, ein zweites Studio am anderen Ende der Stadt. Pulls per RTSP, RTMP und SRT, dazu WebSocket-JPEG-Feeds, wenn dein Setup Marke Eigenbau ist.

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

Live-Overlay

Name, Set und Konfidenz erscheinen, sobald eine Karte ruhig liegt: zum Vorlesen oder zum Einblenden in deine Szene.

Jede Karte, protokolliert

Ein fortlaufender Verlauf von allem, was du gezeigt hast: ein Vorschaubild jeder Karte und wie lange sie im Stream war. Speichere ihn in deinem Ximilar-Konto und geh die Show am nächsten Morgen durch: was verkauft wurde, was es wert war.

Gemacht für Solo-Streamer

Keine Plattformgebühr, keine Lizenz pro Nutzer. Eine dreistündige Show bedeutet eine Handvoll Identifikationsaufrufe, nicht einen pro Frame.

Cardstream Cloud

Deine Show, gespeichert und bereit zur Auswertung

cardstream läuft auf deinem Rechner und speichert standardmäßig nichts. Mit einem einzigen Flag landet jede Karte, die du zeigst, zusätzlich in einer Session in deinem Ximilar-Konto: mit ihrem Preis, ihrer Zeit im Bild und dem Ausschnitt, an dem sie erkannt wurde. Öffne nach der Show die Ximilar-App und sieh nach, was sie wert war.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# gibt die Session-ID aus und speichert, während die Show läuft
Eine gespeicherte Session in der Ximilar-App: gezeigte Produkte, bezahlte API-Aufrufe, Marktwert, durchschnittliche Zeit im Bild, die wertvollsten Produkte und die häufigsten Sets.

Die Show in Zahlen

Gezeigte Produkte, bezahlte API-Aufrufe, Marktwert und durchschnittliche Zeit im Bild für jede Session, daneben die wertvollsten Produkte und die häufigsten Sets.

Jede Karte, mit Bild

Jede Zeile enthält Karte, Set, Nummer, Preis und den Ausschnitt, an dem sie erkannt wurde. Durchsuche die Liste nach Produkt oder Set und filtere deine Sessions nach Status, Plattform und Datum.

Mach daraus dein Protokoll

Markiere, was verkauft wurde, füge eine Notiz hinzu, korrigiere einen falschen Treffer oder seinen Preis, lösche einen Fehltreffer. Gib der Session einen Namen und hänge eigene Metadaten an: eine Lot-Nummer, Kosten, Käufer.

Mach weiter, wo du aufgehört hast

Mitten in der Show neu gestartet? Gib statt NEW die Session-ID an, und die Show läuft in derselben Session weiter, selbst wenn sie schon geschlossen war. --ximilar-workspace speichert sie in einem Team-Workspace.

Standardmäßig aus: Ohne --ximilar-stream verlässt nur der Identifikationsaufruf deinen Rechner. Zum Speichern braucht dein Ximilar-Konto den Dienst Cardstream. Berechnet wird nur der Start einer Session, und mit --no-ximilar-stream-images bleibt es bei Text.

Schnellstart

Von null zur Live-Identifikation in 3 Schritten

1

Installieren

Ein virtualenv, das Release-Wheel (per Prüfsumme verifiziert), die Modellgewichte und beide Befehle in deinem PATH. Nimm das Skript, installiere dasselbe Wheel mit pip von PyPI (die Gewichte sind ein separater Download) oder klone das Repository und baue es selbst. Docker und Windows findest du auf der Download-Seite.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# weitere Installationswege → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # oder: uv tool install 'cardstream[client,onnx]'
# das Wheel enthält keine Gewichte: entpacke die beiden Tarballs von cardstream.ai/models
# und gib sie über die Flags an:
$ 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

Ein Identifikationssystem verbinden

Ximilar collectibles/v2 ab Werk: Ein Schlüssel von ximilar.com ist alles an Zugangsdaten, was das ganze System braucht. Oder du richtest denselben Schritt auf dein eigenes Erkennungssystem.

$ export XIMILAR_API_KEY=your-key
3

Eine Karte in die Kamera halten

Öffne die Browser-Oberfläche mit deiner Webcam oder gib ihr deine Show: per RTSP-Pull, oder lass OBS direkt per RTMP hineinsenden. Den ganzen Abend ein einziges Set im Break? Gib es vor, und der Endpunkt muss nicht mehr raten: Englische Pokémon-Karten aus CRI sind drei Dinge weniger, die schiefgehen können. Setz --alphabet immer dann, wenn du --game setzt, denn die Vorgabe des Spiels schaltet die Schrifterkennung des Endpunkts ab. Mit --price-stats bringt jeder Treffer zusätzlich Marktpreise in USD mit: Median, Preisspanne und letzter Verkauf, an der Karte und im Verlauf. Mit --ximilar-stream NEW speicherst du die Show in deinem Ximilar-Konto und wertest sie später aus.

$ cardstream-web
# → http://127.0.0.1:8001, halte eine Karte hoch

# Englische Pokémon-Karten, ein Set (CRI - Chaos Rising), mit Marktpreisen in USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Open Source. Selbst gehostet. Dein Stream, dein Stack.

Keine Plattform dazwischen, keine Lizenz pro Nutzer: Verbinde die Ximilar-API oder dein eigenes Identifikationssystem, und cardstream ruft es einmal pro neuer Karte auf statt einmal pro Frame. Ob du auf Whatnot Breaks machst, eine Show im Stil von Fanatics Live fährst oder dein eigenes Live-Commerce-Setup streamst: Starte cardstream heute Abend auf der Hardware, die du schon hast.