cardstream
Open source Propulsé par Ximilar Version bêta

La référence pour identifier vos cartes en live. Conçue pour les breaks, les ouvertures et les shows en direct.

cardstream suit votre break, votre ouverture de boosters ou votre show et identifie chaque carte à collectionner dès qu’elle entre dans le champ : nom, extension et confiance, en direct. Analysez vos lives de vente grâce au suivi de cartes : un outil pour les streamers qui veulent en savoir plus sur ce qui passe à l’écran.

Ce qu’il identifie

De Pokémon à Magic: The Gathering

Changez de catégorie d’un show à l’autre et tout le moteur suit : détection, filtres et appel d’identification visent le bon endpoint. Chaque correspondance revient avec le nom, l’extension, le code d’extension, le numéro de carte, la série et l’année.

🃏

Jeux de cartes à collectionner (TCG)

collectibles/v2/tcg_id
Ximilar Disponible

Des cartes à l’unité, modernes ou vintage, lues directement sur le stream. L’endpoint lit l’illustration, le cadre et le texte : la carte est identifiée à partir de l’image que vos spectateurs ont sous les yeux, sans chercher le symbole d’extension ni plisser les yeux sur le numéro de carte.

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

Cartes de sport sport_id

Rookies, parallèles, inserts et autographes dans tous les grands sports (baseball, basket, football américain, football, hockey et d’autres) : la carte exacte, la collection exacte, l’année exacte.

Bientôt disponible
🧊

Cartes gradées (slabs) slab_id

Lit l’étiquette du boîtier de gradation : la carte scellée dans un slab PSA, BGS ou CGC est identifiée sans avoir à l’ouvrir.

Bientôt disponible
📚

Comics comics_id

Les couvertures sont identifiées comme les cartes : titre, numéro et année, à partir d’une seule image stable.

Bientôt disponible
Aucun fournisseur imposé

Branchez un système de reconnaissance propriétaire, ou le vôtre

Tout ce qui décide s’il faut appeler se joue avant l’identification elle-même : la détection, le filtre de mouvement et le filtre de même carte tournent en local et ne dépendent d’aucun fournisseur. L’appel, lui, n’est qu’une étape interchangeable : Ximilar par défaut, un service propriétaire d’identification de cartes, ou un modèle que vous avez entraîné et que vous hébergez sur votre propre matériel.

L’interface est minuscule : un recadrage de carte entre, une correspondance sort. Implémentez IdentifyTarget et tous les filtres, limitations et seuils placés en amont continuent de fonctionner comme avant : toujours un seul recadrage par carte distincte, quel que soit le service qui répond.

# votre propre système de reconnaissance, le même moteur
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# un recadrage par carte distincte, dans les deux cas
$ cardstream-web --detector rfdetr
Pourquoi cardstream.ai ?

Un appel par carte, pas par image

L’idée : ramener l’analyse d’un stream aux seuls appels qui vous apprennent quelque chose de nouveau. L’alternative open source aux SaaS fermés de reconnaissance de cartes : pas de plateforme intermédiaire, pas de licence par poste. Votre matériel, votre clé API et une machine à états qui n’appelle l’extérieur que lorsque la carte à l’image est réellement nouvelle.

54 000 → ~100
appels API par heure

Un pipeline naïf, image par image, lance 54 000 identifications par heure à 15 fps. cardstream en lance une par carte distincte que vous montrez : une centaine sur la même heure.

540×
moins d’appels d’identification

Même heure, même vidéo, mêmes cartes : 54 000 appels contre une centaine. Les filtres de mouvement et d’identité tournent en local, sur votre propre matériel, et un appel ne part que lorsqu’une carte réellement nouvelle s’immobilise dans le champ.

0 $
de frais de plateforme

Pas d’abonnement SaaS, pas de tarif par poste, pas de dépendance à un fournisseur. Auto-hébergez toute la chaîne, identification comprise, ou connectez-vous à l’API Ximilar.

Fonctionnalités

Tout ce qu’il faut à un show de cartes en live

Un coanimateur qui ne rate aucune carte : pour les vendeurs en live shopping sur des plateformes comme Whatnot ou Fanatics Live, les box breaks, les lives de boutiques de cartes et l’inventaire de collections. Partout où une caméra croise du carton.

⚡

Reconnue dès qu’elle entre dans le champ

