cardstream
Über uns

Es geht darum, einmal pro Karte zu fragen, nicht einmal pro Frame

Kartenerkennung funktioniert längst. Richte ein gutes Modell auf eine Sammelkarte, und Name, Set und Nummer kommen in etwa einer halben Sekunde zurück. Erst bei Video scheitert es, nicht an der Technik, sondern an der schieren Menge.

Video ist vor allem Wiederholung. Eine Karte, die vier Sekunden lang bei fünfzehn Frames pro Sekunde hochgehalten wird, ergibt sechzig Bilder derselben Karte, und wer einen Identifikations-Endpunkt sechzigmal fragt, bekommt sechzigmal dieselbe Antwort. Genau das tut jede naive Streaming-Pipeline, und deshalb steht Stream-Analyse im Ruf, nur etwas für finanzstarke Plattformen zu sein.

cardstream gibt es, um diese Wiederholung zu streichen. Es ist ein kleiner Zustandsautomat zwischen deinem Video und dem Erkennungsaufruf, gebaut fast nur aus Signalen, die er selbst ermittelt: Ist die Szene zur Ruhe gekommen, ist das dieselbe Karte wie eben, ist überhaupt eine Karte im Bild? Der Aufruf geht hinaus, wenn eine wirklich neue Karte ruhig liegt, und sonst nicht. Alles andere läuft auf Hardware, die du schon besitzt.

Die Rechnung

Ein Aufruf pro Karte, nicht pro Frame

Eine Stunde Show bei fünfzehn Frames pro Sekunde (dem oberen Ende der Bildrate, mit der das Projekt geprüft ist) und rund hundert verschiedene Karten vor der Linse. Zwei Wege, genau dasselbe Video auszuwerten:

Frame für Frame 54.000

Identifikationsaufrufe: einer pro Frame, und die meisten stellen noch einmal eine Frage, die gerade erst beantwortet wurde.

Mit cardstream ~100

Identifikationsaufrufe: einer pro neuer Karte, egal wie hoch deine Bildrate ist und wie lange du jede Karte hochhältst.

Rund 540× weniger Aufrufe, und der Abstand ist kein Zahlentrick: Er ist das ganze Konzept. Halte eine Karte still, und der Zähler bewegt sich nicht. Lass die Kamera schneller laufen, und der Zähler bewegt sich nicht. Die Zahl der Aufrufe folgt den Karten, die du zeigst, nicht den Stunden, die du streamst.

Pflege

Wer es am Laufen hält

Von Leuten gebaut, die Erkennung produktiv betreiben

cardstream kommt von dem Team, das bei Ximilar die Erkennung von Sammlerstücken baut. Die Identifikations-Endpunkte, die es aufruft, sind dieselben, die bei uns in Produktion laufen. Client und Dienst werden also von denselben Leuten gepflegt.

Die Arbeit ist öffentlich

Das komplette Paket liegt auf GitHub: der Zustandsautomat, beide Betriebsarten und die Browser-Oberfläche. Nichts an der Entscheidungslogik versteckt sich hinter einem Dienst, in den du nicht hineinschauen kannst.

Ohne Netzwerk getestet

Die gesamte Testsuite läuft offline, mit Attrappen anstelle der Modelldateien und der HTTP-Aufrufe. Forke das Repository auf einem Laptop ohne API-Schlüssel, und du merkst trotzdem, ob du etwas kaputt gemacht hast.

Prinzipien

Was der Code nicht vergessen darf

  1. Ein Aufruf pro Karte, nicht pro Frame

    Jede Designentscheidung beginnt hier. Lässt sich ein Signal lokal berechnen, läuft es vor dem einen Aufruf, der den Rechner verlässt.

  2. Eine einzige Kopie der Entscheidungslogik

    Wann aufgerufen wird, steht in genau einem Modul. Nicht verteilt auf Treiber, Transport und Oberfläche, wo drei Leute es auf drei Arten ändern können, sondern in einer Datei, die sich in einem Zug durchlesen lässt.

  3. Treiber bleiben schlank

    Zeitplanung, Logging und I/O gehören dem Treiber; was als neue Karte zählt, gehört der Engine. Wer ändert, wie die Frames ankommen, ändert nie unbemerkt, wann ein Aufruf hinausgeht.

  4. Nichts blockiert die Frame-Schleife

    Dekodierung, Detektion, HTTP und Festplatte laufen alle außerhalb der Schleife. Eine langsame Identifikation kostet einen Frame; sie lässt deinen Stream nie immer weiter hinterherhinken.

  5. Kein Lock-in, auch nicht bei uns

    Der Identifikationsaufruf ist ein austauschbarer Schritt hinter einer kleinen Schnittstelle. Alle Filter, Drosselungen und Caches arbeiten weiter, wenn du ihn ganz woandershin richtest.

  6. Standardmäßig selbst gehostet

    Deine Hardware, dein Schlüssel, dein Video. Im clientseitigen Modus verlässt nur ein einziger Ausschnitt pro neuer Karte den Rechner, es sei denn, du entscheidest dich, die Show in deinem eigenen Ximilar-Konto zu speichern.

Aus der Praxis

Was uns die Karten beigebracht haben

Manches davon widerspricht der Intuition so sehr, dass wir es dort aufschreiben, wo die nächste Person es findet: im Repository, neben dem Code, für den es gilt.

Ein gut gemeinter Hinweis kann Genauigkeit kosten

Sagst du dem Endpunkt, aus welchem Spiel eine Karte stammt, schaltet das seinen eigenen Schriftsystem-Klassifikator ab, und der fällt auf latin zurück. Eine japanische Karte wird dann stillschweigend ihrer englischen Version zugeordnet. Gemessen, nicht geraten, und deshalb gilt es als Fehler, ein Spiel ohne Schriftsystem anzugeben.

Ein etwas lockerer Ausschnitt trifft besser

Ein knapper Schnitt um die Karte sieht richtig aus und schneidet schlechter ab. Der Ausschnitt, der hinausgeht, hat absichtlich einen Rand, denn ein wenig Kontext schlägt eine saubere Kante.

Sich fangen ist besser als so tun, als ob

Hängt ein Aufruf über sein Timeout hinaus, befreit sich die Pipeline selbst und macht weiter, statt auf ein Ergebnis zu warten, das vielleicht nie kommt. Die Einschränkung steht im Repository, statt überspielt zu werden.

Quellcode und Beiträge

Lesen, ausführen, Patches schicken

Das Repository ist öffentlich: ein installierbares Python-Paket mit unabhängigen Extras und einer Browser-Oberfläche. Die Gewichte für Locator und Embedding stammen von uns, trainiert und zusammen mit den Releases unter Apache-2.0 veröffentlicht. Issues und Pull Requests sind willkommen, vor allem Berichte aus echten Shows: Sie bringen Dinge ans Licht, die kein Testaufbau zeigt.

Die Erkennung selbst ist der Ximilar-Endpunkt und bleibt es; das ist der Teil mit der Kartendatenbank dahinter. Alles drumherum kannst du ändern.

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.