Skip to content

Task02 Syrma Timur ITMO#133

Closed
timursyrma wants to merge 2 commits into
PhotogrammetryCourse:task02from
timursyrma:task02
Closed

Task02 Syrma Timur ITMO#133
timursyrma wants to merge 2 commits into
PhotogrammetryCourse:task02from
timursyrma:task02

Conversation

@timursyrma

@timursyrma timursyrma commented Apr 25, 2026

Copy link
Copy Markdown

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

1)

Ratio test и cluster filter нужны, потому что RANSAC работает только если правильных матчей хватает. При 90% шума вероятность случайно набрать 4 правильные точки за 500 попыток почти нулевая: (0.1)^4 ≈ 0.0001, нужно 50 000 итераций. После фильтрации доля правильных поднимается до 90%+, и хватает десятков. Плюс каждая итерация RANSAC проверяет гипотезу на всех матчах, так что меньше матчей = быстрее.

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

2)

Cluster filter требует плотного облака правильных матчей. При сильном изменении масштаба или малом перекрытии правильных мало, они разреженны, у каждого не набирается 4 согласованных соседей — фильтр выметает их вместе с шумом. Ratio test здесь работает, потому что смотрит только на сам дескриптор.

Обратная ситуация: повторяющаяся текстура (забор, кирпичная кладка). Дескриптор похож на десятки точек с почти одинаковым расстоянием, ratio test такое пропускает (отношение ≈ 1). Cluster filter может это отсечь как геометрически несогласованное.

3)

Матрица гомографии определена с точностью до масштаба, зафиксировать можно любой ненулевой элемент. Проблема в том, что для некоторых конфигураций H33 → 0 — нормировка даёт деление на маленькое число, результат нестабилен. Решение — SVD: решать Ah = 0 с ||h|| = 1 без предположений о конкретных элементах. Плюс SVD сразу даёт решение наименьших квадратов для избыточной системы N > 4 точек.

4)

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

Для ортофото это серьёзно: метрическая корректность нарушается. Правильный путь — bundle adjustment, оптимизация всех гомографий одновременно, а не последовательно.

Ещё один момент: гомографии предполагают плоскую сцену. Если снимается 3D-объект (здание, рельеф), одна гомография не описывает совмещение правильно — это уже не ошибка накопления, а принципиальное ограничение.

5)

Перебирать все N*(N-1)/2 пар дорого. Обычно делают так: каждое изображение сворачивают в глобальный дескриптор (VLAD, BoVW, NetVLAD), строят ANN-индекс и для каждой картинки находят K ближайших соседей. Полный матчинг с RANSAC делают только для них. Из пар с достаточным числом инлаеров строят граф и берут максимальное остовное дерево. Корень — картинка с наибольшей суммой инлаеров по рёбрам, обычно это самая центральная в сцене.

6)

SIFT прошёл все 25 тестов.

7)

Больше всего понравилась часть с гомографией — DLT, RANSAC, уточнение по инлаерам вместе дают ощущение законченного алгоритма. Cluster filter оказался неожиданно интересным: сначала казалось, что ratio test достаточно, но потом стало понятно, почему геометрическая согласованность нужна отдельно.

Неочевидный момент, на котором потерял время: FLANN возвращает квадраты расстояний, а не расстояния. Нигде явно не написано. Было бы полезно добавить комментарий к TODO ratio test.

Github Actions CI

[==========] Running 20 tests from 2 test suites.
[----------] 18 tests from MATCHING
[       OK ] MATCHING.SimpleStitching (1540 ms)
[       OK ] MATCHING.SimpleMatching (24618 ms)
[       OK ] MATCHING.Rotate10 (2455 ms)
[       OK ] MATCHING.Rotate20 (2452 ms)
[       OK ] MATCHING.Rotate30 (2450 ms)
[       OK ] MATCHING.Rotate40 (2449 ms)
[       OK ] MATCHING.Rotate45 (2467 ms)
[       OK ] MATCHING.Rotate90 (2315 ms)
[       OK ] MATCHING.Scale50 (1263 ms)
[       OK ] MATCHING.Scale70 (1593 ms)
[       OK ] MATCHING.Scale90 (2131 ms)
[       OK ] MATCHING.Scale110 (2690 ms)
[       OK ] MATCHING.Scale130 (3603 ms)
[       OK ] MATCHING.Scale150 (4759 ms)
[       OK ] MATCHING.Scale175 (6297 ms)
[       OK ] MATCHING.Scale200 (7315 ms)
[       OK ] MATCHING.Rotate10Scale90 (2272 ms)
[       OK ] MATCHING.Rotate30Scale75 (1781 ms)
[----------] 18 tests from MATCHING (74451 ms total)

[----------] 2 tests from STITCHING
[       OK ] STITCHING.SimplePanorama (358 ms)
[       OK ] STITCHING.Orthophoto (12483 ms)
[----------] 2 tests from STITCHING (12841 ms total)

[==========] 20 tests from 2 test suites ran. (87292 ms total)
[  PASSED  ] 20 tests.

@simiyutin

Copy link
Copy Markdown
Contributor

Дескриптор похож на десятки точек с почти одинаковым расстоянием, ratio test такое пропускает (отношение ≈ 1).

как раз таки такое он и не пропускает, потому что требует чтобы второе соответствие было заметно хуже и множитель заметно меньше единицы)

@simiyutin

Copy link
Copy Markdown
Contributor

FLANN возвращает квадраты расстояний, а не расстояния. Нигде явно не написано. Было бы полезно добавить комментарий к TODO ratio test.

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

@simiyutin

Copy link
Copy Markdown
Contributor

Задача зачтена, (8 + 1 + 3 - 2) 10/8 баллов 👍

@simiyutin simiyutin closed this May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants