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.
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:
Identifikationsaufrufe: einer pro Frame, und die meisten stellen noch einmal eine Frage, die gerade erst beantwortet wurde.
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.
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.
Was der Code nicht vergessen darf
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
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.
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.