cardstream
Código aberto Com tecnologia da Ximilar Versão beta

A melhor identificação de cartas para lives. Feita para breaks, aberturas e shows ao vivo.

O cardstream acompanha seu break, sua abertura ou seu show e identifica cada carta colecionável no instante em que ela entra no enquadramento: nome, coleção e confiança, ao vivo. Analise suas lives de venda com um sistema de rastreamento de cartas, feito para streamers que querem saber mais sobre o que passa pela mesa.

O que ele identifica

De Pokémon a Magic: The Gathering

Troque de categoria a cada show e o motor inteiro acompanha: detecção, filtros e chamada de identificação passam a apontar para o endpoint certo. Cada correspondência volta com nome, coleção, código da coleção, número da carta, série e ano.

🃏

Jogos de cartas colecionáveis

collectibles/v2/tcg_id
Ximilar Disponível

Cartas avulsas de TCG, modernas e vintage, direto do vídeo. O endpoint lê a arte, a moldura e o texto, então a carta é identificada a partir da mesma imagem que seus espectadores estão vendo: sem caçar o símbolo da coleção nem apertar os olhos para ler o número de colecionador.

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

Cartas esportivas sport_id

Rookies, paralelas, inserts e autografadas de todos os grandes esportes (beisebol, basquete, futebol americano, futebol, hóquei e mais): a carta exata, a coleção exata, o ano exato.

Em breve
🧊

Cartas graduadas (slabs) slab_id

Lê a etiqueta da case de graduação: a carta dentro de um slab da PSA, BGS ou CGC, identificada sem precisar abri-lo.

Em breve
📚

Quadrinhos comics_id

Capas identificadas do mesmo jeito que as cartas: título, edição e ano, a partir de um único quadro parado.

Em breve
Sem prender você a um fornecedor

Conecte um reconhecedor proprietário, ou o seu próprio

Tudo o que decide se vale chamar acontece antes da identificação em si: a detecção, o filtro de movimento e o filtro de mesma carta rodam localmente e não dependem do fornecedor. A chamada é um único passo intercambiável: a Ximilar já vem configurada, mas pode ser um serviço proprietário de identificação de cartas ou um modelo que você mesmo treinou e hospeda no seu hardware.

É uma interface mínima: entra um recorte da carta, sai uma correspondência. Implemente IdentifyTarget e todos os filtros, limitadores e limiares que vêm antes continuam funcionando exatamente como antes: um recorte por carta distinta, seja quem for que responda.

# seu próprio reconhecedor, o mesmo motor
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# um recorte por carta distinta, em qualquer um dos casos
$ cardstream-web --detector rfdetr
Por que o cardstream.ai?

Uma chamada por carta, não por quadro

A ideia é reduzir a análise da live às chamadas que realmente trazem algo novo. A alternativa de código aberto ao SaaS fechado de reconhecimento de cartas: sem plataforma no meio do caminho, sem licença por assento. Seu hardware, sua chave da API e uma máquina de estados que só chama para fora quando a carta na tela é de fato nova.

54,000 → ~100
chamadas à API por hora

Um pipeline ingênuo que processa cada quadro a 15 fps dispara 54.000 identificações por hora. O cardstream dispara uma por carta distinta que você mostra: cerca de cem nessa mesma hora.

540×
menos chamadas de identificação

A mesma hora, o mesmo vídeo, as mesmas cartas: 54.000 chamadas contra cerca de 100. Os filtros de movimento e de identidade rodam localmente, no seu próprio hardware, e uma chamada só sai quando uma carta realmente nova para no enquadramento.

$0
de taxa de plataforma

Sem assinatura SaaS, sem preço por assento, sem ficar preso a um fornecedor. Hospede o stack inteiro, identificação incluída, ou conecte-se à API da Ximilar.

Recursos

Tudo o que um show de cartas ao vivo precisa

Um coapresentador que não deixa passar nenhuma carta: para vendedores de live commerce em plataformas como Whatnot e Fanatics Live, box breaks, lives de lojas de cartas e catalogação de coleções. Onde houver uma câmera e papelão, ele serve.

⚡

Reconhecida assim que entra no quadro

Sem botão de escanear. Sem espera. É só mostrar a carta: nome, coleção e confiança saem do papelão para a tela em cerca de meio segundo, ao vivo.

