cardstream
Öppen källkod Drivs av Ximilar Betaversion

Den bästa kortidentifieringen för livestreamar. Byggd för breaks, paketöppningar och livesändningar.

cardstream följer ditt break, din paketöppning eller din sändning och identifierar varje samlarkort i samma stund som det kommer i bild: namn, set och konfidens, live. Analysera dina liveshoppingstreamar med ett system för kortspårning. För streamare som vill veta mer.

Det här identifieras

Från Pokémon till Magic: The Gathering

Byt kategori inför varje sändning så följer hela motorn med: detekteringen, spärrarna och identifieringsanropet pekar alla mot rätt slutpunkt. Varje träff kommer tillbaka med namn, set, setkod, kortnummer, serie och år.

🃏

Samlarkortspel

collectibles/v2/tcg_id
Ximilar Finns nu

Löskort från samlarkortspel, både moderna och vintage, direkt från streamen. Slutpunkten läser av motivet, ramen och texten, så kortet identifieras utifrån samma bild som dina tittare ser. Du slipper leta efter setsymbolen och kisa på kortnumret.

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

Sportkort sport_id

Rookiekort, parallellkort, inserts och autografkort från alla stora sporter, bland annat baseboll, basket, amerikansk fotboll, fotboll och hockey: exakt rätt kort, rätt set och rätt år.

Kommer snart
🧊

Graderade kort slab_id

Läser etiketten på höljet till ett graderat kort. Kortet i en slab från PSA, BGS eller CGC identifieras utan att höljet behöver brytas upp.

Kommer snart
📚

Serietidningar comics_id

Omslag identifieras på samma sätt som kort: titel, nummer och år, från en enda stilla bildruta.

Kommer snart
Inte låst till en leverantör

Koppla in en proprietär igenkänningstjänst, eller din egen

Allt som avgör om ett anrop ska göras sker före själva identifieringen: detekteringen, rörelsespärren och identitetsspärren körs lokalt och är oberoende av leverantör. Själva anropet är ett enda utbytbart steg: Ximilar som standard, en proprietär tjänst för kortidentifiering eller en modell som du har tränat själv och kör på din egen hårdvara.

Gränssnittet är litet: ett utsnitt av kortet går in, en träff kommer ut. Implementera IdentifyTarget så fortsätter varje spärr, strypning och tröskel framför det att fungera precis som förut. Det blir fortfarande ett utsnitt per unikt kort, vem som än svarar.

# din egen igenkänningstjänst, samma motor
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# ett utsnitt per unikt kort, i båda fallen
$ cardstream-web --detector rfdetr
Varför cardstream.ai?

Ett anrop per kort, inte per bildruta

Poängen är att begränsa streamanalysen till de anrop som faktiskt säger dig något nytt. Alternativet med öppen källkod till slutna SaaS-tjänster för kortigenkänning: ingen plattform i mitten och ingen licens per användare, utan din hårdvara, din API-nyckel och en tillståndsmaskin som bara gör ett anrop när kortet i bild verkligen är nytt.

54 000 → ~100
API-anrop per timme

En naiv pipeline som går bildruta för bildruta i 15 fps gör 54 000 identifieringar i timmen. cardstream gör en per unikt kort du visar: runt hundra under samma timme.

540×
färre identifieringsanrop

Samma timme, samma video, samma kort: 54 000 anrop mot ungefär 100. Rörelse- och identitetsspärrarna körs lokalt på din egen hårdvara, och ett anrop går bara iväg när ett verkligt nytt kort ligger still i bild.

0 kr
i plattformsavgift

Ingen SaaS-prenumeration, inget pris per användare, ingen inlåsning. Drifta hela stacken själv, identifieringen inräknad, eller anslut till Ximilars API.

Funktioner

Allt en streamad kortsändning behöver

En bisittare som aldrig missar ett kort: för liveshoppingsäljare på plattformar som Whatnot och Fanatics Live, för box breaks, kortbutikers streamar och katalogisering av samlingar. Överallt där ett kort hamnar framför en kamera.

⚡

Igenkänt i samma stund som det kommer i bild

Ingen skanningsknapp. Ingen väntan. Visa bara kortet: namn, set och konfidens går från papp till kortnamn på ungefär en halv sekund, live i streamen.

🎯

Ett anrop per kort