Pas de bouton de scan. Pas d’attente. Montrez simplement la carte : nom, extension et confiance s’affichent en une demi-seconde environ, en plein live.

🎯

Un appel par carte

Un filtre de mouvement et un filtre d’identité par embedding tournent en local, sur votre propre CPU. Tenez une carte immobile : aucun appel répété. Changez de carte : exactement un nouvel appel.

📡

N’importe quelle source vidéo

Webcam, fichiers vidéo, RTSP, RTMP et SRT, récupérés en pull ou poussés directement depuis OBS avec --listen. Des flux JPEG par WebSocket pour les installations sur mesure.

🔌

N’importe quel backend d’identification

Ximilar collectibles/v2 par défaut. Ou pointez le même moteur vers un système propriétaire de reconnaissance de cartes, ou vers celui que vous avez entraîné et que vous hébergez vous-même.

🧠

Apportez vos propres modèles

Les poids du localisateur sont les nôtres : un modèle de segmentation RF-DETR affiné, sous licence Apache-2.0, que l’installeur télécharge. Les détecteurs par boîtes englobantes (RF-DETR, RT-DETRv2) sont aussi pris en charge si vous préférez apporter votre propre export.

🔓

Open source, auto-hébergé

Un seul paquet Python sous licence permissive. Lisez-le, forkez-le, faites-le tourner sur votre propre matériel. Votre clé, vos données, votre infrastructure.

Comment ça marche

Assez malin pour savoir quand ne pas appeler l’API

Une machine à états se tient entre votre stream et l’API. Chaque image passe par DecisionCore, une seule machine à états qui tourne en local, et trois filtres locaux décident du moment où l’unique étape API se justifie vraiment.

1

Détecter

local · aucun appel API

Repère le quadrilatère de la carte et en tire un recadrage net, redressé. Le filtre de mouvement local règle sa cadence sur trois paliers : en mouvement, immobile avec carte, vide.

2

Filtre de mouvement

local · aucun appel API

Une simple différence moyenne entre images, peu coûteuse. La carte ne mérite un examen que lorsque la scène est stable depuis N images. Ça bouge encore ? On attend.

3

Filtre d’identité

local · aucun appel API

Une comparaison d’embeddings répond à une seule question : est-ce la même carte qu’avant ? Si oui, le résultat en cache est renvoyé.

4

Identifier

ximilar · 1 appel

Seule une carte réellement nouvelle et immobile déclenche une identification Ximilar : asynchrone, avec debounce, hors de la boucle d’images. Le résultat revient en direct.

Pour les streamers, les breakers et les boutiques

Vous streamez en solo ?

Une personne, une caméra, une longue nuit de breaks : pas besoin d’une équipe d’ingénieurs pour savoir quelle carte est à l’écran. Connectez le stream que vous diffusez déjà et laissez cardstream l’analyser en direct, que vous vendiez sur une marketplace ou directement sur votre propre chaîne.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • votre propre site

Aucun accès à votre compte, aucune clé API de marketplace, aucun bot dans votre chat, et aucun lien avec ces plateformes. cardstream lit votre vidéo, rien d’autre.

01

Vous streamez déjà depuis OBS

Ajoutez une sortie à côté de celle qui alimente votre show. Vos acheteurs voient exactement la même chose qu’avant : une copie du même flux arrive dans cardstream, et chaque carte posée sur la table est identifiée au passage. Le mode écoute ci-dessous a besoin du binaire ffmpeg du système. Vous pouvez aussi vous passer de la seconde sortie et laisser cardstream lire la caméra virtuelle d’OBS comme une webcam ordinaire.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# pointez ici la seconde cible d’OBS
02

Ou la caméra déjà posée sur la table

Caméra en plongée, carte d’acquisition, téléphone en guise de webcam : tout ce sous quoi vous ouvrez et dévoilez vos cartes. L’analyse tourne sur la machine à côté de la caméra : par défaut, rien d’autre qu’un recadrage par carte ne quitte la pièce.

$ cardstream-web --source 0
# webcam · interface navigateur sur localhost
03

Ou tout ce qui a une URL

Encodeurs, mélangeurs, restreamers, un second studio à l’autre bout de la ville. Flux RTSP, RTMP et SRT en pull, et flux JPEG par WebSocket quand votre installation est faite maison.

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

Overlay en direct

