Мем

Meme Iceberg exchange rate AHAHAHAhahAHAH

Что уже есть

4 sides

Мы нашли стороны каждого куска пазла, причем они обходятся по часовой стрелке.

Извлекаем визуальное описание каждой стороны

Чтобы сравнить две стороны - нужно из каждой стороны извлечь ее текстуру - ее цвета пикселей, это будет ее визуальным описанием (descriptor).

Любопытно что чаще всего в фотограмметрии (область компьютерного зрения) дескриптором называют описание ключевой точки:

Keypoint descriptor

При этом если мы сравним два таких набора (синий и фиолетовый) - все ли будет хорошо?

4 sides

Учитывая обход по часовой стрелке - нужно не забыть инвертировать в обратном порядке вторую сторону с которой сейчас сравниваемся.

Как-то нужно сравнить две стороны

Без отладочной визуализации - как блуждать в потемках! Ни к чему хорошему мы не придем!

Подумайте, что бы вы хотели с ходу понимать? Что бы вы хотели с ходу увидеть? Какие данные?

Поэтому:

Two sides comparison debug visualization

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

Какие есть риски? Может ли это не сработать почему-то? А число пикселей (а значит и цветов) сторон вообще совпадает?

А что если одна из сторон ярче другой на константу?

Практика

Пред-задание Обновите свой fork репозиторий, убедитесь что у вас все компилируется, запустите юнит-тесты All CTest:

Run All CTest

Пред-задание Запустите CVPuzzleSolver (выбрав сверху его вместо All CTest) - проверьте что результаты в debug вам нравятся и все хорошо работает. Что строятся графики сопоставляемых сторон. Что в папке /data/ появились новые картинки.

Задание 0 Поищите - где в коде нужно обратить в обратном направлении список цветов второй стороны с которой мы проводим сравнение? Проверьте что там все сделано правильно.

Задание 1 TODO 1 Посмотрите на RGB графики тех сторон у которых нет и не может быть соседей, то есть у белых полос.

Задание 2 TODO 2 Посмотрите на графики и подумайте, может имеет смысл как-то воздействовать на снятые с границы цвета? Какой у нас вообще критерий “что такое хорошая метрика отличия сторон”? Мы хотим чтобы лучшим было правильное соответствие! А чтобы было не просто правильно - а правильно с большим запасом - хотим еще чтобы второй лучший (был шанс что он случайно победит и ответ стал бы не верным) - как можно сильнее отставал от первого. Не запрещено и даже приветствуется консультация с ChatGPT, можете даже код с ее помощью генерить, главное контролируйте что она написала, и старайтесь узнавать идеи - какие есть варианты метрик? Чем они отличаются? А какая решит такую-то конкретную проблему что я вижу на графиках?

Задание 3 TODO 3 Реализуйте какую-то метрику сравнивающую насколько два соответствующие цвета colA и colB отличаются. Посмотрите на графики - нравится ли как выглядит график для правильной пары сторон (маленькие числа)? А для неправильной пары сторон (большие числа)?

Задание 4 TODO 4 Объедините метрики различности попиксельные в единое число - насколько похожи эти две стороны.

Задание 5 Руководствуясь визуализациями, в т.ч. всего графа с лучшими соответствиями, и руководствуясь выводом в конце лога числа верных-неверных ответов - попробуйте улучшить реализацию. Ищите самую сильно обидную ошибку (где по графикам цветов все кажется должно было бы сработать легко) - и улучшайте способ обсчета чтобы он сделал все правильно.

Задание 6 Если есть желание (особенно если хорошо работает) - можно сфотографировать свой датасет, я взял с собой черный холст-фон (футболку, кек), целые картинки-“пазлы” и ножницы.

К следующему занятию

Задание 7 Попробуйте улучшить как можно лучше! Не стесняйтесь делиться в чате результатами, и идеями которые позволили вам получить улучшение, это очень любопытно!

Задание 8 Подумайте, если у нас все пары правилно сопоставлены - то что нам теперь осталось сделать? Как это можно попробовать реализовать?