cardstream
Открытый код На базе Ximilar Бета-версия

Лучшее распознавание карт для стримов. Создано для брейков, вскрытия бустеров и прямых эфиров.

cardstream следит за вашим брейком, вскрытием бустеров или эфиром и распознаёт каждую коллекционную карту, как только она попадает в кадр: название, сет и уверенность — в реальном времени. Система отслеживания карт для анализа стримов с продажами. Для стримеров, которые хотят знать больше.

Что распознаёт

От Pokémon до Magic: The Gathering

Меняйте категорию от эфира к эфиру, и весь движок перестроится: детекция, фильтры и запрос на распознавание настроятся на нужный эндпоинт. Каждое совпадение приходит с названием, сетом, кодом сета, номером карты, серией и годом.

🃏

Коллекционные карточные игры

collectibles/v2/tcg_id
Ximilar Доступно

Современные и винтажные синглы ККИ — прямо со стрима. Эндпоинт читает иллюстрацию, рамку и текст, поэтому карта распознаётся по той же картинке, которую видят ваши зрители: не нужно выискивать символ сета и щуриться на номер карты.

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

Спортивные карточки sport_id

Карточки новичков, параллели, вставки и автографы по всем главным видам спорта: бейсболу, баскетболу, американскому футболу, футболу, хоккею и не только. С точностью до карточки, сета и года.

Скоро
🧊

Карты в слабах slab_id

Читает этикетку на капсуле с оценкой: карта в слабе PSA, BGS или CGC распознаётся, и вскрывать его не нужно.

Скоро
📚

Комиксы comics_id

Обложки распознаются так же, как карты: название, выпуск и год — по одному неподвижному кадру.

Скоро
Без привязки к одному поставщику

Подключите стороннюю систему распознавания или свою

Всё, что решает, нужен ли запрос, происходит до самого распознавания: детекция, фильтр движения и фильтр повторов работают локально и не зависят от поставщика. Сам запрос — один заменяемый шаг: Ximilar из коробки, сторонний сервис распознавания карт или модель, которую вы обучили сами и держите на своём оборудовании.

Это один небольшой интерфейс: на входе кроп карты, на выходе совпадение. Реализуйте IdentifyTarget, и все фильтры, ограничения частоты и пороги перед ним будут работать как раньше: по-прежнему один кроп на каждую новую карту, кто бы ни отвечал на запрос.

# своя система распознавания, тот же движок
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# в любом случае один кроп на каждую новую карту
$ cardstream-web --detector rfdetr
Почему cardstream.ai?

Один запрос на карту, а не на кадр

Смысл в том, чтобы при анализе стрима отправлять только те запросы, которые действительно сообщают что-то новое. Открытая альтернатива закрытым SaaS-сервисам распознавания карт: без платформы-посредника и без платы за рабочие места. Ваше оборудование, ваш API-ключ и конечный автомат, который обращается к API, только когда карта в кадре действительно новая.

54 000 → ~100
запросов к API в час

Наивный покадровый пайплайн при 15 fps отправляет 54 000 запросов на распознавание в час. cardstream отправляет по одному на каждую новую карту, которую вы показываете, — около сотни за тот же час.

540×
меньше запросов на распознавание

Тот же час, то же видео, те же карты: 54 000 запросов против примерно 100. Фильтр движения и фильтр повторов работают локально, на вашем оборудовании, а запрос уходит, только когда в кадре замирает действительно новая карта.

0 $
комиссия платформы

Ни подписки на SaaS, ни платы за каждое рабочее место, ни привязки к поставщику. Разверните у себя весь стек вместе с распознаванием или подключитесь к API Ximilar.

Возможности

Всё, что нужно для эфира с картами

Соведущий, который не пропустит ни одной карты: для тех, кто продаёт в прямом эфире на платформах вроде Whatnot и Fanatics Live, для бокс-брейков, стримов из магазинов карт и каталогизации коллекций. Везде, где камера смотрит на картон.

⚡

Распознана, едва попав в кадр

Никакой кнопки «Сканировать». Никакого ожидания. Просто покажите карту: от картона до названия, сета и уверенности — примерно полсекунды, прямо на стриме.

🎯

Один запрос на карту