En rörelsespärr och en identitetsspärr som bygger på embeddingar körs lokalt på din egen CPU. Håll ett kort stilla: inga upprepade anrop. Byt kort: exakt ett nytt anrop.

📡

Vilken streamkälla som helst

Webbkamera, videofiler, RTSP, RTMP och SRT, som cardstream hämtar själv eller som OBS skickar rakt in med --listen. JPEG-flöden över WebSocket för hemmabyggda riggar.

🔌

Valfri backend för identifiering

Ximilar collectibles/v2 som standard. Eller rikta samma motor mot en proprietär igenkänningstjänst för kort, eller mot en som du har tränat och driftar själv.

🧠

Ta med dina egna modeller

Lokaliserarens vikter är våra egna: en finjusterad RF-DETR-modell för segmentering, Apache-2.0, som installationsskriptet hämtar. Detektorer som ger avgränsningsrutor (RF-DETR, RT-DETRv2) stöds också, om du hellre tar med en egen export.

🔓

Öppen källkod, egen drift

Ett enda Python-paket med tillåtande licens. Läs det, forka det, kör det på din egen hårdvara. Din nyckel, dina data, din infrastruktur.

Så fungerar det

Smart nog att veta när API:et inte ska anropas

Mellan din stream och API:et står en tillståndsmaskin. Varje bildruta passerar DecisionCore, en enda tillståndsmaskin som körs lokalt, och tre lokala spärrar avgör när det enda API-steget faktiskt är motiverat.

1

Detektera

lokalt · inget anrop

Hittar kortets fyrhörning och rätar upp den till ett rent utsnitt. Den lokala rörelsespärren stryper detekteringen i tre nivåer: rörelse, stilla kort, tom bild.

2

Rörelsespärr

lokalt · inget anrop

En billig genomsnittlig skillnad mellan bildrutor. Först när scenen har varit stilla i N bildrutor är kortet värt en närmare titt. Rör det sig fortfarande? Vänta.

3

Identitetsspärr

lokalt · inget anrop

En embeddingjämförelse besvarar en enda fråga: är det här samma kort som nyss? Samma kort → det cachade resultatet skickas ut igen.

4

Identifiera

ximilar · 1 anrop

Bara ett verkligt nytt kort som ligger still utlöser en identifiering hos Ximilar: asynkront, avstudsat och utanför bildloopen. Resultatet skickas tillbaka live.

För streamare, breakare och butiker

Streamar du på egen hand?

En person, en kamera och en lång kväll med breaks: du ska inte behöva ett utvecklarteam för att veta vilket kort som är i bild. Anslut den stream du redan kör och låt cardstream analysera den live, oavsett om du säljer på en marknadsplats eller direkt från din egen kanal.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • din egen sajt

Ingen åtkomst till ditt konto, inga API-nycklar från marknadsplatser, ingen bot i din chatt och ingen koppling till någon av de här plattformarna. cardstream läser din video, inget annat.

01

Du streamar redan från OBS

Lägg till en utgång till, bredvid den som matar din sändning. Dina köpare ser exakt samma sak som förut: en kopia av samma flöde landar i cardstream, och varje kort som hamnar på bordet identifieras på vägen förbi. Lyssnaren nedan behöver systemets ffmpeg-binär. Du kan också hoppa över den andra utgången helt och låta cardstream läsa den virtuella kameran i OBS som en vanlig webbkamera.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# peka den andra utgången i OBS hit
02

Eller kameran som redan står vid bordet

En kamera ovanför bordet, ett inspelningskort, mobilen som webbkamera: vad du än har riktat mot bordet när du öppnar paket och visar upp kort. Analysen körs på datorn bredvid kameran, och som standard lämnar inget annat än ett utsnitt per kort rummet.

$ cardstream-web --source 0
# webbkamera · webbgränssnitt på localhost
03

Eller vad som helst med en URL

Kodare, bildmixrar, restreamingtjänster, en studio till på andra sidan stan. cardstream hämtar RTSP, RTMP och SRT, och tar emot JPEG-flöden över WebSocket när riggen är ett hemmabygge.

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

Overlay i realtid

Namn, set och konfidens visas i samma stund som ett kort ligger still, klara att läsa upp eller lägga in i din scen.

Varje kort, loggat

En löpande historik över allt du har visat: en miniatyr av varje kort och hur länge det var med i streamen. Spara den på ditt Ximilar-konto och gå igenom sändningen morgonen efter: vad som såldes och vad det var värt.

