Skip to content

Task01 Роберт Смайт СПбГУ#2

Open
RSMT98 wants to merge 3 commits intoPhotogrammetryCourse:task01from
RSMT98:task01
Open

Task01 Роберт Смайт СПбГУ#2
RSMT98 wants to merge 3 commits intoPhotogrammetryCourse:task01from
RSMT98:task01

Conversation

@RSMT98
Copy link

@RSMT98 RSMT98 commented Feb 24, 2026

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

  1. Почему SIFT менее точно угадывает средний угол отклонения? изменяется ли ситуация если выкрутить параметр ORIENTATION_VOTES_PEAK_RATIO=0.999? почему?

Давайте начнём с конца: сначала выкрутим параметр ORIENTATION_VOTES_PEAK_RATIO=0.999, а потом будем думать, из-за чего получился тот или иной результат.
Но вот блин.. ну выкрутим мы этот параметр, откуда нам знать, что полученный результат зависит только от значения ORIENTATION_VOTES_PEAK_RATIO, а не от всей нашей реализации SIFT?
Поэтому я предлагаю пересобрать OpenCV, заменив значение этого параметра на 0.999.

Прогнав тесты с этим значением (логи), можно увидеть, что ситуация действительно изменилась - причём в лучшую сторону. По угловым тестам (Rotate*, RotateScale и HerzJesu19RotateM40) средняя абсолютная ошибка угла снизилась примерно с 18.66° до 5.77° (уж сорян, но тут я принял волевое решение скормить логи гпт🥺).
Итого, как мы поняли, то, что SIFT менее точно угадывает средний угол отклонения, как-то зависит от тех ситуаций, когда SIFT дублирует ключевую точку с разными пиками ориентациями (а выкрутив ORIENTATION_VOTES_PEAK_RATIO=0.999 мы почти гарантированно избавились от такого дублирования). My guess следующий.. объясню на примере.
Имеем ключевую точку на исходной картинке с пиками ориентаций 10° и 40°. После поворота на 90° на получившейся картинке находим согласованную точку, но так получилось, что у неё лишь один пик ориентации: 130°. И вместо того, чтобы сматчить 40° и 130°, мы сматчили одновременно и 10° и 130°, и 40° и 130°, тем самым увеличив среднюю абсолютную ошибку угла отклонения.
Но тут меня посетила чуйка, что как будто бы проблема вообще не в SIFT-е, а в том как мы матчим точки в тестах..

Я провёл ещё один эксперимент: я подредачил код тестов, добавив туда дефайн-флаг USE_DESCRIPTOR_MATCHING_FOR_ANGLE_DIFF, при включении которого матчинг происходит не по ближайшей точке на искажённом изображении в геометрическом смысле (евклидово расстояние между точками), а берутся все точки, которые проходят геометрический порог error <= MAX_ACCEPTED_PIXEL_ERROR * width (тут), и уже из них в качестве матча берётся точка, которая наиболее близка "по дескриптору" (по L2-норме для SIFT и по Хэммингу для ORB).

Прогнав тесты с включенным USE_DESCRIPTOR_MATCHING_FOR_ANGLE_DIFF (логи), по угловым тестам средняя абсолютная ошибка угла для SIFT снизилась примерно с 18.66° до 6.22°. Кстати, для ORB она тоже снизилась: c 3.65° до 2.09°.
Так что да, то, как мы матчим точки, действительно играет не последнюю роль в том, что SIFT менее точно угадывает средний угол отклонения... но...

Как видно, что с отключенным дублированием точек с разными пиками ориентации, что с изменённой логикой матчинга, ORB всё равно угадывает угол отклонения лучше SIFT. Почему? Полагаю потому, что ORB в принципе заточен на нахождение углов в качестве ключевых точек. А у углов ориентация чаще однозначнее, чем у "пятен", которые в свою очередь может находить SIFT как ключевые точки. А у пятен же может быть почти круглая структура, у которой направление пика ориентации не так очевидно. Отсюда и возникает шум, которые увеличивает среднюю ошибку угла отклонения.

  1. Как надежно замерить во сколько раз распараллеливание через OpenMP ускоряет ваш вариант SIFT? Попробуйте сделать это на вашем компьютере, какое ускорение относительно однопоточной версии оказалось? Сколько у вашего процессора ядер и сколько потоков?

Тут я не понял, что от меня хотят🥴
По заданию в саму реализацию нашего SIFT вроде как не требовалось использовать где-либо OMP.
OMP используется лишь в тестах, причём только в функции evaluateDetection(), что забавно, ибо в тестах логируется время, потраченное на детекцию.. но OMP используется уже после замера этого времени))
Т.е. если подразумевалось, что здесь нужно ответить на вопрос, как надежно замерить, как OMP ускоряет evaluateDetection(), то придётся писать какой-то свой скрипт для замера.
Для надёжности применяются стандартные требования для устойчивых бенчмарков: один и тот же вход; один и тот же набор тестов; warmup прогоны; прогонять несколько раз и брать медиану и/или среднее; стараться во время бенчмарка не иметь в фоне тяжёлых запущенных задач.
Число потоков вроде фиксируется параметром OMP_NUM_THREADS, в который нужно положить либо 1, либо nproc, в зависимости от того, какую версию тестируем на данный момент.
Также полезны параметры OMP_PROC_BIND=true и OMP_PLACES=cores, которые позволяют закрепить потоки по ядрам, что также повышает надёжность бенчмарка, т.к. устраняются артефакты миграции потоков по ядрам.
И если действительно подразумевалось замерить именно OMP в тестах... ну... я замерил... командой time... никакого ускорения от OMP не заметил от слова совсем👀
У меня 6 ядер и 6 потоков, btw🙃

  1. Правда ли можно строить каждый слой в Gaussian пирамиде из самого первого слоя этой октавы? Или нужно обязательно делать так как предложено в статье - дополняя размытие предыдущего слоя этой октавы? Совпадают ли пирамиды визуально?