Фильтр движения и фильтр повторов на эмбеддингах работают локально, на вашем процессоре. Держите карту неподвижно — ни одного повторного запроса. Смените карту — ровно один новый.

📡

Любой источник видео

Веб-камера, видеофайлы, RTSP, RTMP и SRT: cardstream забирает поток сам или принимает его прямо из OBS с флагом --listen. Для самодельных сетапов — JPEG-кадры по WebSocket.

🔌

Любой бэкенд распознавания

Из коробки — Ximilar collectibles/v2. Тот же движок можно направить на стороннюю систему распознавания карт или на ту, что вы обучили и держите у себя.

🧠

Свои модели

Веса локатора — наши: дообученная модель сегментации RF-DETR под лицензией Apache-2.0, её скачивает установщик. Обычные детекторы (RF-DETR, RT-DETRv2), которые выдают прямоугольник вместо маски, тоже поддерживаются, если вы предпочитаете свой экспорт.

🔓

Открытый код, работает у вас

Один пакет Python под разрешительной лицензией. Читайте код, делайте форки, запускайте на своём оборудовании. Ваш ключ, ваши данные, ваша инфраструктура.

Как это работает

Достаточно умён, чтобы знать, когда не обращаться к API

Между вашим стримом и API стоит конечный автомат. Каждый кадр проходит через DecisionCore, единый конечный автомат, работающий локально, а три локальных фильтра решают, когда единственный шаг с API действительно оправдан.

1

Детекция

локально · без API

Находит четырёхугольник карты и выпрямляет его в чистый кроп. Частота детекции меняется в три ступени по сигналу локального фильтра движения: движение, неподвижная карта, пустой кадр.

2

Фильтр движения

локально · без API

Дешёвая средняя разница между кадрами. К карте стоит присмотреться, только когда сцена замерла на N кадров. Ещё движется? Ждём.

3

Фильтр повторов

локально · без API

Сравнение эмбеддингов отвечает на один вопрос: это та же карта, что и раньше? Та же карта → повторно выдаётся результат из кэша.

4

Распознавание

ximilar · 1 запрос

Запрос на распознавание в Ximilar вызывает только действительно новая, замершая карта: асинхронно, с защитой от дребезга, вне цикла обработки кадров. Результат приходит обратно в реальном времени.

Стримерам, брейкерам и магазинам

Вы ведёте стримы в одиночку?

Один человек, одна камера и долгая ночь брейков: чтобы знать, какая карта на экране, команда инженеров не нужна. Подключите стрим, который вы и так ведёте, и cardstream будет анализировать его в реальном времени, где бы вы ни продавали: на маркетплейсе или прямо на своём канале.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • ваш сайт

Ни доступа к аккаунту, ни API-ключей маркетплейсов, ни бота в чате. И никакой связи ни с одной из этих платформ. cardstream читает ваше видео и больше ничего.

01

Вы уже стримите из OBS

Добавьте ещё один вывод рядом с тем, что идёт в эфир. Покупатели видят ровно то же, что и раньше, а копия того же потока приходит в cardstream, и каждая карта, которая ложится на стол, по пути распознаётся. Режиму ожидания из примера ниже нужен системный ffmpeg. А можно обойтись без второго вывода: пусть cardstream читает виртуальную камеру OBS как обычную веб-камеру.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# направьте сюда второй вывод OBS
02

Или камера, которая уже стоит на столе

Камера над столом, устройство захвата, телефон вместо веб-камеры — всё, под чем вы вскрываете бустеры и показываете карты. Анализ идёт на компьютере рядом с камерой, поэтому по умолчанию за пределы комнаты уходит только один кроп на карту.

$ cardstream-web --source 0
# веб-камера · веб-интерфейс на localhost
03

Или всё, у чего есть URL

Энкодеры, видеомикшеры, сервисы ретрансляции, вторая студия на другом конце города. cardstream забирает потоки RTSP, RTMP и SRT, а для самодельных сетапов принимает JPEG-кадры по WebSocket.

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

Оверлей в реальном времени

Название, сет и уверенность появляются, как только карта замирает: можно зачитать вслух или вывести обратно в свою сцену.

Каждая карта в журнале

История всего, что вы показали, пополняется по ходу эфира: миниатюра каждой карты и время, которое она провела на стриме. Сохраните её в аккаунт Ximilar и разберите эфир наутро: что продано и сколько это стоило.

