Skip to content

Task01 Леонид Тернопол СПбГУ#6

Open
firelion9 wants to merge 1 commit intoPhotogrammetryCourse:task01from
firelion9:task01
Open

Task01 Леонид Тернопол СПбГУ#6
firelion9 wants to merge 1 commit intoPhotogrammetryCourse:task01from
firelion9:task01

Conversation

@firelion9
Copy link

@firelion9 firelion9 commented Feb 26, 2026

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

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

  2. Как надежно замерить во сколько раз распараллеливание через OpenMP ускоряет ваш вариант SIFT? Попробуйте сделать это на вашем компьютере, какое ускорение относительно однопоточной версии оказалось? Сколько у вашего процессора ядер и сколько потоков?
    Нужно замерить время выполнения интересующего нас куска кода в 2 вариантах (с openmp и без). Каждый замер нужно провести многократно и взять минимальное время. Входная картинка должна быть достаточно большой, чтобы накладные расходы на openmp не перевешивали ускорение от него.
    С расставленными за пару минут прагмами omp (без оптимизаций с локальными кешами, omp critical на всех push_back) получилось ускорить полный цикл обработки на 20% (5.2 c -> 4.1 c) на картинках, что были в репозитории (8 ядер, 16 потоков). Вероятно omp можно применить более разумно

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

  4. Какие ожидания от картинок в Gaussian пирамиде можно придумать? Как проверить что работает корректно? С какой другой картинкой предыдущей октавы должна визуально совпадать конкретная картинка конкретной октавы? Как их визуально сравнить, ведь они разного размера?
    Должно получаться размытие при увеличении слоя и октавы. В рамках 1 октавы идёт размытие по Гауссу и на слое s (в терминах реализации), то есть на 3 с конца, sigma=2. Это примерно соответствует даунсемплингу в 2 раза (по каждой стороне), что соответствует первому слою следующей октавы (перед сравнением мы обратно апскейлим картинку). Следующие 2 картинки тоже будут примерно совпадать со 2 и 3 из следующей октавы

  5. Почему в октаве Gaussian пирамиды s+3 картинки а не s+2 например?
    Потому что мы хотим посчитать попарные разницы между соседними слоями (+1) и получить s слоёв, у которых будут оба соседа (+2). 1+2 = 3 != 2

  6. Какие ожидания от картинок в DoG пирамиде можно придумать?
    В первых октавах там должны быть контуры. Далее пятна в местах, где были объекты

  7. Почему порог контрастности должен уменьшаться при увеличении числа слоев в октаве?
    Потому что суммарное изменение контрастности от первого слоя к s-му -- константа (по модулю погрешностей). Соответственно при увеличении количества слоёв пропорционально уменьшается разница между соседними

  8. Какая строка ответственна за определение сигмы (или что почти то же самое - радиуса) которая задает окрестность по которой определяется ориентация ключевой точки?
    float kp_sigma_octave = (float)(sigma0 * std::pow(2.0, (double)layer / s));

  9. За какой строки вашего кода дескриптор инвариантен к повороту картинки?
    float angle_invariant = angle - kp_angle_rad; -- углы считаются в локальной системе координат, повёрнутой в сторону (одного из) наиболее частых градиентов в окрестности ключевой точки

  10. Всегда ли мы получаем ровно столько точек сколько запросили в параметре nfeatures? Как подкрутить алгоритм, чтобы всегда выдавать ровно запрошенное количество точек (когда это в принципе возможно) но не сильно просесть в производительности?
    Может получиться меньше, если мы не найдём достаточно хороших точек на картинке. Чтобы адаптироваться к такой ситуации, можно динамически подкручивать пороги обнаружения точек. Например, не отбрасывать недостаточно зацепистые точки сразу, а хранить их в куче размера nfeatures и выбрасывать, когда появляется много более зацепистых (замедление вставки в (log nfeatures) раз, но потом не нужно будет делать частичную сортировку)

Github Actions CI

Run ./build/test_sift
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.01282 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.098332 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: 417 -> 441 (in 0.203381 sec)
[SIFT_MY] 401/417 (recall=0.961631) with average error=0.0445644
[SIFT_MY] average size ratio between matched points: 1.00329
[SIFT_MY] average angle difference between matched points: -8.53021 degrees
[SIFT_MY] average descriptor distance between matched points: 0.163625 (random distance: 1.02133) => differentiability=0.160208
[       OK ] SIFT.MovedTheSameImage (396 ms)
[ RUN      ] SIFT.MovedImageRight
[ORB_OCV] Points detected: 500 -> 500 (in 0.010844 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.082627 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: 417 -> 433 (in 0.190852 sec)
[SIFT_MY] 398/416 (recall=0.956731) with average error=0.066903
[SIFT_MY] average size ratio between matched points: 1.00401
[SIFT_MY] average angle difference between matched points: -7.98667 degrees
[SIFT_MY] average descriptor distance between matched points: 0.166575 (random distance: 1.03528) => differentiability=0.160899
[       OK ] SIFT.MovedImageRight (359 ms)
[ RUN      ] SIFT.MovedImageLeft
[ORB_OCV] Points detected: 500 -> 500 (in 0.010921 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
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: 3155 keypoints so far
octave 1: 4077 keypoints so far
octave 2: 4246 keypoints so far
octave 3: 4279 keypoints so far
octave 4: 4300 keypoints so far
octave 5: 4307 keypoints so far
octave 6: 4309 keypoints so far
octave 7: 4309 keypoints so far
total keypoints: 4309
orientations: 4309 -> 5163 keypoints
descriptors: 5163 -> 5075 keypoints (some discarded due to border)
[       OK ] SIFT.DetectionSmokeTest (3502 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: 190/197 matched (96.4467%), ref count=191
detected n keypoints: 197
[  MATCH  ] selectTopKeypoints_1: 190/197 matched (96.4467%), ref count=191
selected n keypoints: 197
[  MATCH  ] computeOrientations: 200/207 matched (96.6184%), ref count=202
oriented n keypoints: 207
[  MATCH  ] selectTopKeypoints_2: 200/207 matched (96.6184%), ref count=202
selected n keypoints: 207
[  MATCH  ] computeDescriptors: 181/188 matched (96.2766%), ref count=182 [with descriptors]
described n keypoints: 188
[       OK ] SIFT.DetectionDescriptionSteps (940 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 7385, right 6243
Good matches:       1103
Inlier matches:     1009
Final score: 1009
[       OK ] SIFT.PairMatching (7053 ms)
[----------] 25 tests from SIFT (27314 ms total)

[----------] Global test environment tear-down
[==========] 25 tests from 1 test suite ran. (27314 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