Перейти к публикации
[ {"link":"https://topdeck.ru/apps/toptrade/member/32/promo/1", "image":"https://topdeck.ru/apps/toptrade/member/32/promo/1/image"}, {"link":"https://topdeck.ru/apps/toptrade/member/32/promo/2", "image":"https://topdeck.ru/apps/toptrade/member/32/promo/2/image"} ]

StrangerOne

Пользователи
  • Публикации

    733
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    8

3 подписчика

О StrangerOne

  • День рождения 24.02.1998

Информация

  • Пол
    Мужчина
  • Город
    Иркутск
  • Ник Arena
    StrangerOne
  • Ник MTGO
    -
  • ФИО
    Груздев Александр Сергеевич
  • Дополнительно
    .

Посетители профиля

9 341 просмотр профиля

Достижения StrangerOne

  1. Спасибо! Модерновая если что своя есть, но карты наверное придется стрелять некоторые) Ближе к декабрю будет понятнее, я думаю)
  2. Любое дуэльное. В Иркутске обычно играли модерн и пионер, но тут я, в принципе, готов хоть легаси, хоть премодерн, хоть олдскул зайти и постараться хорошо провести время)
  3. Не хочу делать отдельную тему, буду восхищаться и спрашивать здесь) Планирую быть в Москве 11, 12 и 13 декабря. В какой из этих дней (и где) в перспективе вечерком можно во что-то дуэльное пошлёпать интересное) Готов в принципе играть что угодно, особенно если колоду выдадут и расскажут хотя-бы примерно как пилотировать
  4. Спасибо) Постараюсь на неделе поправить пару косяков о которых узнал и попробовать написать более подробную инструкцию как это запустить... Но там, скорее всего, так или иначе, придется интерпретатор питона устанавливать на компьютер, то есть "подзахламить" систему себе ради единственного запуска не самого готового "продукта"
  5. Надо будет попробовать. В качество и разрешение картинки всё упрется, такое ощущение. Надо айфон будет для такого покупать, там камера лучше)
  6. С названия не вытащить версию картв, коих сейчас наплодилось как грязи, но в целом да, согласен, можно и так)
  7. Да, есть вариант попробовать на досуге. Не думал о том, что можно попробовать OCR модель файтюнить, спасибо)
  8. Зависит от ситуации. Если каким-то образом 1000 картинок распознать прям разом и подать на обработку вот таким куском (что в принципе можно сделать в "оффлайне", если написать функцию которая по папке с картинками будет бегать), то у меня получилось сейчас полторы минуты. С учетом открывания картинки каждый раз по новой, ну, минут 10 на GPU у меня получилось на диванном тесте, прогнав 1000 раз одну и ту же картинку с одной картой на ней. Если целенаправленно писать для такого, то можно быстрее. Потом от 0 до бесконечности сидеть косяки исправлять) Но если мы говорим о том, чтобы сидеть перед компом и руками это делать, то тут зависит от расторопности рук х) Ну и если нужна скорость в оффлайне можно в теории перегнать всё на С++.
  9. По поводу фойлы - никак) И идей особо нет. Тут на фото в ауках иногда не понять фойла это или нет, пока не посмотришь в угол... Для себя скорее всего буду добавлять "галочку" в интерфейс и метить вручную. Может, если переходить на YOLO-based там можно будет под фойлу выдать доп класс какой-нибудь. Ну вот по поводу смотреть на арт без текста, я упоминал об этом, кажется. Боюсь тут подход будет ломаться на всяких промках и лейер картах. Но в целом решение может быть рабочим. Как вариант - не искать внутренний контур, а пытаться конкретный прямоугольник (или прямоугольники - зоны интереса) после детекции вырезать. И на основании этого фрагмента что-то делать. Для текста пробовать взять какой-то OCR алгоритм. Например EasyOCR. Буду тестить) Ну вот у меня тоже галлюцинаций хватает. Сегодня с утра какую-то пайлорарку из мх2 на русском определял чем угодно, но не тем, чем надо, хотя кроп очень качественный выходил. По-хорошему надо перепроверить эмбеддинги...
  10. Спасибо) Да, йолка тут первый кандидат на улучшение. В целом и размеченные датасеты на робофлоу уже какие-то есть, но не сильно "богатые"
  11. Топдек, привет! Разбавлю немного темы со спойлерами рассказом о том, как я сам себе создал трудности, а после героически их преодолевал. Меня кстати Саня зовут, если что... Примерно месяц назад после очередного турнира, который не собрался, на фоне дум о том, что надо реализовать кучу около-валидного и ненужного картона меня придавило очередным приступом лени и уныния, ведь чтобы сделать торговую тему, казалось, нужно потратить N часов. Как совсем капельку программист и еще меньшую капельку дата-сатанист/мл-инженер а на деле дармоед и бездельник начал думать о том, как бы эту штуку автоматизировать, чтобы не заниматься заполнением торговой темы самому. С одной стороны, проставить цены на карты и сформировать красивую тему, вроде как, не сложно, и это достаточно просто автоматизировать. Наиболее трудной частью, на мой взгляд - "оцифровать" свою коллекцию. Искра, буря, безумие и вот уже в голове сидит навязчивая идея: Надо сделать программу распознавания карт МТГ! Прежде всего хочу сказать, что да, я знаю/слышал, что на рынке существует множество готовых решений по распознаванию карт, которые позволяют, скорее всего, гибко работать с коллекцией, выгружать и загружать ее в кастомном формате (кстати можно поделиться такими продуктами) и прочая-прочая, но: Я не искал готовые решения, так как просто загорелся "спортивным интересом" смогу ли я реализовать подобную систему своими силами, которая будет работать хотя-бы не хуже. Или просто хотя-бы работать. Готовые решения, скорее всего, будут платные (а если есть бесплатные, то смотри п.1),. Хочется получить всё любой ценой, но бесплатно. Собственно, порядка двух-трех недель нерегулярной работы после основной работы и по выходным и некий "MVP" (назовем его так) - готов, и так как я, очевидно, жаден до внимания, раз создал этот пост, то надо срочно поделиться им со всем интернетом. В этой теме я хотел бы поделиться результатом, наработками, рассказать что получилось, а что нет, мб попросить помощи. Для тех кто не хочет читать - ссылки на решение под катом. Я сразу бы хотел сказать, что тут вы не найдете "продуктового" решения. Всё находится максимально в начальной стадии, не было покрыто тестами, и делалось для себя "дай бог чтоб работало". Дальнейшая полировка планируется, но по срокам сказать сложно... Базовая идея решения Когда речь заходит о распознавании и компьютерном зрении и многих в голове нарисуется образ тяжелых нейросетевых алгоритмов, требующих кучу памяти и вычислительных мощностей. Основная концепция, которой я придерживался - постараться как можно сильнее облегчить общую схему работы, избежать перетяжеления и нейросетей там, где можно справиться без них и оставить только там, где, на мой взгляд, это необходимо. Карту на фотографии (или на кадре видео) мы будем искать не используя нейронные сети вообще, исключительно при помощи методов компьютерной графики и классических трюков компьютерного зрения. Обнаружив карту - мы нещадно вырезаем ее из исходной картинки, исправляем искажения перспективы (спасибо что ты есть, линейная алгебра), после чего и начинается нейросетевая магия, приправленная щепоткой магии математической. Нейросетевая магия будет заключаться в том, что мы используем модель от open-AI, чтобы нагенерировать с наших картинок такое умное слово как "эмбеддинги". Если очень кратко, наша нейронная сеть каждому изображению ставит в соответствие некий вектор, в 768-мерном пространстве. При этом результат такого преобразования "не подвержен случайности", то есть для каждой картинки мы будет получать конкретный вектор-эмбеддинг. Идея состоит в том, что создав эмбеддинги для картинок-эталонов (hi-rez сканов наших карт), впоследствии, имея на руках вырезанные из наших фото/видеопотока фрагменты с настоящими (физическими) картами магии мы можем провести с ними ту же самую операцию (сгенерировать эмбеддинг), а после найти максимально похожий в нашем "эталонном списке". Вооружившись API скрайфолла, асинхронным Питоном и кружкой кофе за ночь были скачены ~392 тысячи изображений, что в сумме составляет ~30 гигабайт играбельных карт, которые были напечатаны в бумаге, включая токены. Их кстати можно теперь скачать вот здесь. На самом деле, уже на этом этапе были выявлены некоторые трудности и потенциальные проблемы. Если с английским языком все замечательно и на каждую карту можно найти скан, то вот с другими языками... То есть на некоторых картах просто нет хоть какого-то изображения (обычно на старых). Заместо них висят заглушки-плейсхолдеры. О том, что потенциально с этим делать и к чему это может привести я постарался описать в конце в пункте "Потенциальные проблемы и пути их решения". Скачав все файлы я запустил на них генерацию эмбеддингов. что заняло порядка полутора часов. Если необходимо, то скрипт для их получения я потом дополнительно могу прикрепить в репозиторий. Пока всё скачивалось и трансформировалось занялся механизмом детекции карт на изображении. На самом деле, тут у меня всё не так радужно, как и в других местах моего плана... Распознавание объектов без помощи нейросетей это не сильно сложно, но муторно. Классические алгоритмы требуют, зачастую, тонкой настройки гиперпараметров алгоритма, чтобы работать устойчиво. То на каком фоне объект находится, насколько он засвечен, на какую камеру и в каком разрешении ведется съемка - ОЧЕНЬ сильно влияет на качество распознавания, а, значит, и на качество работы всего решения. Признаться, тут я немного (много) считерил и адаптировал решения под условия, которые есть у меня. На первое время пример, что карты будут находиться на светлом фоне (а значит можно эксплуатировать контраст фона и карты) и сниматься на мой телефон (то есть я имею +- устойчивое качество, под которое я могу заточить гиперпараметры). Про то что делать дальше и как улучшить то что есть, опять же, в конце поста. Алгоритм оптимизации достаточно прост если не вникать в математику. Делаем картинку серой, блюрим, делаем адаптивный трешхолд (если говорить очень грубо и неправильно, как раз этот шаг и позволяет найти эти контрастные объекты) + дилляцию (утолщения контуров). После запускаем по этому делу поиск замкнутых контуров (снова магия какая-то), ищем большие и прямоугольные - скорее всего это будет карта. Процесс такого преобразования по шагам изобразил на фото. Запоминаем координаты контура, вырезаем его из картинки, а дальше используем еще немного магии и придаем ему нормальную ориентацию. В итоге будет что-то такое: Теперь то что у нас получилось можно сунуть в сеть, и получить на выходе вектор нужной размерности. Остается дело за малым - найти похожий. Похожесть вектора будем измерять по косинусной близости (то есть буквально косинус угла между векторами. В многомерном пространстве достаточно хорошо работает как метрика близости, а считается вроде как быстрее чем L2-норма) Однако, если сравнивать полученный вектор с каждым, то можно умереть со старости. Чтобы искать похожие вектора в многомерном пространстве умные мужики придумали много решений. Одно из них я и решил использовать - hnsw (Hierarchical Navigable Small World). Подробнее о нем можно прочитать вот тут, но если коротко, алгоритм позволяет искать похожих не перебирая всю имеющуюся "базу данных", а хитрит, строит графы, а потому иногда может ошибаться, но работает в N раз быстрее. Таким образом, в принципе, у нас готова около-полная схема работы нашего решения. Как минимум она уже может работать на статичных картинках. В репозитории можно посмотреть ноутбуки с примерами. Реализация Чтобы интегрировать ее в видеопроцесс надо решить несколько важных вызовов: Сделать так, чтобы наш алгоритм выделения контуров и распознавания не пытался сделать картой и распознать всё подряд. Дело в том, что у подхода нет такого понятия "Это не карта". Если на вход нейросети подать, например, кота, а потом полученный вектор прогнать через поиск, то она обязательно выдаст какой-то ответ. То есть необходимо понимать, что пользователь программы (Я, или кто угодно кто запустит мой говнокод) зафиксировал положение камеры и направил его на карту магии. Сделать так, чтобы одна и та же карта не вызывала срабатывание алгоритма распознавания 30 раз в секунду при частоте, соответственно, 30 кадров в секунду и не писала 30 записей в БД. Для решения первого противоречия используется следующая хитрость. Во временном окне 20 кадров определяется, находится ли камера в стабильном состоянии. Для этого мы накапливаем кадры в двухсторонней очереди (ура, вставка слева и справа за О(1)), усредняем кадр и проверяем насколько он отличается от текущего используя Structural similarity index. Если кадр стабилен, то, скорее всего, пользователь навелся на объект интереса (или уснул) и можно запускать распознавание. Решение второй проблемы пока на самом деле в процессе... Есть идеи, как и для определения стабильности, мы можем во временном окне хранить какую-то характеристику контура (например его центр). Если контур с центром в такой точке пропадает на какое-то время, то мы его "забываем", но если контур у нас в памяти уже был "распознан" ранее, то для него мы распознавание не делаем. Такой подход костылен, но позволяет и не сканить одно и то же миллион раз и не ограничиваться эвристикой "второй такой карты нам на распознавание уже не придёт". Однозначно этот момент надо доработать в будущем Я не хотел разрабатывать мобильное приложение, потому что я не мобильный разработчик и не знаю в достаточной мере, например, котлина, а писать мобильное приложение на питоне, как мне кажется, это бред. Плюс ко всему, как-то завести эту нейронную сеть на мобильнике... В теории должно получиться, но для домашнего использования и для "разработки ради фана" это уже перебор... Решил, что для домашних тестов пока соберу какое-то решение на веб-оболочке, а телефон буду использовать только как "снималку". Не без помощи чатгпт накидал html файлик для Flask, и как-то постарался упаковать это всё по файлам. Получилось откровенно так себе, и мне самому плохо с того как выглядит код. Но в целом пример того как могло бы работать такое решение выглядит вот так: Можно распознавать карты по одной или сразу "скопом", но чем больше карт на одном фото тем сложнее будет нейросети разобраться, так как объекты на фото становятся "меньше". Умеем определять карту как по лицу, так и по обратной стороне если она двухсторонняя. Пока временно для демонстрации результат распознавания выводится в таблицу. Скорость показана для запуска нейронной сети локально на "домашней" видеокарте. А еще на первой гифке если внимательно посмотреть то видно, что карты могут распознаться неверно) В коде на фласке я уверен еще куча багов, поскольку это мой первый проект, где я пытаюсь разобраться с тем, как работает многопоточность в питоне, но он тоже в репозитории лежит и там написано как его запускать. В общем, про +-позитивные вещи поговорили, теперь про проблемы и как их в теории фиксить. Какие есть потенциальные проблемы, и что можно улучшить: Так как на некоторые карты на "экзотических" языках у нас нет эмбеддингов (потому что нет картинок в базе) - сеть с высокой вероятностью будет выдавать для таких карт какую-то чушь. Решений тут несколько: либо где-то искать хайрез сканы всех оставшихся карт, либо придумывать как распознавать карту не по ее скану целиком, а, например, по арту - искать карту и, возможно, сет, а по текстбоксу и языку на нем - уточнять локализацию и сет. Но с огромной кучей промок, текстлесс карт и прочего у меня нет 100% идеи как эту штуку реализовать так, чтобы ничего не сломалось в процессе. А еще сеть иногда версии китайских языков путает... При использовании на актуальных сетах последних лет - такой проблемы скорее всего нет, но иногда все еще встречаются "галлюцинации" Распознавание хорошо работает только с контрастными картами на светлом фоне как минимум пока. В теории, я думаю, я смогу допилить гиперпараметры таким образом, чтобы алгоритм справлялся и с темным/пестрым фоном, но для этого надо много экспериментировать. Другим решением здесь может быть использование нейронок для поиска карт, но это повлияет на скорость. Планирую дальше экспериментировать с этим. Что планирую делать дальше Подключать к этому делу какую-нибудь БД или хотя-бы эксель файлик, чтобы помаленьку заполнять информацию по своей цифровой коллекции. Дальше уже по ней можно будет парсить цены да хоть с аукционов топдека (Дядя Вова не бань) и потом сделать автоформирование торговой темы. Заготовки на это дело есть и, если не заброшу, позже сгружу их в репозиторий Расширить файл с метаданными по картам, поскольку сейчас там хранится только основное для тестов: имя, номер, сет, язык и сторона (для двухсторонних карт) Тестировать, модернизировать, тестировать, тестировать, тестировать ну и далее вы поняли... Желательно развернуть решение где-нибудь локально, чтобы не приходилось каждый раз запускать его вручную. Резюмируя... Да не знаю на самом деле, что можно сказать. Было весело, было, наверное, полезно и интересно. Если вас проект заинтересовал - буду рад ответить на вопросы. Если хочется помочь/поддержать - копируйте, модернизируйте, все материалы в открытом доступе и я буду ужасно благодарен, если получу обратную связь. Инструкции по запуску можно найти в репозитории. Понимаю, что для не программистов там черт ногу сломит, ну, извините) Постараюсь исправить в будущем. Взрослых сеньоров-помидоров прошу если будут бить ногами, то хотя бы не по лицу, я еще в процессе того, чтобы научиться писать хороший продуктовый код)
  12. Едхшники: не могут договориться между собой как играть в их любимый формат на протяжении N лет ВОТКи: определяют, как играть в их любимый формат Едхшники:
×
×
  • Создать...