Skip to content

Task01 Syrma Timur ITMO#132

Closed
timursyrma wants to merge 1 commit into
PhotogrammetryCourse:task01from
timursyrma:task01
Closed

Task01 Syrma Timur ITMO#132
timursyrma wants to merge 1 commit into
PhotogrammetryCourse:task01from
timursyrma:task01

Conversation

@timursyrma

Copy link
Copy Markdown

1. SIFT определяет ориентацию голосованием в гистограмму — из-за дискретности бинов и сглаживания ошибка в несколько градусов неизбежна. При PEAK_RATIO=0.999 вторичные пики почти полностью срезаются: на точку остаётся один пик, двойников меньше, средний угол выходит точнее. Но точек становится меньше, recall падает.

2. Запускаем тест с OMP_NUM_THREADS=1 и с OMP_NUM_THREADS=8, делим времена. Hyperthreading для такого кода почти не помогает, поэтому ускорение примерно равно числу физических ядер — на 8-ядернике обычно выходит ~6–7x.

3. Можно, и мы именно так и сделали. Свёртка гауссиан складывается: G(σ1) * G(σ2) = G(√(σ1²+σ2²)), поэтому блюр из layers[0] с нужной инкрементальной сигмой даёт тот же результат. Пирамиды совпадают визуально. Доблюривать предыдущий слой быстрее — ядро свёртки меньше — но это оптимизация, не обязательное условие.

4. Слой s октавы o и слой 0 октавы o+1 должны выглядеть одинаково: у обоих σ = 2·σ0 в исходных координатах. Проверка: апскейлить o+1 в два раза, вычесть из слоя s октавы o — разность близка к нулю.

5. DoG-слоёв нужно s+2 (чтобы у внутренних слоёв 1..s был сосед с обеих сторон). Каждый DoG — это разность двух гауссиан, значит гауссиан нужно на одну больше: s+3.

6. Плоские области — почти ноль. Края — яркие полосы со сменой знака. С ростом масштаба мелкие детали исчезают. Максимумы и минимумы должны встречаться примерно поровну.

7. При большем s соседние слои ближе по масштабу, DoG-значения слабее. Чтобы не потерять реальные точки, порог делят на s: thresh = contrast_threshold / s.

8. Эти две строки:

float sigma_win = 1.5f * kp_sigma_octave;
int radius = (int)std::round(3.f * sigma_win);

sigma_win — 1.5× сигма точки (Lowe так и пишет). radius = 3σ — дальше этого вес гауссиана уже ничтожен.

9. Вот эта строка:

float angle_invariant = angle - kp_angle_rad;

Вычитаем ориентацию точки из угла каждого градиента — всё переходит в локальную систему координат. Плюс сама сетка патча тоже поворачивается:

float rot_x = (cos_a * dx + sin_a * dy) / spatial_bin_width;
float rot_y = (-sin_a * dx + cos_a * dy) / spatial_bin_width;

@simiyutin

Copy link
Copy Markdown
Contributor

Задача зачтена, 7/10 баллов (штраф за пропуск дедлайна) 👍

@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