Правда. Эти два способа эквивалентны математически по свойству Гауссиана.
Визуально пирамиды Гауссиана совпадают. Но совпадения пиксель-в-пиксель не гарантируется, ввиду ошибок округления и аппроксимиромации, связанной с тем, что по математике Гауссиан бесконечный (ненулевой везде), а все картинки, очевидно, состоят из конечного числа пикселей, поэтому веса, далёкие от колокола, выкидывают, а оставшиеся - нормируют. Все эти ошибки агрегируются при повторных проходах, из-за чего получается не идентичный результат...
... но я вот чёта нифига никакой визуальной разницы не вижу🙃 (можете сами глянуть тут и тут).

  1. Какие ожидания от картинок в Gaussian пирамиде можно придумать? Как проверить что работает корректно? С какой другой картинкой предыдущей октавы должна визуально совпадать конкретная картинка конкретной октавы? Как их визуально сравнить, ведь они разного размера?

Ну.. ожидаем, что каждый новый слой (в рамках одной октавы, по крайней мере) - это чуть более размытая версия предыдущего слоя :) Причём меняться должна только и только степень размытости. Если вдруг, какой-то слой выглядит резче предыдущего из той же октавы, это баг, и что-то работает некорректно.
Также можно посмотреть на картинки из разных октав, которые должны выглядеть одинаково, ибо каждая следующая октава строится из определённого слоя предыдущей октавы. Конкретно в нашем случае, можно посмотреть на пару картинок octave_{i}_layer_{j} и octave_{i-1}_layer_{j+3}, и они должны выглядеть практически идентично по модулю очень-очень небольшого сдвига, связанного с тем, что функция savePyramid() делает апскейл, который позволяет нам удобно сравнивать картинки разного размера, а upscale делает линейную интерполяцию, но downscale-им мы, используя downsample2x, а не downsample2x_avg, а (слишком много "а", да?) downsample2x, в свою очередь, просто берёт каждый второй пиксель без всякой интерполяции.
Ну а ещё я понял, что я уже неявно ответил на последние два вопроса🙃

  1. Почему в октаве Gaussian пирамиды s+3 картинки а не s+2 например?

Мы хотим s DoG слоёв для поиска экстремумов. Ищем мы экстремумы в 3D, значит, нам нужны ещё два "мнимых" дополнительных слоя сверху и снизу, иначе у верхнего "полезного" слоя не будет "потолка", а у нижнего - не будет "пола". Но DoG слои - это разности слоёв Гауссиана. Если мы хотим s+2 разностей, значит нам нужно s+3 слоёв, из которых эти разности будут получаться.

  1. Какие ожидания от картинок в DoG пирамиде можно придумать?

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

  1. Почему порог контрастности должен уменьшаться при увеличении числа слоев в октаве?

Потому что чем больше слоёв, тем более похожими будут соседние слои Гауссиана, а значит, DoG будет более однотонным, а значит, экстремумы по своему значению будут меньше, чем экстремумы, которые бы были в этом DoG при меньшем количестве слоёв, а значит без уменьшения порога контрастности, увеличив число слоёв слишком сильно, DoG может оказаться настолько однотонным, что мы выкинем по порогу почти все точки. Поэтому порог и уменьшают обратно пропорционально кол-ву слоёв.

  1. Какая строка ответственна за определение сигмы (или что почти то же самое - радиуса) которая задает окрестность по которой определяется ориентация ключевой точки?

строка 403: float sigma_win = 1.5f * kp_sigma_octave;

  1. За какой строки вашего кода дескриптор инвариантен к повороту картинки?

строка 606: float angle_invariant = angle - kp_angle_rad;

Github Actions CI