По силам одному

Ни комиссии платформы, ни платы за рабочие места. Трёхчасовой эфир — это горстка запросов на распознавание, а не запрос на каждый кадр.

Cardstream Cloud

Ваш эфир сохранён и готов к разбору

cardstream работает на вашем компьютере и по умолчанию ничего не хранит. Добавьте один флаг, и каждая показанная карта будет сохраняться ещё и в сеанс в вашем аккаунте Ximilar: с ценой, временем на экране и кропом, по которому её распознали. После эфира откройте приложение Ximilar и узнайте, сколько стоило всё, что вы показали.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# выводит идентификатор сеанса и сохраняет по ходу эфира
Сохранённый сеанс в приложении Ximilar: показанные товары, платные запросы к API, рыночная стоимость, среднее время на экране, самые дорогие товары и самые частые сеты.

Эфир в цифрах

Показанные товары, платные запросы к API, рыночная стоимость и среднее время на экране для каждого сеанса, а рядом — самые дорогие товары и самые частые сеты.

Каждая карта с картинкой

В каждой строке — карта, сет, номер, цена и кроп, по которому её распознали. Ищите в списке по товару или сету, а сеансы отбирайте по статусу, платформе и дате.

Ведите свой учёт

Отметьте, что продано, добавьте заметку, исправьте неверное совпадение или его цену, удалите ложное. Дайте сеансу название и добавьте свои метаданные: номер лота, расходы, покупателей.

Продолжайте с того же места

Перезапустили посреди эфира? Передайте идентификатор сеанса вместо NEW, и эфир продолжится в том же сеансе, даже если его уже закрыли. Флаг --ximilar-workspace сохраняет сеанс в командное рабочее пространство.

По умолчанию выключено: без --ximilar-stream ваш компьютер покидает только запрос на распознавание. Для сохранения в аккаунте Ximilar должен быть подключён сервис Cardstream. Оплачивается только создание сеанса, а с --no-ximilar-stream-images сохраняется только текст.

Быстрый старт

От нуля до распознавания в эфире за 3 шага

1

Установите

Виртуальное окружение, релизный wheel (с проверкой контрольной суммы), веса моделей и обе команды в PATH. Возьмите скрипт, поставьте тот же wheel из PyPI через pip (веса скачиваются отдельно) или клонируйте репозиторий и соберите всё сами. Docker и Windows — на странице загрузки.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# другие способы установки → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # или: uv tool install 'cardstream[client,onnx]'
# в wheel нет весов: распакуйте два архива с cardstream.ai/models
# и укажите пути к ним во флагах:
$ 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

Подключите систему распознавания

Из коробки — Ximilar collectibles/v2: кроме ключа с ximilar.com, никаких учётных данных системе не нужно. Или направьте тот же шаг на собственную систему распознавания.

$ export XIMILAR_API_KEY=your-key
3

Наведите камеру на карту

Откройте веб-интерфейс с веб-камерой или подключите свой эфир: cardstream заберёт поток по RTSP или примет RTMP прямо из OBS. Весь вечер вскрываете один сет? Подскажите его, и эндпоинту не придётся гадать: английские карты Pokémon из сета CRI — это на три возможные ошибки меньше. Задавая --game, всегда задавайте и --alphabet: подсказка с игрой отключает у эндпоинта собственное определение письменности. Добавьте --price-stats, и каждое совпадение будет приходить с рыночными ценами в долларах США: медиана, диапазон и последняя продажа — на карте и в истории. Добавьте --ximilar-stream NEW, чтобы сохранить эфир в аккаунт Ximilar и разобрать его позже.

$ cardstream-web
# → http://127.0.0.1:8001 — покажите карту

# английские карты Pokémon, один сет (CRI — Chaos Rising), с рыночными ценами в USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Открытый код. Работает у вас. Ваш стрим, ваш стек.

Ни платформы-посредника, ни платы за рабочие места: подключите API Ximilar или собственную систему распознавания, и cardstream будет обращаться к ней один раз на каждую новую карту, а не на каждый кадр. Проводите ли вы брейки на Whatnot, ведёте эфир в духе Fanatics Live или продаёте в прямом эфире на своей площадке — запустите cardstream уже сегодня вечером на том оборудовании, которое у вас есть.