cardstream
Il progetto

Il punto è chiedere una volta per carta, non una volta per fotogramma

Il riconoscimento delle carte funziona già. Punta un buon modello su una carta collezionabile e nome, set e numero tornano indietro in circa mezzo secondo. È quando lo applichi a un video che tutto si complica: non per la tecnica, ma per il volume.

Un video è soprattutto ripetizione. Una carta tenuta davanti all’obiettivo per quattro secondi a quindici fotogrammi al secondo sono sessanta immagini della stessa carta, e interrogare sessanta volte un endpoint di identificazione dà sessanta volte la stessa risposta. Ogni pipeline di streaming ingenua fa esattamente questo, ed è per questo che l’analisi delle dirette ha la fama di qualcosa che può permettersi solo una piattaforma ben finanziata.

cardstream esiste per eliminare quella ripetizione. È una piccola macchina a stati tra il tuo video e la chiamata di riconoscimento, costruita quasi tutta su segnali che ricava da sola: la scena si è fermata? È la stessa carta di un attimo fa? C’è almeno una carta nell’inquadratura? La chiamata parte quando una carta davvero nuova si è fermata, e in nessun altro caso. Tutto il resto gira su hardware che hai già.

I conti

Una chiamata per carta, non per fotogramma

Un’ora di show a quindici fotogrammi al secondo, il massimo della frequenza su cui il progetto è verificato, e un centinaio di carte distinte passate davanti all’obiettivo. Due modi di analizzare esattamente lo stesso video:

Fotogramma per fotogramma 54.000

chiamate di identificazione: una per fotogramma, quasi tutte per rifare una domanda che ha avuto risposta un attimo prima.

Con cardstream ~100

chiamate di identificazione: una per carta distinta, qualunque sia la tua frequenza di fotogrammi e per quanto a lungo tu tenga ferma ogni carta.

Circa 540 volte meno chiamate, e la differenza non è un trucco contabile: è tutto il progetto. Tieni ferma una carta e il conteggio non si muove. Fai andare la videocamera più veloce e il conteggio non si muove. Il numero di chiamate segue le carte che mostri, non le ore che trasmetti.

Chi lo cura

Chi lo tiene in piedi

Fatto da chi il riconoscimento lo porta in produzione

cardstream nasce dal team che sta dietro al riconoscimento di oggetti da collezione di Ximilar. Gli endpoint di identificazione che chiama sono gli stessi che teniamo in produzione, quindi client e servizio sono mantenuti dalle stesse persone.

Il lavoro è alla luce del sole

L’intero pacchetto è su GitHub: la macchina a stati, entrambe le modalità di deployment e l’interfaccia nel browser. Niente della logica di decisione è nascosto dietro un servizio che non puoi ispezionare.

Testato senza rete

Tutta la suite gira offline, con dei fake al posto dei file dei modelli e delle chiamate HTTP. Fai un fork del repository su un portatile senza chiave API e saprai comunque se hai rotto qualcosa.

Principi

Ciò che il codice non può permettersi di dimenticare

  1. Una chiamata per carta, non per fotogramma

    Ogni decisione di progetto parte da qui. Se un segnale si può calcolare in locale, viene calcolato prima dell’unica chiamata che esce dal computer.

  2. Una sola copia della logica di decisione

    Quando chiamare lo decide un modulo, e uno solo. Non è sparso tra un driver, un trasporto e un’interfaccia, dove tre persone possono cambiarlo in tre modi diversi: un file, che si legge tutto d’un fiato.

  3. I driver restano sottili

    Scheduling, logging e I/O spettano al driver; che cosa conti come carta nuova spetta al motore. Cambiare il modo in cui arrivano i fotogrammi non cambia mai, di nascosto, il momento in cui parte una chiamata.

  4. Niente blocca il ciclo dei fotogrammi

    Decodifica, rilevamento, HTTP e disco girano tutti fuori dal ciclo. Un’identificazione lenta fa saltare un fotogramma; non trasforma mai la tua diretta in un ritardo che si accumula.

  5. Nessun lock-in, nemmeno con noi

    La chiamata di identificazione è un singolo passaggio sostituibile dietro una piccola interfaccia. Ogni filtro, limite e cache continua a funzionare anche se la punti da tutt’altra parte.

  6. Self-hosted per impostazione predefinita

    Il tuo hardware, la tua chiave, il tuo video. In modalità client l’unica cosa che esce dal computer è un singolo ritaglio per carta distinta, a meno che tu non scelga di salvare lo show nel tuo account Ximilar.

Appunti dal campo

Quello che ci hanno insegnato le carte

Alcune di queste cose sono abbastanza controintuitive da metterle per iscritto dove le troverà chi viene dopo: nel repository, accanto al codice che vincolano.

Un suggerimento utile può costarti accuratezza

Dire all’endpoint da quale gioco viene una carta spegne il suo classificatore del sistema di scrittura, che a quel punto ripiega sull’alfabeto latino: così una carta giapponese viene abbinata, senza avvisi, alla sua stampa inglese. È un dato misurato, non un’ipotesi, ed è per questo che impostare un gioco senza un sistema di scrittura è trattato come un errore.

Un ritaglio un po’ largo dà corrispondenze migliori

Un taglio stretto intorno alla carta sembra giusto e funziona peggio. Il ritaglio che viene inviato ha un margine voluto, perché un po’ di contesto vale più di un bordo pulito.

Riprendersi è meglio che far finta di niente

Quando una chiamata resta appesa oltre il timeout, la pipeline si sblocca da sola e va avanti, invece di aspettare un risultato che potrebbe non arrivare mai. Il limite è scritto nel repository, non nascosto sotto il tappeto.

Codice sorgente e contributi

Leggilo, fallo girare, manda le tue patch

Il repository è pubblico: un unico pacchetto Python installabile, con extra indipendenti e un’interfaccia nel browser. I pesi del localizzatore e dell’embedding sono nostri, addestrati e pubblicati con licenza Apache-2.0 insieme alle release. Issue e pull request sono benvenute, soprattutto le segnalazioni da show veri, che fanno emergere cose che nessun banco di prova mostra.

Il riconoscimento in sé è l’endpoint di Ximilar e lo sarà sempre: è la parte che ha alle spalle il database delle carte. Tutto quello che gli sta intorno è tuo, da cambiare come vuoi.

Open source. Self-hosted. La tua live, il tuo stack.

Nessuna piattaforma nel mezzo, nessuna licenza per postazione: collega l’API di Ximilar o il tuo sistema di identificazione, e cardstream lo chiama una volta per carta distinta invece che una volta per fotogramma. Che tu faccia break su Whatnot, conduca uno show in stile Fanatics Live o trasmetta con il tuo setup di live commerce, fai girare cardstream stasera stessa sull’hardware che hai già.