Nom, extension et confiance s’affichent dès que la carte s’immobilise : prêts à être lus à voix haute ou réintégrés dans votre scène.

Chaque carte, consignée

L’historique en continu de tout ce que vous avez montré : une vignette de chaque carte et son temps de passage à l’écran. Enregistrez-le sur votre compte Ximilar et revoyez le show le lendemain matin : ce qui s’est vendu, ce que ça valait.

À la portée d’une personne seule

Pas de frais de plateforme, pas de licence par poste. Un show de trois heures, c’est une poignée d’appels d’identification, pas un par image.

Cardstream Cloud

Votre show, enregistré et prêt à être revu

cardstream tourne sur votre machine et ne conserve rien par défaut. Ajoutez une option et chaque carte montrée est aussi enregistrée dans une session de votre compte Ximilar, avec son prix, son temps à l’écran et le recadrage qui a servi à l’identifier. Ouvrez l’application Ximilar après le show et voyez ce qu’il valait.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# affiche l’id de session, enregistre au fil du show
Une session enregistrée dans l’application Ximilar : produits montrés, appels API payants, valeur de marché, temps moyen à l’écran, produits les plus chers et extensions les plus fréquentes.

Le show en chiffres

Produits montrés, appels API payants, valeur de marché et temps moyen à l’écran pour chaque session, avec les produits les plus chers et les extensions les plus fréquentes à côté.

Chaque carte, avec son image

Chaque ligne garde la carte, l’extension, le numéro, le prix et le recadrage qui a servi à l’identifier. Cherchez dans la liste par produit ou par extension, et filtrez vos sessions par statut, plateforme et date.

Faites-en votre registre

Marquez ce qui s’est vendu, ajoutez une note, corrigez une mauvaise correspondance ou son prix, supprimez un faux positif. Nommez la session et joignez vos propres métadonnées : numéro de lot, coûts, acheteurs.

Reprenez là où vous en étiez

Redémarrage en plein show ? Passez l’id de session à la place de NEW et le show continue dans la même session, même si elle avait été fermée. --ximilar-workspace l’enregistre dans un espace de travail d’équipe.

Désactivé par défaut : sans --ximilar-stream, l’appel d’identification est la seule chose qui quitte votre machine. L’enregistrement nécessite le service Cardstream sur votre compte Ximilar ; seul le démarrage d’une session est facturé, et --no-ximilar-stream-images s’en tient au texte.

Démarrage rapide

De zéro à l’identification en direct en 3 étapes

1

Installez-le

Un virtualenv, le wheel de la release (somme de contrôle vérifiée), les poids des modèles et les deux commandes dans votre PATH. Prenez le script, installez le même wheel depuis PyPI avec pip (les poids se téléchargent à part), ou clonez le dépôt et construisez-le vous-même. Docker et Windows sont sur la page de téléchargement.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# autres méthodes d’installation → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # ou : uv tool install 'cardstream[client,onnx]'
# le wheel ne contient pas les poids : décompressez les deux archives de cardstream.ai/models
# et pointez les options dessus :
$ 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

Connectez un système d’identification

Ximilar collectibles/v2 par défaut : une clé obtenue sur ximilar.com est le seul identifiant dont tout le système a besoin. Ou pointez cette même étape vers votre propre système de reconnaissance.

$ export XIMILAR_API_KEY=your-key
3

Pointez une caméra sur une carte

Ouvrez l’interface navigateur sur votre webcam, ou donnez-lui votre show : un flux RTSP en pull, ou laissez OBS lui pousser du RTMP directement. Vous ouvrez une seule extension toute la soirée ? Préréglez-la et l’endpoint cesse de deviner : du Pokémon en anglais de l’extension CRI, ce sont trois sources d’erreur en moins. Renseignez --alphabet chaque fois que vous renseignez --game : prérégler le jeu désactive la détection du système d’écriture par l’endpoint. Ajoutez --price-stats et chaque correspondance apporte aussi les prix du marché en USD (médiane, fourchette et dernière vente), sur la carte comme dans l’historique. Ajoutez --ximilar-stream NEW pour enregistrer le show sur votre compte Ximilar et le revoir ensuite.

$ cardstream-web
# → http://127.0.0.1:8001 — montrez une carte

# Cartes Pokémon en anglais, une seule extension (CRI - Chaos Rising), avec les prix du marché en USD :
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

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à.