🎯

Uma chamada por carta

Um filtro de movimento e um filtro de identidade por embedding rodam localmente, na sua própria CPU. Segure uma carta parada: zero chamadas repetidas. Troque de carta: exatamente uma chamada nova.

📡

Qualquer fonte de vídeo

Webcam, arquivos de vídeo, RTSP, RTMP e SRT, tanto em modo pull quanto recebidos direto do OBS com --listen. Feeds JPEG por WebSocket para montagens personalizadas.

🔌

Qualquer backend de identificação

Ximilar collectibles/v2 pronto para usar, ou aponte o mesmo motor para um reconhecedor de cartas proprietário, ou para um que você mesmo treinou e hospeda.

🧠

Traga seus próprios modelos

Os pesos do localizador são nossos: um modelo de segmentação RF-DETR ajustado, com licença Apache-2.0, que o instalador baixa. Detectores de caixa (RF-DETR, RT-DETRv2) também são suportados, se você preferir trazer sua própria exportação.

🔓

Código aberto, hospedado por você

Um único pacote Python com licença permissiva. Leia, faça um fork e rode no seu próprio hardware. Sua chave, seus dados, sua infraestrutura.

Como funciona

Esperto o bastante para saber quando não chamar a API

Entre a sua live e a API existe uma máquina de estados. Cada quadro passa pelo DecisionCore, uma única máquina de estados que roda localmente, e três filtros locais decidem quando o único passo que chama a API realmente se justifica.

1

Detectar

local · sem chamada à API

Encontra o quadrilátero da carta e endireita um recorte limpo. O filtro de movimento local regula isso em três níveis: em movimento, parado com carta, vazio.

2

Filtro de movimento

local · sem chamada à API

Uma diferença média entre quadros, barata de calcular. Só quando a cena fica parada por N quadros é que vale olhar a carta de perto. Ainda está se mexendo? Espera.

3

Filtro de identidade

local · sem chamada à API

Uma comparação de embeddings responde a uma única pergunta: é a mesma carta de antes? Se for, o resultado guardado em cache é reenviado.

4

Identificar

ximilar · 1 chamada

Só uma carta realmente nova e parada dispara uma identificação da Ximilar: assíncrona, com debounce e fora do loop de quadros. O resultado volta para a live na hora.

Para streamers, breakers e lojas

Você faz live por conta própria?

Uma pessoa, uma câmera e uma longa noite de breaks: você não deveria precisar de um time de engenharia para saber qual carta está na tela. Conecte a live que você já está transmitindo e deixe o cardstream analisá-la ao vivo, seja vendendo em um marketplace ou direto do seu próprio canal.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • seu próprio site

Sem acesso à sua conta, sem chaves de API do marketplace, sem bot no seu chat, e sem nenhum vínculo com essas plataformas. O cardstream lê o seu vídeo e nada mais.

01

Você já transmite pelo OBS

Adicione mais uma saída ao lado da que alimenta seu show. Seus compradores veem exatamente o que viam antes; uma cópia do mesmo sinal chega ao cardstream e cada carta que passa pela mesa é identificada no caminho. O modo de escuta abaixo precisa do binário ffmpeg do sistema. Ou pule a segunda saída de vez e deixe o cardstream ler a câmera virtual do OBS como uma webcam comum.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# aponte o segundo destino do OBS para cá
02

Ou a câmera que já está na mesa

Câmera de cima, placa de captura, o celular como webcam: o que você usar para abrir e revelar as cartas. A análise roda na máquina ao lado da câmera, então, por padrão, nada além de um recorte por carta sai da sala.

$ cardstream-web --source 0
# webcam · interface no navegador em localhost
03

Ou qualquer coisa com uma URL

Encoders, switchers, restreamers, um segundo estúdio do outro lado da cidade. Pull por RTSP, RTMP e SRT, além de feeds JPEG por WebSocket quando a montagem é caseira.

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

Overlay ao vivo

Nome, coleção e confiança aparecem assim que a carta para, prontos para ler em voz alta ou para compor de volta na sua cena.

Cada carta, registrada

Um histórico contínuo de tudo o que você mostrou: uma miniatura de cada carta e quanto tempo ela ficou no ar. Salve na sua conta da Ximilar e reveja o show na manhã seguinte, com o que foi vendido e quanto valia.

