Лучшее распознавание карт для стримов. Создано для брейков, вскрытия бустеров и прямых эфиров.
cardstream следит за вашим брейком, вскрытием бустеров или эфиром и распознаёт каждую коллекционную карту, как только она попадает в кадр: название, сет и уверенность — в реальном времени. Система отслеживания карт для анализа стримов с продажами. Для стримеров, которые хотят знать больше.
От Pokémon до Magic: The Gathering
Меняйте категорию от эфира к эфиру, и весь движок перестроится: детекция, фильтры и запрос на распознавание настроятся на нужный эндпоинт. Каждое совпадение приходит с названием, сетом, кодом сета, номером карты, серией и годом.
Коллекционные карточные игры
collectibles/v2/tcg_id Современные и винтажные синглы ККИ — прямо со стрима. Эндпоинт читает иллюстрацию, рамку и текст, поэтому карта распознаётся по той же картинке, которую видят ваши зрители: не нужно выискивать символ сета и щуриться на номер карты.
- 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
Один запрос на карту, а не на кадр
Смысл в том, чтобы при анализе стрима отправлять только те запросы, которые действительно сообщают что-то новое. Открытая альтернатива закрытым SaaS-сервисам распознавания карт: без платформы-посредника и без платы за рабочие места. Ваше оборудование, ваш API-ключ и конечный автомат, который обращается к API, только когда карта в кадре действительно новая.
Наивный покадровый пайплайн при 15 fps отправляет 54 000 запросов на распознавание в час. cardstream отправляет по одному на каждую новую карту, которую вы показываете, — около сотни за тот же час.
Тот же час, то же видео, те же карты: 54 000 запросов против примерно 100. Фильтр движения и фильтр повторов работают локально, на вашем оборудовании, а запрос уходит, только когда в кадре замирает действительно новая карта.
Ни подписки на 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 действительно оправдан.
Детекция
локально · без APIНаходит четырёхугольник карты и выпрямляет его в чистый кроп. Частота детекции меняется в три ступени по сигналу локального фильтра движения: движение, неподвижная карта, пустой кадр.
Фильтр движения
локально · без APIДешёвая средняя разница между кадрами. К карте стоит присмотреться, только когда сцена замерла на N кадров. Ещё движется? Ждём.
Фильтр повторов
локально · без APIСравнение эмбеддингов отвечает на один вопрос: это та же карта, что и раньше? Та же карта → повторно выдаётся результат из кэша.
Распознавание
ximilar · 1 запросЗапрос на распознавание в Ximilar вызывает только действительно новая, замершая карта: асинхронно, с защитой от дребезга, вне цикла обработки кадров. Результат приходит обратно в реальном времени.
Вы ведёте стримы в одиночку?
Один человек, одна камера и долгая ночь брейков: чтобы знать, какая карта на экране, команда инженеров не нужна. Подключите стрим, который вы и так ведёте, и cardstream будет анализировать его в реальном времени, где бы вы ни продавали: на маркетплейсе или прямо на своём канале.
- Whatnot
- Fanatics Live
- eBay Live
- TikTok Shop
- Twitch
- YouTube Live
- ваш сайт
Ни доступа к аккаунту, ни API-ключей маркетплейсов, ни бота в чате. И никакой связи ни с одной из этих платформ. cardstream читает ваше видео и больше ничего.
Вы уже стримите из OBS
Добавьте ещё один вывод рядом с тем, что идёт в эфир. Покупатели видят ровно то же, что и раньше, а копия того же потока приходит в cardstream, и каждая карта, которая ложится на стол, по пути распознаётся. Режиму ожидания из примера ниже нужен системный ffmpeg. А можно обойтись без второго вывода: пусть cardstream читает виртуальную камеру OBS как обычную веб-камеру.
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live # направьте сюда второй вывод OBS
Или камера, которая уже стоит на столе
Камера над столом, устройство захвата, телефон вместо веб-камеры — всё, под чем вы вскрываете бустеры и показываете карты. Анализ идёт на компьютере рядом с камерой, поэтому по умолчанию за пределы комнаты уходит только один кроп на карту.
$ cardstream-web --source 0 # веб-камера · веб-интерфейс на localhost
Или всё, у чего есть URL
Энкодеры, видеомикшеры, сервисы ретрансляции, вторая студия на другом конце города. cardstream забирает потоки RTSP, RTMP и SRT, а для самодельных сетапов принимает JPEG-кадры по WebSocket.
$ cardstream-web \
--source rtsp://studio/stream1 Оверлей в реальном времени
Название, сет и уверенность появляются, как только карта замирает: можно зачитать вслух или вывести обратно в свою сцену.
Каждая карта в журнале
История всего, что вы показали, пополняется по ходу эфира: миниатюра каждой карты и время, которое она провела на стриме. Сохраните её в аккаунт Ximilar и разберите эфир наутро: что продано и сколько это стоило.
По силам одному
Ни комиссии платформы, ни платы за рабочие места. Трёхчасовой эфир — это горстка запросов на распознавание, а не запрос на каждый кадр.
Пошагово: как подключить эфир на Whatnot или Fanatics Live →
Ваш эфир сохранён и готов к разбору
cardstream работает на вашем компьютере и по умолчанию ничего не хранит. Добавьте один флаг, и каждая показанная карта будет сохраняться ещё и в сеанс в вашем аккаунте Ximilar: с ценой, временем на экране и кропом, по которому её распознали. После эфира откройте приложение Ximilar и узнайте, сколько стоило всё, что вы показали.
$ cardstream-web --price-stats \ --ximilar-stream NEW # выводит идентификатор сеанса и сохраняет по ходу эфира
Эфир в цифрах
Показанные товары, платные запросы к API, рыночная стоимость и среднее время на экране для каждого сеанса, а рядом — самые дорогие товары и самые частые сеты.
Каждая карта с картинкой
В каждой строке — карта, сет, номер, цена и кроп, по которому её распознали. Ищите в списке по товару или сету, а сеансы отбирайте по статусу, платформе и дате.
Ведите свой учёт
Отметьте, что продано, добавьте заметку, исправьте неверное совпадение или его цену, удалите ложное. Дайте сеансу название и добавьте свои метаданные: номер лота, расходы, покупателей.
Продолжайте с того же места
Перезапустили посреди эфира? Передайте идентификатор сеанса вместо NEW, и эфир продолжится в том же сеансе, даже если его уже закрыли. Флаг --ximilar-workspace сохраняет сеанс в командное рабочее пространство.
По умолчанию выключено: без --ximilar-stream ваш компьютер покидает только запрос на распознавание. Для сохранения в аккаунте Ximilar должен быть подключён сервис Cardstream. Оплачивается только создание сеанса, а с --no-ximilar-stream-images сохраняется только текст.
От нуля до распознавания в эфире за 3 шага
Установите
Виртуальное окружение, релизный 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
Подключите систему распознавания
Из коробки — Ximilar collectibles/v2: кроме ключа с ximilar.com, никаких учётных данных системе не нужно. Или направьте тот же шаг на собственную систему распознавания.
$ export XIMILAR_API_KEY=your-key
Наведите камеру на карту
Откройте веб-интерфейс с веб-камерой или подключите свой эфир: 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 уже сегодня вечером на том оборудовании, которое у вас есть.