Rimligt för en ensam streamare

Ingen plattformsavgift, ingen licens per användare. En sändning på tre timmar blir en handfull identifieringsanrop, inte ett per bildruta.

Cardstream Cloud

Din sändning, sparad och klar att gå igenom

cardstream körs på din dator och sparar ingenting som standard. Lägg till en flagga så sparas varje kort du visar också i en session på ditt Ximilar-konto, med pris, tid i bild och det utsnitt som kortet identifierades från. Öppna Ximilar-appen efter sändningen och se vad den var värd.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# skriver ut sessionens id och sparar medan sändningen pågår
En sparad session i Ximilar-appen: visade produkter, betalda API-anrop, marknadsvärde, genomsnittlig tid i bild, de mest värdefulla produkterna och de vanligaste seten.

Sändningen i siffror

Visade produkter, betalda API-anrop, marknadsvärde och genomsnittlig tid i bild för varje session, med de mest värdefulla produkterna och de vanligaste seten bredvid.

Varje kort, med bild

Varje rad behåller kort, set, nummer, pris och det utsnitt som kortet identifierades från. Sök i listan efter produkt eller set, och filtrera dina sessioner efter status, plattform och datum.

Gör den till ditt eget underlag

Markera vad som såldes, lägg till en anteckning, rätta en felaktig träff eller dess pris, ta bort en falsk. Ge sessionen ett namn och lägg till egna metadata: ett utropsnummer, kostnader, köpare.

Fortsätt där du slutade

Omstart mitt i sändningen? Ange sessionens id i stället för NEW så fortsätter sändningen i samma session, även om den hade stängts. Med --ximilar-workspace sparas den i en arbetsyta för teamet.

Avstängt som standard: utan --ximilar-stream är identifieringsanropet det enda som lämnar din dator. För att spara krävs tjänsten Cardstream på ditt Ximilar-konto. Bara starten av en session debiteras, och med --no-ximilar-stream-images sparas enbart text.

Snabbstart

Från noll till liveidentifiering i 3 steg

1

Installera

En virtualenv, releasens wheel (verifierad mot kontrollsumman), modellvikterna och båda kommandona i din PATH. Ta skriptet, kör pip install på samma wheel från PyPI (vikterna laddas ner separat) eller klona repot och bygg själv. Docker och Windows finns på nedladdningssidan.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# fler installationssätt → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # eller: uv tool install 'cardstream[client,onnx]'
# wheel-filen innehåller inga vikter: packa upp de två tar-arkiven från cardstream.ai/models
# och peka flaggorna mot dem:
$ 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

Anslut ett identifieringssystem

Ximilar collectibles/v2 som standard: en nyckel från ximilar.com är den enda inloggningsuppgift hela systemet behöver. Eller rikta samma steg mot din egen igenkänningstjänst.

$ export XIMILAR_API_KEY=your-key
3

Rikta en kamera mot ett kort

Öppna webbgränssnittet med din webbkamera, eller mata det med din sändning: hämta den via RTSP eller låt OBS skicka RTMP rakt in. Kör du breaks på ett och samma set hela kvällen? Ange det i förväg så slutar slutpunkten att gissa: engelska Pokémonkort ur CRI betyder tre saker färre som kan bli fel. Ange --alphabet varje gång du anger --game, eftersom ett förvalt spel stänger av slutpunktens egen avkänning av skriftsystem. Lägg till --price-stats så får varje träff också marknadspriser i USD: median, prisspann och senaste försäljning, på kortet och i historiken. Lägg till --ximilar-stream NEW för att spara sändningen på ditt Ximilar-konto och gå igenom den efteråt.

$ cardstream-web
# → http://127.0.0.1:8001 (håll upp ett kort)

# Engelska Pokémonkort, ett set (CRI - Chaos Rising), med marknadspriser i USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Öppen källkod. Egen drift. Din stream, din stack.

Ingen plattform i mitten och ingen licens per användare: anslut Ximilars API eller ditt eget identifieringssystem, så anropar cardstream det en gång per unikt kort i stället för en gång per bildruta. Oavsett om du kör breaks på Whatnot, sänder i Fanatics Live-stil eller streamar från din egen liveshoppinglösning kan du köra cardstream redan i kväll, på den hårdvara du redan har.