No tamanho de uma pessoa só

Sem taxa de plataforma, sem licença por assento. Um show de três horas é um punhado de chamadas de identificação, não uma por quadro.

Cardstream Cloud

Seu show, salvo e pronto para rever

O cardstream roda na sua máquina e, por padrão, não guarda nada. Adicione uma opção e cada carta que você mostrar também será salva em uma sessão na sua conta da Ximilar, com o preço, o tempo no ar e o recorte a partir do qual foi identificada. Abra o app da Ximilar depois do show e veja quanto ele valeu.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# mostra o id da sessão e salva durante o show
Uma sessão salva no app da Ximilar: produtos mostrados, chamadas pagas à API, valor de mercado, tempo médio no ar, os produtos mais valiosos e as coleções mais frequentes.

O show em números

Produtos mostrados, chamadas pagas à API, valor de mercado e tempo médio no ar de cada sessão, ao lado dos produtos mais valiosos e das coleções mais frequentes.

Cada carta, com a imagem dela

Cada linha guarda a carta, a coleção, o número, o preço e o recorte a partir do qual foi identificada. Busque na lista por produto ou coleção e filtre suas sessões por status, plataforma e data.

Faça dele o seu registro

Marque o que foi vendido, adicione uma nota, corrija uma correspondência errada ou o preço dela e apague uma falsa. Dê um nome à sessão e anexe seus próprios metadados: um número de lote, custos, compradores.

Continue de onde parou

Precisou reiniciar no meio do show? Passe o id da sessão no lugar de NEW e o show continua na mesma sessão, mesmo que ela tenha sido fechada. --ximilar-workspace salva em um workspace de equipe.

Desativado por padrão: sem --ximilar-stream, a chamada de identificação é a única coisa que sai da sua máquina. Para salvar, sua conta da Ximilar precisa do serviço Cardstream; só o início de uma sessão é cobrado, e --no-ximilar-stream-images salva apenas o texto.

Início rápido

Do zero à identificação ao vivo em 3 passos

1

Instale

Um virtualenv, o wheel da versão publicada (com checksum verificado), os pesos dos modelos e os dois comandos no seu PATH. Use o script, instale o mesmo wheel do PyPI com pip (os pesos são baixados à parte) ou clone o repositório e compile você mesmo. Docker e Windows estão na página de download.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# outras formas de instalar → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # ou: uv tool install 'cardstream[client,onnx]'
# o wheel não inclui os pesos: descompacte os dois tarballs de cardstream.ai/models
# e aponte as flags para eles:
$ 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

Conecte um sistema de identificação

Ximilar collectibles/v2 já vem pronto: uma chave do ximilar.com é a única credencial de que o sistema inteiro precisa. Ou aponte esse mesmo passo para o seu próprio reconhecedor.

$ export XIMILAR_API_KEY=your-key
3

Aponte uma câmera para uma carta

Abra a interface no navegador com a sua webcam, ou passe o seu show para ele: pull por RTSP, ou deixe o OBS enviar RTMP direto. Vai abrir uma única coleção a noite toda? Pré-ajuste isso e o endpoint para de adivinhar: Pokémon em inglês da CRI são três coisas a menos para errar. Informe --alphabet sempre que informar --game, porque pré-ajustar o jogo desliga a detecção de sistema de escrita do próprio endpoint. Adicione --price-stats e cada correspondência traz também preços de mercado em USD (mediana, intervalo e última venda), tanto na carta quanto no histórico. Adicione --ximilar-stream NEW para salvar o show na sua conta da Ximilar e revê-lo depois.

$ cardstream-web
# → http://127.0.0.1:8001 — mostre uma carta para a câmera

# Cartas Pokémon em inglês, uma única coleção (CRI - Chaos Rising), com preços de mercado em USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Código aberto. Hospedado por você. Sua live, seu stack.

Sem plataforma no meio do caminho, sem licença por assento: conecte a API da Ximilar ou seu próprio sistema de identificação e o cardstream chama uma vez por carta distinta, não uma vez por quadro. Não importa se você faz breaks na Whatnot, comanda um show no estilo Fanatics Live ou transmite seu próprio live commerce: coloque o cardstream para rodar hoje à noite no hardware que você já tem.