cardstream
À propos

L’idée : interroger une fois par carte, pas une fois par image

La reconnaissance de cartes, ça marche déjà. Pointez un bon modèle sur une carte à collectionner : le nom, l’extension et le numéro reviennent en une demi-seconde environ. C’est sur de la vidéo que tout se complique. Pas techniquement : par le volume.

Une vidéo, c’est surtout de la répétition. Une carte tenue quatre secondes devant la caméra à quinze images par seconde, ce sont soixante images de la même carte ; interroger soixante fois un endpoint d’identification, c’est obtenir soixante fois la même réponse. C’est pourtant ce que fait tout pipeline de streaming naïf, et c’est pour cela que l’analyse de streams passe pour un luxe réservé aux plateformes bien financées.

cardstream existe pour supprimer cette répétition. C’est une petite machine à états placée entre votre vidéo et l’appel de reconnaissance, qui s’appuie presque uniquement sur des signaux qu’elle calcule elle-même : la scène s’est-elle stabilisée, est-ce la même carte qu’il y a un instant, y a-t-il seulement une carte dans le champ ? L’appel part quand une carte réellement nouvelle s’est immobilisée, et jamais autrement. Tout le reste tourne sur du matériel que vous possédez déjà.

Le calcul

Un appel par carte, pas par image

Une heure de show à quinze images par seconde, le haut de la plage sur laquelle le projet est vérifié, et une centaine de cartes distinctes passées devant l’objectif. Deux façons d’analyser exactement la même vidéo :

Image par image 54 000

appels d’identification : un par image, la plupart reposant une question qui a reçu sa réponse un instant plus tôt.

Avec cardstream ~100

appels d’identification : un par carte distincte, quelle que soit votre fréquence d’images et aussi longtemps que vous teniez chaque carte.

Environ 540 fois moins d’appels, et l’écart n’est pas un tour de passe-passe : c’est toute la conception. Tenez une carte immobile, le compteur ne bouge pas. Faites tourner la caméra plus vite, le compteur ne bouge pas. Le nombre d’appels suit les cartes que vous montrez, pas les heures que vous streamez.

Maintenance

Qui le fait vivre

Conçu par des gens dont la reconnaissance est le métier

cardstream vient de l’équipe à l’origine de la reconnaissance d’objets de collection de Ximilar. Les endpoints d’identification qu’il appelle sont ceux que nous faisons tourner en production : le client et le service sont maintenus par les mêmes personnes.

Le travail se fait au grand jour

Le paquet complet est sur GitHub : la machine à états, les deux modes de déploiement et l’interface navigateur. Rien de la logique de décision n’est caché derrière un service que vous ne pourriez pas inspecter.

Testé sans réseau

Toute la suite de tests tourne hors ligne, avec des doublures à la place des fichiers de modèles et des appels HTTP. Forkez le dépôt sur un portable sans clé API : vous saurez quand même si vous avez cassé quelque chose.

Principes

Ce que le code n’a pas le droit d’oublier

  1. Un appel par carte, pas par image

    Toute décision de conception part de là. Si un signal peut être calculé en local, il est calculé avant le seul appel qui quitte la machine.

  2. Un seul exemplaire de la logique de décision

    Le moment d’appeler se décide dans un module, et un seul. Pas éparpillé entre un pilote, un transport et une interface où trois personnes peuvent le modifier de trois façons : un fichier, lisible d’une traite.

  3. Des pilotes qui restent minces

    L’ordonnancement, la journalisation et les entrées-sorties relèvent du pilote ; ce qui compte comme une nouvelle carte relève du moteur. Changer la façon dont les images arrivent ne change jamais en douce le moment où un appel part.

  4. Rien ne bloque la boucle d’images

    Décodage, détection, HTTP et disque tournent tous hors de la boucle. Une identification lente fait sauter une image ; elle ne transforme jamais votre stream en un retard qui s’accumule.

  5. Aucune dépendance à un fournisseur, nous compris

    L’appel d’identification est une étape interchangeable derrière une petite interface. Chaque filtre, chaque limitation et chaque cache continue de fonctionner si vous le pointez ailleurs.

  6. Auto-hébergé par défaut

    Votre matériel, votre clé, votre vidéo. En mode client, un unique recadrage par carte distincte est la seule chose qui quitte la machine, à moins que vous ne choisissiez d’enregistrer le show sur votre propre compte Ximilar.

Notes de terrain

Ce que les cartes nous ont appris

Certaines de ces leçons sont assez contre-intuitives pour que nous les écrivions là où le prochain les trouvera : dans le dépôt, à côté du code qu’elles encadrent.

Une indication bien intentionnée peut coûter en précision

Indiquer à l’endpoint de quel jeu vient une carte désactive son propre classifieur de système d’écriture, qui se rabat alors sur l’alphabet latin : une carte japonaise est discrètement associée à sa version anglaise. C’est mesuré, pas supposé, et c’est pourquoi préciser un jeu sans système d’écriture est traité comme une erreur.

Un recadrage un peu large donne de meilleurs résultats

Une découpe au ras de la carte a l’air juste et fonctionne moins bien. Le recadrage qui part garde volontairement une marge, parce qu’un peu de contexte vaut mieux qu’un bord net.

Mieux vaut se rétablir que faire semblant

Quand un appel dépasse son délai, le pipeline se débloque tout seul et passe à la suite, au lieu d’attendre un résultat qui ne viendra peut-être jamais. La limite est écrite noir sur blanc dans le dépôt plutôt que maquillée.

Code source et contributions

Lisez-le, lancez-le, envoyez des correctifs

Le dépôt est public : un seul paquet Python installable, avec des extras indépendants et une interface navigateur. Les poids du localisateur et de l’embedding sont les nôtres, entraînés et publiés sous Apache-2.0 avec les releases. Les issues et les pull requests sont les bienvenues, en particulier les retours de vrais shows, qui révèlent ce qu’aucun banc de test ne montre.

La reconnaissance elle-même, c’est l’endpoint Ximilar, et cela le restera : c’est la partie adossée à la base de données de cartes. Tout ce qui l’entoure est à vous, libre à vous de le modifier.

Open source. Auto-hébergé. Votre stream, votre stack.

Pas de plateforme intermédiaire, pas de licence par poste : connectez l’API Ximilar ou votre propre système d’identification, et cardstream l’appelle une fois par carte distincte plutôt qu’une fois par image. Que vous fassiez des breaks sur Whatnot, animiez un show façon Fanatics Live ou streamiez votre propre live shopping, lancez cardstream dès ce soir sur le matériel que vous avez déjà.