Running main() from /home/runner/work/PhotogrammetryTasks2026/PhotogrammetryTasks2026/libs/3rdparty/libgtest/googletest/src/gtest_main.cc
[==========] Running 25 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 25 tests from SIFT
[ RUN      ] SIFT.MovedTheSameImage
[ORB_OCV] Points detected: 500 -> 500 (in 0.010819 sec)
[ORB_OCV] 493/500 (recall=0.986) with average error=0.0520289
[ORB_OCV] average size ratio between matched points: 1.00185
[ORB_OCV] average angle difference between matched points: 0.145135 degrees
[ORB_OCV] average descriptor distance between matched points: 8.8073 (random distance: 127.325) => differentiability=0.0691721
[SIFTOCV] Points detected: 453 -> 465 (in 0.085971 sec)
[SIFTOCV] 436/453 (recall=0.962472) with average error=0.0435686
[SIFTOCV] average size ratio between matched points: 0.998252
[SIFTOCV] average angle difference between matched points: -4.7478 degrees
[SIFTOCV] average descriptor distance between matched points: 90.3355 (random distance: 523.008) => differentiability=0.172723
[SIFT_MY] Points detected: 424 -> 440 (in 0.168944 sec)
[SIFT_MY] 408/424 (recall=0.962264) with average error=0.0457224
[SIFT_MY] average size ratio between matched points: 0.997958
[SIFT_MY] average angle difference between matched points: -6.4175 degrees
[SIFT_MY] average descriptor distance between matched points: 0.159853 (random distance: 1.02301) => differentiability=0.156258
[       OK ] SIFT.MovedTheSameImage (338 ms)
[ RUN      ] SIFT.MovedImageRight
[ORB_OCV] Points detected: 500 -> 500 (in 0.009213 sec)
[ORB_OCV] 471/500 (recall=0.942) with average error=0.502929
[ORB_OCV] average size ratio between matched points: 0.992385
[ORB_OCV] average angle difference between matched points: -0.67963 degrees
[ORB_OCV] average descriptor distance between matched points: 31.7219 (random distance: 127.724) => differentiability=0.248363
[SIFTOCV] Points detected: 453 -> 447 (in 0.075628 sec)
[SIFTOCV] 421/442 (recall=0.952489) with average error=0.107924
[SIFTOCV] average size ratio between matched points: 1.01134
[SIFTOCV] average angle difference between matched points: -3.58242 degrees
[SIFTOCV] average descriptor distance between matched points: 90.1555 (random distance: 527.86) => differentiability=0.170794
[SIFT_MY] Points detected: 424 -> 429 (in 0.167797 sec)
[SIFT_MY] 399/422 (recall=0.945498) with average error=0.11273
[SIFT_MY] average size ratio between matched points: 1.00791
[SIFT_MY] average angle difference between matched points: -6.20512 degrees
[SIFT_MY] average descriptor distance between matched points: 0.171172 (random distance: 1.00816) => differentiability=0.169786
[       OK ] SIFT.MovedImageRight (325 ms)
[ RUN      ] SIFT.MovedImageLeft
[ORB_OCV] Points detected: 500 -> 500 (in 0.008892 sec)
[ORB_OCV] 466/498 (recall=0.935743) with average error=0.485198
[ORB_OCV] average size ratio between matched points: 1.0061
[ORB_OCV] average angle difference between matched points: -2.01597 degrees
[ORB_OCV] average descriptor distance between matched points: 30.279 (random distance: 126.457) => differentiability=0.239441
[SIFTOCV] Points detected: 453 -> 447 (in 0.086681 sec)
[SIFTOCV] 417/441 (recall=0.945578) with average error=0.0855277
[SIFTOCV] average size ratio between matched points: 0.997577
[SIFTOCV] average angle difference between matched points: -6.43682 degrees
[SIFTOCV] average descriptor distance between matched points: 97.5722 (random distance: 523.97) => differentiability=0.186217
[SIFT_MY] Points detected: 424 -> 422 (in 0.16059 sec)
[SIFT_MY] 391/417 (recall=0.93765) with average error=0.0654435
[SIFT_MY] average size ratio between matched points: 0.998206
[SIFT_MY] average angle difference between matched points: -6.39811 degrees
[SIFT_MY] average descriptor distance between matched points: 0.16641 (random distance: 1.01829) => differentiability=0.163421
[       OK ] SIFT.MovedImageLeft (327 ms)
[ RUN      ] SIFT.MovedImageUpHalfPixel
[ORB_OCV] Points detected: 500 -> 500 (in 0.008788 sec)
[ORB_OCV] 460/497 (recall=0.925553) with average error=0.710802
[ORB_OCV] average size ratio between matched points: 1.01167
[ORB_OCV] average angle difference between matched points: 0.857323 degrees
[ORB_OCV] average descriptor distance between matched points: 42.9087 (random distance: 123.602) => differentiability=0.347152
[SIFTOCV] Points detected: 453 -> 500 (in 0.081471 sec)
[SIFTOCV] 367/445 (recall=0.824719) with average error=0.398716
[SIFTOCV] average size ratio between matched points: 1.0449
[SIFTOCV] average angle difference between matched points: 0.114179 degrees
[SIFTOCV] average descriptor distance between matched points: 152.166 (random distance: 530.014) => differentiability=0.287097
[SIFT_MY] Points detected: 424 -> 488 (in 0.1736 sec)
[SIFT_MY] 356/420 (recall=0.847619) with average error=0.387394
[SIFT_MY] average size ratio between matched points: 1.04654
[SIFT_MY] average angle difference between matched points: -7.16037 degrees
[SIFT_MY] average descriptor distance between matched points: 0.283155 (random distance: 1.01774) => differentiability=0.278219
[       OK ] SIFT.MovedImageUpHalfPixel (336 ms)
[ RUN      ] SIFT.MovedImageDownHalfPixel
[ORB_OCV] Points detected: 500 -> 500 (in 0.008777 sec)
[ORB_OCV] 442/478 (recall=0.924686) with average error=0.648609
[ORB_OCV] average size ratio between matched points: 0.971097
[ORB_OCV] average angle difference between matched points: -1.00358 degrees
[ORB_OCV] average descriptor distance between matched points: 42.586 (random distance: 125.477) => differentiability=0.339392
[SIFTOCV] Points detected: 453 -> 500 (in 0.080709 sec)
[SIFTOCV] 374/439 (recall=0.851936) with average error=0.445461
[SIFTOCV] average size ratio between matched points: 1.05024
[SIFTOCV] average angle difference between matched points: 0.589903 degrees
[SIFTOCV] average descriptor distance between matched points: 165.511 (random distance: 529.613) => differentiability=0.312513
[SIFT_MY] Points detected: 424 -> 473 (in 0.173034 sec)
[SIFT_MY] 352/417 (recall=0.844125) with average error=0.43483
[SIFT_MY] average size ratio between matched points: 1.04888
[SIFT_MY] average angle difference between matched points: -6.80438 degrees
[SIFT_MY] average descriptor distance between matched points: 0.302065 (random distance: 1.02274) => differentiability=0.295349
[       OK ] SIFT.MovedImageDownHalfPixel (332 ms)
[ RUN      ] SIFT.Rotate10
[ORB_OCV] Points detected: 500 -> 500 (in 0.008963 sec)
[ORB_OCV] 475/500 (recall=0.95) with average error=0.932881
[ORB_OCV] average size ratio between matched points: 1.00527
[ORB_OCV] average angle difference between matched points: 8.46336 degrees
[ORB_OCV] average descriptor distance between matched points: 56.6295 (random distance: 122.783) => differentiability=0.461215
[SIFTOCV] Points detected: 453 -> 500 (in 0.077778 sec)
[SIFTOCV] 350/451 (recall=0.776053) with average error=0.501799
[SIFTOCV] average size ratio between matched points: 1.03657
[SIFTOCV] average angle difference between matched points: 6.5729 degrees
[SIFTOCV] average descriptor distance between matched points: 178.858 (random distance: 521.738) => differentiability=0.342812
[SIFT_MY] Points detected: 424 -> 500 (in 0.169167 sec)
[SIFT_MY] 348/424 (recall=0.820755) with average error=0.483214
[SIFT_MY] average size ratio between matched points: 1.04176
[SIFT_MY] average angle difference between matched points: -4.03078 degrees
[SIFT_MY] average descriptor distance between matched points: 0.328258 (random distance: 1.03124) => differentiability=0.318313
[       OK ] SIFT.Rotate10 (326 ms)
[ RUN      ] SIFT.Rotate20
[ORB_OCV] Points detected: 500 -> 500 (in 0.009795 sec)
[ORB_OCV] 456/491 (recall=0.928717) with average error=0.860867
[ORB_OCV] average size ratio between matched points: 0.968872
[ORB_OCV] average angle difference between matched points: 19.4252 degrees
[ORB_OCV] average descriptor distance between matched points: 58.3224 (random distance: 125.59) => differentiability=0.464387
[SIFTOCV] Points detected: 453 -> 500 (in 0.078004 sec)
[SIFTOCV] 337/443 (recall=0.760722) with average error=0.556804
[SIFTOCV] average size ratio between matched points: 1.04965
[SIFTOCV] average angle difference between matched points: 1.4678 degrees
[SIFTOCV] average descriptor distance between matched points: 186.303 (random distance: 531.487) => differentiability=0.350531
[SIFT_MY] Points detected: 424 -> 500 (in 0.17067 sec)
[SIFT_MY] 329/417 (recall=0.788969) with average error=0.52248
[SIFT_MY] average size ratio between matched points: 1.05732
[SIFT_MY] average angle difference between matched points: 0.530193 degrees
[SIFT_MY] average descriptor distance between matched points: 0.340719 (random distance: 1.0353) => differentiability=0.329101
[       OK ] SIFT.Rotate20 (335 ms)
[ RUN      ] SIFT.Rotate30
[ORB_OCV] Points detected: 500 -> 500 (in 0.009217 sec)
[ORB_OCV] 446/479 (recall=0.931106) with average error=0.954674
[ORB_OCV] average size ratio between matched points: 0.971588
[ORB_OCV] average angle difference between matched points: 25.313 degrees
[ORB_OCV] average descriptor distance between matched points: 56.7668 (random distance: 125.177) => differentiability=0.453492
[SIFTOCV] Points detected: 453 -> 500 (in 0.081982 sec)
[SIFTOCV] 356/441 (recall=0.807256) with average error=0.635313
[SIFTOCV] average size ratio between matched points: 1.04861
[SIFTOCV] average angle difference between matched points: 9.58379 degrees
[SIFTOCV] average descriptor distance between matched points: 194.029 (random distance: 529.795) => differentiability=0.366233
[SIFT_MY] Points detected: 424 -> 476 (in 0.173584 sec)
[SIFT_MY] 335/416 (recall=0.805288) with average error=0.614676
[SIFT_MY] average size ratio between matched points: 1.04884
[SIFT_MY] average angle difference between matched points: 10.3163 degrees
[SIFT_MY] average descriptor distance between matched points: 0.339755 (random distance: 1.01224) => differentiability=0.335646
[       OK ] SIFT.Rotate30 (336 ms)
[ RUN      ] SIFT.Rotate40
[ORB_OCV] Points detected: 500 -> 500 (in 0.009251 sec)
[ORB_OCV] 445/475 (recall=0.936842) with average error=0.927974
[ORB_OCV] average size ratio between matched points: 0.992927
[ORB_OCV] average angle difference between matched points: 35.1473 degrees
[ORB_OCV] average descriptor distance between matched points: 57.0315 (random distance: 125.292) => differentiability=0.455188
[SIFTOCV] Points detected: 453 -> 470 (in 0.077487 sec)
[SIFTOCV] 335/436 (recall=0.768349) with average error=0.722947
[SIFTOCV] average size ratio between matched points: 1.07134
[SIFTOCV] average angle difference between matched points: 12.1292 degrees
[SIFTOCV] average descriptor distance between matched points: 189.937 (random distance: 524.78) => differentiability=0.361937
[SIFT_MY] Points detected: 424 -> 447 (in 0.171334 sec)
[SIFT_MY] 317/412 (recall=0.769417) with average error=0.716163
[SIFT_MY] average size ratio between matched points: 1.07368
[SIFT_MY] average angle difference between matched points: 17.7504 degrees
[SIFT_MY] average descriptor distance between matched points: 0.344266 (random distance: 1.02665) => differentiability=0.335329
[       OK ] SIFT.Rotate40 (329 ms)
[ RUN      ] SIFT.Rotate45
[ORB_OCV] Points detected: 500 -> 500 (in 0.010684 sec)
[ORB_OCV] 427/475 (recall=0.898947) with average error=0.913293
[ORB_OCV] average size ratio between matched points: 0.999695
[ORB_OCV] average angle difference between matched points: 40.7936 degrees
[ORB_OCV] average descriptor distance between matched points: 57.0351 (random distance: 126.834) => differentiability=0.449684
[SIFTOCV] Points detected: 453 -> 500 (in 0.079784 sec)
[SIFTOCV] 344/431 (recall=0.798144) with average error=0.735095
[SIFTOCV] average size ratio between matched points: 1.04736
[SIFTOCV] average angle difference between matched points: 25.7374 degrees
[SIFTOCV] average descriptor distance between matched points: 189.73 (random distance: 526.815) => differentiability=0.360145
[SIFT_MY] Points detected: 424 -> 499 (in 0.170864 sec)
[SIFT_MY] 330/408 (recall=0.808824) with average error=0.695523
[SIFT_MY] average size ratio between matched points: 1.05825
[SIFT_MY] average angle difference between matched points: 25.6375 degrees
[SIFT_MY] average descriptor distance between matched points: 0.341037 (random distance: 1.02373) => differentiability=0.333133
[       OK ] SIFT.Rotate45 (332 ms)
[ RUN      ] SIFT.Rotate90
[ORB_OCV] Points detected: 500 -> 500 (in 0.008718 sec)
[ORB_OCV] 406/475 (recall=0.854737) with average error=0.794018
[ORB_OCV] average size ratio between matched points: 0.926186
[ORB_OCV] average angle difference between matched points: 81.2045 degrees
[ORB_OCV] average descriptor distance between matched points: 52.2069 (random distance: 126.239) => differentiability=0.413556
[SIFTOCV] Points detected: 453 -> 429 (in 0.077308 sec)
[SIFTOCV] 397/428 (recall=0.92757) with average error=0.597669
[SIFTOCV] average size ratio between matched points: 0.994223
[SIFTOCV] average angle difference between matched points: 68.2509 degrees
[SIFTOCV] average descriptor distance between matched points: 109.39 (random distance: 522.253) => differentiability=0.209459
[SIFT_MY] Points detected: 424 -> 410 (in 0.15834 sec)
[SIFT_MY] 372/410 (recall=0.907317) with average error=0.60056
[SIFT_MY] average size ratio between matched points: 0.995118
[SIFT_MY] average angle difference between matched points: 71.3043 degrees
[SIFT_MY] average descriptor distance between matched points: 0.188306 (random distance: 1.01329) => differentiability=0.185836
[       OK ] SIFT.Rotate90 (314 ms)
[ RUN      ] SIFT.Scale50
[ORB_OCV] Points detected: 500 -> 500 (in 0.00837 sec)
[ORB_OCV] 463/500 (recall=0.926) with average error=0.927987
[ORB_OCV] average size ratio between matched points: 0.829127
[ORB_OCV] average angle difference between matched points: 2.9143 degrees
[ORB_OCV] average descriptor distance between matched points: 89.7322 (random distance: 124.84) => differentiability=0.718776
[SIFTOCV] Points detected: 453 -> 191 (in 0.07489 sec)
[SIFTOCV] 235/453 (recall=0.518764) with average error=1.81213
[SIFTOCV] average size ratio between matched points: 0.90594
[SIFTOCV] average angle difference between matched points: -0.218442 degrees
[SIFTOCV] average descriptor distance between matched points: 362.817 (random distance: 526.31) => differentiability=0.68936
[SIFT_MY] Points detected: 424 -> 187 (in 0.131263 sec)
[SIFT_MY] 219/424 (recall=0.516509) with average error=1.91889
[SIFT_MY] average size ratio between matched points: 0.957992
[SIFT_MY] average angle difference between matched points: 2.96179 degrees
[SIFT_MY] average descriptor distance between matched points: 0.711257 (random distance: 1.03086) => differentiability=0.689962
[       OK ] SIFT.Scale50 (284 ms)
[ RUN      ] SIFT.Scale70
[ORB_OCV] Points detected: 500 -> 500 (in 0.008551 sec)
[ORB_OCV] 488/500 (recall=0.976) with average error=0.902066
[ORB_OCV] average size ratio between matched points: 0.884398
[ORB_OCV] average angle difference between matched points: 1.14689 degrees
[ORB_OCV] average descriptor distance between matched points: 70.2889 (random distance: 124.695) => differentiability=0.563688
[SIFTOCV] Points detected: 453 -> 335 (in 0.07393 sec)
[SIFTOCV] 307/453 (recall=0.677704) with average error=1.1649
[SIFTOCV] average size ratio between matched points: 0.92551
[SIFTOCV] average angle difference between matched points: -8.88537 degrees
[SIFTOCV] average descriptor distance between matched points: 272.272 (random distance: 530.603) => differentiability=0.513138
[SIFT_MY] Points detected: 424 -> 318 (in 0.146053 sec)
[SIFT_MY] 291/424 (recall=0.686321) with average error=1.22699
[SIFT_MY] average size ratio between matched points: 0.967551
[SIFT_MY] average angle difference between matched points: -5.74811 degrees
[SIFT_MY] average descriptor distance between matched points: 0.540313 (random distance: 1.03003) => differentiability=0.524559
[       OK ] SIFT.Scale70 (299 ms)
[ RUN      ] SIFT.Scale90
[ORB_OCV] Points detected: 500 -> 500 (in 0.008754 sec)
[ORB_OCV] 489/500 (recall=0.978) with average error=0.823308
[ORB_OCV] average size ratio between matched points: 0.970324
[ORB_OCV] average angle difference between matched points: -0.183516 degrees
[ORB_OCV] average descriptor distance between matched points: 60.3333 (random distance: 125.059) => differentiability=0.482438
[SIFTOCV] Points detected: 453 -> 469 (in 0.076048 sec)
[SIFTOCV] 354/453 (recall=0.781457) with average error=0.59984
[SIFTOCV] average size ratio between matched points: 1.00052
[SIFTOCV] average angle difference between matched points: -4.5203 degrees
[SIFTOCV] average descriptor distance between matched points: 193.204 (random distance: 523.29) => differentiability=0.369209
[SIFT_MY] Points detected: 424 -> 431 (in 0.163474 sec)
[SIFT_MY] 336/424 (recall=0.792453) with average error=0.643454
[SIFT_MY] average size ratio between matched points: 0.99799
[SIFT_MY] average angle difference between matched points: -4.59535 degrees
[SIFT_MY] average descriptor distance between matched points: 0.401302 (random distance: 1.01321) => differentiability=0.39607
[       OK ] SIFT.Scale90 (318 ms)
[ RUN      ] SIFT.Scale110
[ORB_OCV] Points detected: 500 -> 500 (in 0.009184 sec)
[ORB_OCV] 462/500 (recall=0.924) with average error=0.912118
[ORB_OCV] average size ratio between matched points: 1.02967
[ORB_OCV] average angle difference between matched points: -0.905967 degrees
[ORB_OCV] average descriptor distance between matched points: 59.7468 (random distance: 125.225) => differentiability=0.477115
[SIFTOCV] Points detected: 453 -> 500 (in 0.076903 sec)
[SIFTOCV] 307/434 (recall=0.707373) with average error=0.561683
[SIFTOCV] average size ratio between matched points: 1.15716
[SIFTOCV] average angle difference between matched points: 1.13854 degrees
[SIFTOCV] average descriptor distance between matched points: 182.143 (random distance: 530.492) => differentiability=0.343347
[SIFT_MY] Points detected: 424 -> 500 (in 0.176124 sec)
[SIFT_MY] 306/421 (recall=0.726841) with average error=0.571297
[SIFT_MY] average size ratio between matched points: 1.15427
[SIFT_MY] average angle difference between matched points: -6.28809 degrees
[SIFT_MY] average descriptor distance between matched points: 0.408787 (random distance: 1.01532) => differentiability=0.402617
[       OK ] SIFT.Scale110 (333 ms)
[ RUN      ] SIFT.Scale130
[ORB_OCV] Points detected: 500 -> 500 (in 0.008836 sec)
[ORB_OCV] 400/475 (recall=0.842105) with average error=1.02537
[ORB_OCV] average size ratio between matched points: 1.10237
[ORB_OCV] average angle difference between matched points: -4.78444 degrees
[ORB_OCV] average descriptor distance between matched points: 67.4875 (random distance: 126.4) => differentiability=0.53392
[SIFTOCV] Points detected: 453 -> 500 (in 0.07893 sec)
[SIFTOCV] 253/409 (recall=0.618582) with average error=0.533529
[SIFTOCV] average size ratio between matched points: 1.37601
[SIFTOCV] average angle difference between matched points: -2.24977 degrees
[SIFTOCV] average descriptor distance between matched points: 175.173 (random distance: 529.43) => differentiability=0.33087
[SIFT_MY] Points detected: 424 -> 500 (in 0.176081 sec)
[SIFT_MY] 249/402 (recall=0.619403) with average error=0.499565
[SIFT_MY] average size ratio between matched points: 1.37199
[SIFT_MY] average angle difference between matched points: -2.76079 degrees
[SIFT_MY] average descriptor distance between matched points: 0.355028 (random distance: 1.04331) => differentiability=0.340291
[       OK ] SIFT.Scale130 (337 ms)
[ RUN      ] SIFT.Scale150
[ORB_OCV] Points detected: 500 -> 500 (in 0.008953 sec)
[ORB_OCV] 325/445 (recall=0.730337) with average error=1.18695
[ORB_OCV] average size ratio between matched points: 1.16446
[ORB_OCV] average angle difference between matched points: -1.92861 degrees
[ORB_OCV] average descriptor distance between matched points: 75.4954 (random distance: 125.905) => differentiability=0.599624
[SIFTOCV] Points detected: 453 -> 500 (in 0.077111 sec)
[SIFTOCV] 208/387 (recall=0.537468) with average error=0.519869
[SIFTOCV] average size ratio between matched points: 1.56537
[SIFTOCV] average angle difference between matched points: 2.7434 degrees
[SIFTOCV] average descriptor distance between matched points: 178.951 (random distance: 530.33) => differentiability=0.337433
[SIFT_MY] Points detected: 424 -> 500 (in 0.176502 sec)
[SIFT_MY] 197/380 (recall=0.518421) with average error=0.486818
[SIFT_MY] average size ratio between matched points: 1.55124
[SIFT_MY] average angle difference between matched points: -5.84665 degrees
[SIFT_MY] average descriptor distance between matched points: 0.374526 (random distance: 1.02143) => differentiability=0.366669
[       OK ] SIFT.Scale150 (335 ms)
[ RUN      ] SIFT.Scale175
[ORB_OCV] Points detected: 500 -> 500 (in 0.008957 sec)
[ORB_OCV] 235/380 (recall=0.618421) with average error=1.3217
[ORB_OCV] average size ratio between matched points: 1.25586
[ORB_OCV] average angle difference between matched points: 4.13008 degrees
[ORB_OCV] average descriptor distance between matched points: 84.1617 (random distance: 124.894) => differentiability=0.673867
[SIFTOCV] Points detected: 453 -> 501 (in 0.077711 sec)
[SIFTOCV] 189/354 (recall=0.533898) with average error=0.530545
[SIFTOCV] average size ratio between matched points: 1.79649
[SIFTOCV] average angle difference between matched points: -2.33097 degrees
[SIFTOCV] average descriptor distance between matched points: 182.373 (random distance: 522.122) => differentiability=0.349291
[SIFT_MY] Points detected: 424 -> 500 (in 0.177488 sec)
[SIFT_MY] 172/351 (recall=0.490028) with average error=0.548055
[SIFT_MY] average size ratio between matched points: 1.78473
[SIFT_MY] average angle difference between matched points: 0.437277 degrees
[SIFT_MY] average descriptor distance between matched points: 0.423349 (random distance: 1.03408) => differentiability=0.409395
[       OK ] SIFT.Scale175 (338 ms)
[ RUN      ] SIFT.Scale200
[ORB_OCV] Points detected: 500 -> 500 (in 0.009064 sec)
[ORB_OCV] 174/333 (recall=0.522523) with average error=1.36043
[ORB_OCV] average size ratio between matched points: 1.34374
[ORB_OCV] average angle difference between matched points: -3.78969 degrees
[ORB_OCV] average descriptor distance between matched points: 86.1954 (random distance: 126.011) => differentiability=0.684028
[SIFTOCV] Points detected: 453 -> 500 (in 0.07804 sec)
[SIFTOCV] 178/324 (recall=0.549383) with average error=0.536323
[SIFTOCV] average size ratio between matched points: 2.03968
[SIFTOCV] average angle difference between matched points: -1.02503 degrees
[SIFTOCV] average descriptor distance between matched points: 167.42 (random distance: 528.219) => differentiability=0.316952
[SIFT_MY] Points detected: 424 -> 500 (in 0.17969 sec)
[SIFT_MY] 159/320 (recall=0.496875) with average error=0.54493
[SIFT_MY] average size ratio between matched points: 2.02543
[SIFT_MY] average angle difference between matched points: -11.7673 degrees
[SIFT_MY] average descriptor distance between matched points: 0.308293 (random distance: 1.02753) => differentiability=0.300034
[       OK ] SIFT.Scale200 (341 ms)
[ RUN      ] SIFT.Rotate10Scale90
[ORB_OCV] Points detected: 500 -> 500 (in 0.008827 sec)
[ORB_OCV] 486/500 (recall=0.972) with average error=0.862656
[ORB_OCV] average size ratio between matched points: 1.00909
[ORB_OCV] average angle difference between matched points: 12.1602 degrees
[ORB_OCV] average descriptor distance between matched points: 61.9033 (random distance: 126.477) => differentiability=0.489442
[SIFTOCV] Points detected: 453 -> 464 (in 0.075423 sec)
[SIFTOCV] 351/453 (recall=0.774834) with average error=0.660494
[SIFTOCV] average size ratio between matched points: 0.970697
[SIFTOCV] average angle difference between matched points: 0.36928 degrees
[SIFTOCV] average descriptor distance between matched points: 210.278 (random distance: 528.178) => differentiability=0.39812
[SIFT_MY] Points detected: 424 -> 428 (in 0.162155 sec)
[SIFT_MY] 325/424 (recall=0.766509) with average error=0.622443
[SIFT_MY] average size ratio between matched points: 0.966647
[SIFT_MY] average angle difference between matched points: -0.792507 degrees
[SIFT_MY] average descriptor distance between matched points: 0.427394 (random distance: 1.02683) => differentiability=0.416226
[       OK ] SIFT.Rotate10Scale90 (317 ms)
[ RUN      ] SIFT.Rotate30Scale75
[ORB_OCV] Points detected: 500 -> 500 (in 0.008666 sec)
[ORB_OCV] 471/500 (recall=0.942) with average error=0.873322
[ORB_OCV] average size ratio between matched points: 0.882831
[ORB_OCV] average angle difference between matched points: 32.7295 degrees
[ORB_OCV] average descriptor distance between matched points: 68.9915 (random distance: 123.987) => differentiability=0.55644
[SIFTOCV] Points detected: 453 -> 373 (in 0.075172 sec)
[SIFTOCV] 318/453 (recall=0.701987) with average error=0.961622
[SIFTOCV] average size ratio between matched points: 0.958296
[SIFTOCV] average angle difference between matched points: 6.75176 degrees
[SIFTOCV] average descriptor distance between matched points: 241.741 (random distance: 528.552) => differentiability=0.457364
[SIFT_MY] Points detected: 424 -> 356 (in 0.151592 sec)
[SIFT_MY] 298/424 (recall=0.70283) with average error=1.02689
[SIFT_MY] average size ratio between matched points: 1.0085
[SIFT_MY] average angle difference between matched points: 4.32864 degrees
[SIFT_MY] average descriptor distance between matched points: 0.492526 (random distance: 1.04031) => differentiability=0.473441
[       OK ] SIFT.Rotate30Scale75 (306 ms)
[ RUN      ] SIFT.HerzJesu19RotateM40
[ORB_OCV] Points detected: 500 -> 500 (in 0.089638 sec)
[ORB_OCV] 494/500 (recall=0.988) with average error=1.25431
[ORB_OCV] average size ratio between matched points: 1.00708
[ORB_OCV] average angle difference between matched points: -36.7101 degrees
[ORB_OCV] average descriptor distance between matched points: 48.3603 (random distance: 121.69) => differentiability=0.397405
[SIFTOCV] Points detected: 500 -> 500 (in 2.93431 sec)
[SIFTOCV] 377/435 (recall=0.866667) with average error=2.85298
[SIFTOCV] average size ratio between matched points: 1.00886
[SIFTOCV] average angle difference between matched points: -16.179 degrees
[SIFTOCV] average descriptor distance between matched points: 212.589 (random distance: 537.412) => differentiability=0.395579
[SIFT_MY] Points detected: 500 -> 500 (in 2.84126 sec)
[SIFT_MY] 395/471 (recall=0.838641) with average error=3.23898
[SIFT_MY] average size ratio between matched points: 1.08314
[SIFT_MY] average angle difference between matched points: -17.5117 degrees
[SIFT_MY] average descriptor distance between matched points: 0.427726 (random distance: 1.02863) => differentiability=0.41582
[       OK ] SIFT.HerzJesu19RotateM40 (7680 ms)
[ RUN      ] SIFT.DetectionSmokeTest
upscaled image from 768x1024 to 1536x2048
new octave base size: 768
new octave base size: 384
new octave base size: 192
new octave base size: 96
new octave base size: 48
new octave base size: 24
new octave base size: 12
saving octave 0
saving octave 1
saving octave 2
saving octave 3
saving octave 4
saving octave 5
saving octave 6
saving octave 7
saving octave 0
saving octave 1
saving octave 2
saving octave 3
saving octave 4
saving octave 5
saving octave 6
saving octave 7
octave 0: 2979 keypoints so far
octave 1: 3842 keypoints so far
octave 2: 4001 keypoints so far
octave 3: 4032 keypoints so far
octave 4: 4056 keypoints so far
octave 5: 4063 keypoints so far
octave 6: 4065 keypoints so far
octave 7: 4065 keypoints so far
total keypoints: 4065
orientations: 4065 -> 4844 keypoints
descriptors: 4844 -> 4754 keypoints (some discarded due to border)
[       OK ] SIFT.DetectionSmokeTest (3197 ms)
[ RUN      ] SIFT.DetectionDescriptionSteps
loaded image of size: [384 x 512]
[  CHECK  ] buildOctaves: matched reference step1_octaves.yml.gz
[  CHECK  ] buildDoG: matched reference step2_dog.yml.gz
[  MATCH  ] findScaleSpaceExtrema: 191/191 matched (100%), ref count=191
detected n keypoints: 191
[  MATCH  ] selectTopKeypoints_1: 191/191 matched (100%), ref count=191
selected n keypoints: 191
[  MATCH  ] computeOrientations: 202/202 matched (100%), ref count=202
oriented n keypoints: 202
[  MATCH  ] selectTopKeypoints_2: 202/202 matched (100%), ref count=202
selected n keypoints: 202
[  MATCH  ] computeDescriptors: 182/182 matched (100%), ref count=182 [with descriptors]
described n keypoints: 182
[       OK ] SIFT.DetectionDescriptionSteps (901 ms)
[ RUN      ] SIFT.PairMatching
image sizes: [1536 x 2048], [1536 x 2048]
matching using opencv orb...
N keypoints: left 10000, right 10000
Good matches:       352
Inlier matches:     242
matching using opencv sift...
N keypoints: left 7288, right 6398
Good matches:       1285
Inlier matches:     1172
matching using my sift...
N keypoints: left 7241, right 6277
Good matches:       1179
Inlier matches:     1067
Final score: 1067
[       OK ] SIFT.PairMatching (6526 ms)
[----------] 25 tests from SIFT (25143 ms total)

[----------] Global test environment tear-down
[==========] 25 tests from 1 test suite ran. (25143 ms total)
[  PASSED  ] 25 tests.

Как же я устал всё это писать...😢

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.

1 participant